2017-09-24 3 views
0

J'utilise un flux de printemps avec un problème lorsque j'utilise InboundChannelAdapter avec le type de retour MessageSource, puis se comporte comme une classe singleton, il s'exécute toutes les 1 seconde et envoyer les mêmes données au consommateur. En outre, l'enregistreur les affiche une seule fois au démarrage de l'application.Flux de données de printemps InboundChannelAdapter a un comportement différent avec un type de retour différent

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

mais où j'ai changé à MessageSource à simple type de chaîne alors son travail bien

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

il est consommateur d'envoyer des données mises à jour et également l'impression du journal de mise à jour chaque seconde.

Donc, ma question est de savoir pourquoi le comportement différent pour le type de retour différent?

Répondre

1

Lorsqu'il s'agit d'un MessageSource, il doit également être annoté avec '@Bean'. Par conséquent, l'UUID n'est créé qu'une seule fois. Quand c'est une méthode POJO, elle est créée à chaque sondage.

Si vous déplacez l'UUID dans le lambda, ils fonctionneront de la même manière.

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

Bonjour Gray, Merci pour votre réponse, j'ai ajouté @Bean sur MessageSource, mais encore l'envoi d'un seul exemplaire (comme singleton) de UuidCaller dans toutes les 1 sec, pas d'impression quoi que ce soit (journal). Pouvez-vous s'il vous plaît écrire la façon dont je peux déplacer l'UUID dans le lambda (par exemple le code). Merci! – Baba

+0

Merci monsieur. Je suis un grand fan de l'équipe de printemps. Merci pour votre réponse précieuse. – Baba