我需要将一些遗留代码移植到基于spring集成的应用程序中。我决定通过@InboundChannelAdapter注释配置入站通道适配器,该注释按预期工作。
问题是,当调用入站通道适配器的start()和stop()方法时,我需要执行一些代码。
我试图通过实现SmartLifecycle接口来实现这一点,但这并没有给我带来任何帮助。有谁有其他建议我应该试试吗?我现在有点卡住了..。
编辑:代码示例
@MessageEndpoint
@Component
public class InputSource implements SmartLifecycle {
public void start() {
//my code to be executed
}
public void stop() {
//my code
}
@InboundChannelAdapter("some.channel")
public Message<?> read() {
//my code that returns a message
}
}在启动入站通道适配器时,将调用read()方法中的代码,但在创建上下文时不会调用start()。
发布于 2014-12-01 17:18:04
什么版本的Spring集成?这对我来说很好用4.1.0。
@EnableIntegration
@MessageEndpoint
@Component
public class InputSource implements SmartLifecycle {
private boolean running;
@Override
public void start() {
System.out.println("start");
running = true;
}
@Override
public void stop() {
running = false;
}
@InboundChannelAdapter(value = "toRabbit", poller = @Poller(fixedDelay = "5000", maxMessagesPerPoll = "1"))
public Message<?> read() {
return new GenericMessage<String>("foo");
}
@Override
public boolean isRunning() {
return running;
}
@Override
public int getPhase() {
return 0;
}
@Override
public boolean isAutoStartup() {
return true;
}
@Override
public void stop(Runnable callback) {
stop();
callback.run();
}
}(即使没有@EnableIntegration,start()方法也会被调用)。
无论如何,请记住,这里的start/stop位于不同的bean ( InputSource)上,而适配器上的start/stop位于它的SourcePollingChannelAdapter上。您可以使用phase控制订单。
编辑:
根据下面的注释,您希望适配器启动其源。即使我们这么做了..。
if (this.source implements Lifecycle) {
((Lifecycle) source).start();
}...it在这里不能工作,因为源不是您的组件,它是一个对bean的其余部分一无所知的MethodInvokingMessageSource,它只知道read()方法。
一种解决方法是子类SourcePollingChannelAdapter并重写它的doStart()方法.
@Override // guarded by super#lifecycleLock
protected void doStart() {
myInputSource.start();
super.doStart();
}您必须手动连接这个(和您的bean)。也许最简单的方法就是让你的InputSource实现MessageSource.
@Component
public class InputSource implements MessageSource<String>, Lifecycle {
private boolean running;
@Override
public void start() {
System.out.println("start");
running = true;
}
@Override
public void stop() {
running = false;
}
@Override
public Message<String> receive() {
return new GenericMessage<String>("foo");
}
@Override
public boolean isRunning() {
return running;
}
}并将其连接到您的MySPCA中,以及轮询信息。
我创建了一个改进JIRA问题来支持这个用例。
谢谢!
https://stackoverflow.com/questions/27231833
复制相似问题