什麼版本的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
來控制訂單。
編輯:根據您的意見
下面你想要的適配器來啓動它的來源。即使我們這樣做......
if (this.source implements Lifecycle) {
((Lifecycle) source).start();
}
...它不會在這裏,因爲源是不是你的組件工作,這是一個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
一起。
我創建了一個Improvement JIRA Issue來支持這個用例。
謝謝!
你能顯示一些配置嗎? – 2014-12-01 16:30:10
用一個例子編輯 – 2014-12-01 16:40:35