Spring数据流InboundChannelAdapter具有不同的行为,具有不同的返回类型

时间:2017-09-24 18:33:37

标签: spring spring-data spring-cloud-stream

我正在使用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();
    }

它向消费者发送更新的数据,并且每秒都打印更新日志。

所以我的问题是为什么不同的返回类型会有不同的行为?

1 个答案:

答案 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();
    };
}