어떤 스프링 통합 버전입니까? 이
@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()
방법없이 호출된다) ... 4.1.0와 나를 위해 잘 작동합니다.
어쨌든 여기서 시작/중지는 다른 bean (InputSource
)에 있지만 어댑터의 시작/중지는 SourcePollingChannelAdapter
에 있습니다. phase
으로 주문을 관리 할 수 있습니다.
편집 : 당신은 어댑터가 소스를 시작하려면 아래에 의견을
를 기준으로합니다. 우리는 소스 구성 요소가 아니기 때문에
if (this.source implements Lifecycle) {
((Lifecycle) source).start();
}
... 그것은 여기에 작동하지 않을 것입니다 ... 그했다하더라도, 그것은 빈의 나머지 단지
read()
방법에 대한 정보를 모르는
MethodInvokingMessageSource
을합니다.
하나의 해결 방법을 수동으로
@Override // guarded by super#lifecycleLock
protected void doStart() {
myInputSource.start();
super.doStart();
}
당신이 (당신의 콩)를 묶는 것 ... SourcePollingChannelAdapter
를 서브 클래 싱하고 doStart() 메소드의 오버라이드 (override)하는 것입니다. 아마 가장 쉬운 것은이 당신의 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을 만들었습니다.
감사합니다.
몇 가지 구성을 표시 할 수 있습니까? –
예제로 편집 됨 –