什么版本的 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() 方法)。
在任何情况下,请记住这里的启动/停止位于不同的 bean(InputSource)上,而适配器上的启动/停止位于其 SourcePollingChannelAdapter。您可以通过phase控制订单。
编辑:
根据下面的 cmets,您希望适配器启动其源。即使我们这样做了......
if (this.source implements Lifecycle) {
((Lifecycle) source).start();
}
...它在这里不起作用,因为源不是您的组件,它是一个 MethodInvokingMessageSource,它对 bean 的其余部分一无所知,只是 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。
我创建了一个Improvement JIRA Issue 来支持这个用例。
谢谢!