我正在使用Spring云流,面临一个问题,当我使用带有返回类型MessageSource的InboundChannelAdapter时,表现得像一个单例类,它每1秒运行一次并将相同的数据发送到消费者。此外,记录器在应用程序启动时只打印一次。
@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更改为simple to String类型,然后其工作正常
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();
}
它向消费者发送更新的数据,并且每秒都打印更新日志。
所以我的问题是为什么不同的返回类型会有不同的行为?
答案 0 :(得分:1)
如果是MessageSource,还必须使用&#39; @ Bean&#39;进行注释。因此,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();
};
}