2014-12-01 2 views
2

스프링 통합 응용 프로그램에 포팅해야하는 기존 코드가 있습니다. 예상대로 작동하는 @InboundChannelAdapter 주석을 통해 인바운드 채널 어댑터를 구성하기로 결정했습니다.스프링 통합 주석 및 SmartLifecycle 인터페이스

문제는 인바운드 채널 어댑터의 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() 호출되지 않는 경우 : 내가 좀

편집이 ... 지금 붙어있어 만들어진.

+0

몇 가지 구성을 표시 할 수 있습니까? –

+0

예제로 편집 됨 –

답변

1

어떤 스프링 통합 버전입니까? 이

@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을 만들었습니다.

감사합니다.

+0

예를 들어 jmx를 통해 호출 될 때 어댑터의'start()'가'InputSource.start()'를 호출하도록하고 싶습니다. –

+0

내가 말했듯이 - 다른 콩입니다. 어댑터가 아닙니다. 그것은'inputSource'라고 불리는 bean입니다. –

+0

하지만 내가 할 수있는 일은 무엇입니까? –