Skip to content

Commit 8894599

Browse files
artembilangaryrussell
authored andcommitted
Remove dependant beans recursively
https://build.spring.io/browse/INT-MASTER-1058/ When we destroy manually registered `IntegrationFlow`, we need to count with sub-flows and iterate all the dependant beans recursively for full flow removal **Cherry-pick to 5.0.x**
1 parent ba962fc commit 8894599

File tree

2 files changed

+25
-16
lines changed

2 files changed

+25
-16
lines changed

spring-integration-core/src/main/java/org/springframework/integration/dsl/context/IntegrationFlowContext.java

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
package org.springframework.integration.dsl.context;
1818

19-
import java.util.Arrays;
2019
import java.util.Collections;
2120
import java.util.HashMap;
2221
import java.util.Map;
@@ -77,6 +76,8 @@ public final class IntegrationFlowContext implements BeanFactoryAware {
7776

7877
private ConfigurableListableBeanFactory beanFactory;
7978

79+
private BeanDefinitionRegistry beanDefinitionRegistry;
80+
8081
private IntegrationFlowContext() {
8182
}
8283

@@ -87,6 +88,7 @@ public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
8788
"'ConfigurableListableBeanFactory'. " +
8889
"Consider using 'GenericApplicationContext' implementation.");
8990
this.beanFactory = (ConfigurableListableBeanFactory) beanFactory;
91+
this.beanDefinitionRegistry = (BeanDefinitionRegistry) this.beanFactory;
9092
}
9193

9294
/**
@@ -184,24 +186,29 @@ public void remove(String flowId) {
184186
IntegrationFlowRegistration flowRegistration = this.registry.remove(flowId);
185187
flowRegistration.stop();
186188

187-
BeanDefinitionRegistry beanDefinitionRegistry = (BeanDefinitionRegistry) this.beanFactory;
188-
189-
Arrays.stream(this.beanFactory.getDependentBeans(flowId))
190-
.forEach(beanName -> {
191-
beanDefinitionRegistry.removeBeanDefinition(beanName);
192-
// TODO until https://jira.spring.io/browse/SPR-16837
193-
Arrays.asList(beanDefinitionRegistry.getAliases(beanName))
194-
.forEach(beanDefinitionRegistry::removeAlias);
195-
});
189+
removeDependantBeans(flowId);
196190

197-
beanDefinitionRegistry.removeBeanDefinition(flowId);
191+
this.beanDefinitionRegistry.removeBeanDefinition(flowId);
198192
}
199193
else {
200194
throw new IllegalStateException("An IntegrationFlow with the id "
201195
+ "[" + flowId + "] doesn't exist in the registry.");
202196
}
203197
}
204198

199+
private void removeDependantBeans(String parentName) {
200+
String[] dependentBeans = this.beanFactory.getDependentBeans(parentName);
201+
for (String beanName : dependentBeans) {
202+
removeDependantBeans(beanName);
203+
this.beanDefinitionRegistry.removeBeanDefinition(beanName);
204+
// TODO until https://jira.spring.io/browse/SPR-16837
205+
String[] aliases = this.beanDefinitionRegistry.getAliases(beanName);
206+
for (String alias : aliases) {
207+
this.beanDefinitionRegistry.removeAlias(alias);
208+
}
209+
}
210+
}
211+
205212
/**
206213
* Obtain a {@link MessagingTemplate} with its default destination set to the input channel
207214
* of the {@link IntegrationFlow} for provided {@code flowId}.
@@ -249,7 +256,7 @@ private String generateBeanName(Object instance, String parentName) {
249256
*/
250257
public final class IntegrationFlowRegistrationBuilder {
251258

252-
private Map<Object, String> additionalBeans = new HashMap<>();
259+
private final Map<Object, String> additionalBeans = new HashMap<>();
253260

254261
private final IntegrationFlowRegistration integrationFlowRegistration;
255262

spring-integration-core/src/test/java/org/springframework/integration/dsl/manualflow/ManualFlowTests.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,11 @@
2828
import static org.junit.Assert.assertTrue;
2929
import static org.junit.Assert.fail;
3030

31-
import java.util.ArrayList;
3231
import java.util.Arrays;
3332
import java.util.Date;
3433
import java.util.List;
3534
import java.util.Objects;
35+
import java.util.concurrent.CopyOnWriteArrayList;
3636
import java.util.concurrent.ExecutorService;
3737
import java.util.concurrent.Executors;
3838
import java.util.concurrent.TimeUnit;
@@ -392,7 +392,7 @@ public void testRoleControl() {
392392
assertTrue(this.roleController.getEndpointsRunningStatus(testRole).isEmpty());
393393
}
394394

395-
// @Test
395+
@Test
396396
public void testDynamicSubFlowCreation() {
397397
Flux<Message<?>> messageFlux =
398398
Flux.just("1,2,3,4")
@@ -414,7 +414,9 @@ public void testDynamicSubFlowCreation() {
414414
.get();
415415

416416
IntegrationFlowRegistration flowRegistration =
417-
this.integrationFlowContext.registration(integrationFlow).register();
417+
this.integrationFlowContext.registration(integrationFlow)
418+
.id("dynamicSubFlows")
419+
.register();
418420

419421
for (int i = 0; i < 4; i++) {
420422
Message<?> receive = resultChannel.receive(10_000);
@@ -458,7 +460,7 @@ public void testRegistrationDuplicationRejected() {
458460
public void testConcurrentRegistration() throws InterruptedException {
459461
ExecutorService executorService = Executors.newCachedThreadPool();
460462

461-
List<IntegrationFlowRegistration> flowRegistrations = new ArrayList<>();
463+
List<IntegrationFlowRegistration> flowRegistrations = new CopyOnWriteArrayList<>();
462464

463465
AtomicBoolean exceptionHappened = new AtomicBoolean();
464466

0 commit comments

Comments
 (0)