2014-12-01 119 views
2

我有一些遺留代碼需要移植到基於Spring集成的應用程序中。我決定通過@InboundChannelAdapter批註配置入站通道適配器,該批註按預期工作。Spring集成註釋和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

你能顯示一些配置嗎? – 2014-12-01 16:30:10

+0

用一個例子編輯 – 2014-12-01 16:40:35

回答

1

什麼版本的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(); 
    } 

} 

(即使沒有@EnableIntegrationstart()方法被調用)。

在任何情況下,請記住,這裏的啓動/停止位於不同的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來支持這個用例。

謝謝!

+0

我想通過jmx調用適配器的'start()'來調用'InputSource.start()',例如。 – 2014-12-01 17:20:47

+0

就像我說的 - 它是一個不同的bean--它不是適配器;它是一個名爲'inputSource'的bean。 – 2014-12-01 17:22:24

+0

但是,我期望做什麼,甚至可以做到? – 2014-12-01 17:23:20