2017-09-24 2 views
0

Ich benutze Feder Cloud-Stream, und vor ein Problem, wenn ich InboundChannelAdapter mit Rückgabetyp MessageSource, dann verhält sich wie eine Singleton-Klasse, es läuft alle 1 Sekunde und Senden der gleichen Daten an den Verbraucher. Außerdem druckt der Logger sie nur einmal beim Start der Anwendung aus.Spring Datenstrom InboundChannelAdapter haben unterschiedliches Verhalten mit unterschiedlichen Rückgabetyp

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

aber wo ich geändert haben einfach zu String zu Message geben Sie dann seine adaequat

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

es Verbraucher, um aktualisierte Daten zu senden und Drucken auch das Update-Log-in jeder Sekunde.

Also meine Frage ist, warum unterschiedliches Verhalten für verschiedene Rückgabetypen?

Antwort

1

Wenn es sich um eine MessageSource handelt, muss sie auch mit '@Bean' kommentiert werden. Daher wird die UUID nur einmal erstellt. Wenn es eine POJO-Methode ist, wird sie bei jeder Umfrage erstellt.

Wenn Sie die UUID in das Lambda verschieben, funktionieren sie gleich.

EDIT

@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

Hallo Gray, Vielen Dank für Ihre Antwort, ich habe auf Message hinzugefügt @Bean, aber es immer noch die eine einzelne Kopie (als Singleton) von UuidCaller in jeder 1 Sekunde senden, nicht gedruckt alles (log). Kannst du bitte schreiben, wie ich die UUID in den Lambda (zB Code) verschieben kann. Vielen Dank! – Baba

+0

Danke, mein Herr. Ich bin ein großer Fan des Frühlingsteams. Danke für Ihre wertvolle Antwort. – Baba

Verwandte Themen