INT-4108: Fix idempotency for some Lifecycles
JIRA: https://jira.spring.io/browse/INT-4108 Some `Lifecycle.start()/stop()` usage doesn't ensure robustness for components causing unexpected and difficulty tracing issues * Fix `Lifecycle.start()/stop()` for `FileReadingMessageSource`, `FileWritingMessageHandler`, `AbstractMqttMessageHandler` * In the `DefaultHeaderChannelRegistry`, `LockRegistryLeaderInitiator`, `MqttPahoMessageHandler` rework logic for shared variables to avoid `NPE` * Increase receive timeouts in the `PayloadDeserializingTransformerParserTests` and `UdpChannelAdapterTests` * Prove with the `WatchServiceDirectoryScannerTests` changes that several invocation for `FileReadingMessageSource.start()` are idempotent **Cherry-pick to 4.3.x**
This commit is contained in:
@@ -41,6 +41,7 @@ import org.springframework.util.Assert;
|
||||
* The actual average expiry time will be 1.5x the delay.
|
||||
*
|
||||
* @author Gary Russell
|
||||
* @author Artem Bilan
|
||||
* @since 3.0
|
||||
*
|
||||
*/
|
||||
@@ -135,6 +136,7 @@ public class DefaultHeaderChannelRegistry extends IntegrationObjectSupport
|
||||
this.running = false;
|
||||
if (this.reaperScheduledFuture != null) {
|
||||
this.reaperScheduledFuture.cancel(true);
|
||||
this.reaperScheduledFuture = null;
|
||||
}
|
||||
this.explicitlyStopped = true;
|
||||
}
|
||||
@@ -198,6 +200,7 @@ public class DefaultHeaderChannelRegistry extends IntegrationObjectSupport
|
||||
public synchronized void runReaper() {
|
||||
if (this.reaperScheduledFuture != null) {
|
||||
this.reaperScheduledFuture.cancel(true);
|
||||
this.reaperScheduledFuture = null;
|
||||
}
|
||||
this.run();
|
||||
}
|
||||
|
||||
@@ -54,6 +54,7 @@ import org.springframework.util.Assert;
|
||||
* be useful.
|
||||
*
|
||||
* @author Dave Syer
|
||||
* @author Artem Bilan
|
||||
* @since 4.3.1
|
||||
*/
|
||||
public class LockRegistryLeaderInitiator implements SmartLifecycle, DisposableBean, ApplicationEventPublisherAware {
|
||||
@@ -277,7 +278,10 @@ public class LockRegistryLeaderInitiator implements SmartLifecycle, DisposableBe
|
||||
synchronized (this.lifecycleMonitor) {
|
||||
if (this.running) {
|
||||
this.running = false;
|
||||
this.future.cancel(true);
|
||||
if (this.future != null) {
|
||||
this.future.cancel(true);
|
||||
}
|
||||
this.future = null;
|
||||
logger.debug("Stopped LeaderInitiator");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2010 the original author or authors.
|
||||
* Copyright 2002-2016 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -65,7 +65,7 @@ public class PayloadDeserializingTransformerParserTests {
|
||||
public void directChannelWithSerializedStringMessage() throws Exception {
|
||||
byte[] bytes = serialize("foo");
|
||||
directInput.send(new GenericMessage<byte[]>(bytes));
|
||||
Message<?> result = output.receive(0);
|
||||
Message<?> result = output.receive(10000);
|
||||
assertNotNull(result);
|
||||
assertTrue(result.getPayload() instanceof String);
|
||||
assertEquals("foo", result.getPayload());
|
||||
@@ -75,7 +75,7 @@ public class PayloadDeserializingTransformerParserTests {
|
||||
public void queueChannelWithSerializedStringMessage() throws Exception {
|
||||
byte[] bytes = serialize("foo");
|
||||
queueInput.send(new GenericMessage<byte[]>(bytes));
|
||||
Message<?> result = output.receive(3000);
|
||||
Message<?> result = output.receive(10000);
|
||||
assertNotNull(result);
|
||||
assertTrue(result.getPayload() instanceof String);
|
||||
assertEquals("foo", result.getPayload());
|
||||
@@ -85,7 +85,7 @@ public class PayloadDeserializingTransformerParserTests {
|
||||
public void directChannelWithSerializedObjectMessage() throws Exception {
|
||||
byte[] bytes = serialize(new TestBean());
|
||||
directInput.send(new GenericMessage<byte[]>(bytes));
|
||||
Message<?> result = output.receive(0);
|
||||
Message<?> result = output.receive(10000);
|
||||
assertNotNull(result);
|
||||
assertEquals(TestBean.class, result.getPayload().getClass());
|
||||
assertEquals("test", ((TestBean) result.getPayload()).name);
|
||||
@@ -95,7 +95,7 @@ public class PayloadDeserializingTransformerParserTests {
|
||||
public void queueChannelWithSerializedObjectMessage() throws Exception {
|
||||
byte[] bytes = serialize(new TestBean());
|
||||
queueInput.send(new GenericMessage<byte[]>(bytes));
|
||||
Message<?> result = output.receive(3000);
|
||||
Message<?> result = output.receive(10000);
|
||||
assertNotNull(result);
|
||||
assertEquals(TestBean.class, result.getPayload().getClass());
|
||||
assertEquals("test", ((TestBean) result.getPayload()).name);
|
||||
@@ -110,7 +110,7 @@ public class PayloadDeserializingTransformerParserTests {
|
||||
@Test
|
||||
public void customDeserializer() throws Exception {
|
||||
customDeserializerInput.send(new GenericMessage<byte[]>("test".getBytes("UTF-8")));
|
||||
Message<?> result = output.receive(3000);
|
||||
Message<?> result = output.receive(10000);
|
||||
assertNotNull(result);
|
||||
assertEquals(String.class, result.getPayload().getClass());
|
||||
assertEquals("TEST", result.getPayload());
|
||||
@@ -138,6 +138,7 @@ public class PayloadDeserializingTransformerParserTests {
|
||||
public Object deserialize(InputStream source) throws IOException {
|
||||
return FileCopyUtils.copyToString(new InputStreamReader(source, "UTF-8")).toUpperCase();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user