2017-09-24 15 views
0

我使用的春天雲流,並面臨着一個問題,當我使用InboundChannelAdapter返回類型爲MessageSource的,則表現得像一個單獨的類不同的行爲,它在每1秒的運行並將相同的數據發送給消費者。此外,記錄器在應用程序啓動時僅打印出一次。春數據流InboundChannelAdapter有不同的返回類型

@InboundChannelAdapter(value = Source.OUTPUT, poller = @Poller(fixedDelay = "1000", maxMessagesPerPoll = "1")) 
    public MessageSource<String> uuidSource() { 
     UuidCaller uuidCaller = new UuidCaller(atomicLong.addAndGet(1), new Date(), UUID.randomUUID().toString()); 
     logger.info("buid request:"+uuidCaller); 
     return() -> MessageBuilder.withPayload(uuidCaller.toString()).build(); 
    } 

,但在那裏我已經更改爲MessageSource的簡單轉換爲字符串類型,那麼它的做工精細

InboundChannelAdapter(value = Source.OUTPUT, poller = @Poller(fixedDelay = "1000", maxMessagesPerPoll = "1")) 
    public String uuidSource() { 
     UuidCaller uuidCaller = new UuidCaller(atomicLong.addAndGet(1), new Date(), UUID.randomUUID().toString()); 
     logger.info("build request:"+uuidCaller); 
     return uuidCaller.toString(); 
    } 

它發送給消費者更新的數據,也打印更新日誌中的每一秒。

所以我的問題是爲什麼不同的返回類型的行爲不同?

回答

1

當它是一個MessageSource時,它也必須用'@Bean'註釋。因此,UUID只創建一次。當它是POJO方法時,它會在每次投票中創建。

如果您將UUID移動到lambda中,它們的工作原理將相同。

編輯

@Bean 
@InboundChannelAdapter(value = Source.OUTPUT, poller = @Poller(fixedDelay = "1000", maxMessagesPerPoll = "1")) 
public MessageSource<String> uuidSource() { 
    return() -> { 
     UuidCaller uuidCaller = new UuidCaller(atomicLong.addAndGet(1), new Date(), UUID.randomUUID().toString()); 
     logger.info("buid request:"+uuidCaller); 
     return MessageBuilder.withPayload(uuidCaller.toString()).build(); 
    }; 
} 
+0

您好灰色,感謝您的回覆,我已經加入@Bean上的MessageSource,但它仍然是在每1秒發送UuidCaller的單個副本(如單身),而不是印刷任何東西(日誌)。 你能否寫下我如何將UUID移動到lambda(例如代碼)中。 謝謝! – Baba

+0

謝謝先生。我是春季隊的忠實粉絲。感謝您的寶貴迴應。 – Baba