Printemps RabbitMQ - à l'aide de manuel canal d'accusé de réception sur un service avec @RabbitListener de configuration
Comment reconnaître les messages manuellement, sans l'aide de l'auto accusé de réception.
Est-il possible d'utiliser en parallèle avec le @RabbitListener
et @EnableRabbit
style de configuration.
La plupart de la documentation nous dit d'utiliser SimpleMessageListenerContainer
avec ChannelAwareMessageListener
.
Cependant, l'utilisation que l'on perd de la souplesse qui est fourni avec les annotations.
J'ai configuré mon service en tant que ci-dessous :
@Service
public class EventReceiver {
@Autowired
private MessageSender messageSender;
@RabbitListener(queues = "${eventqueue}")
public void receiveMessage(Order order) throws Exception {
//code for processing order
}
Mon RabbitConfiguration est comme ci-dessous
@EnableRabbit
public class RabbitApplication implements RabbitListenerConfigurer {
public static void main(String[] args) {
SpringApplication.run(RabbitApplication.class, args);
}
@Bean
public MappingJackson2MessageConverter jackson2Converter() {
MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
return converter;
@Bean
public SimpleRabbitListenerContainerFactory myRabbitListenerContainerFactory() {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(rabbitConnectionFactory());
factory.setMaxConcurrentConsumers(5);
factory.setMessageConverter((MessageConverter) jackson2Converter());
factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);
return factory;
}
@Bean
public ConnectionFactory rabbitConnectionFactory() {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
connectionFactory.setHost("localhost");
return connectionFactory;
}
@Override
public void configureRabbitListeners(RabbitListenerEndpointRegistrar registrar) {
registrar.setContainerFactory(myRabbitListenerContainerFactory());
}
@Autowired
private EventReceiver receiver;
}
}
Toute aide sera appréciée sur la façon d'adapter le manuel de canal d'accusé de réception avec le style précédent de configuration.
Si nous mettons en œuvre la ChannelAwareMessageListener puis le onMessage signature va changer.
Pouvons-nous mettre en œuvre ChannelAwareMessageListener sur un service ?
OriginalL'auteur Guru | 2016-08-02
Vous devez vous connecter pour publier un commentaire.
Ajouter le
Channel
à la@RabbitListener
méthode...et l'utilisation de la balise dans le
basicAck
,basicReject
.MODIFIER
application.propriétés:
channel.basicAck('100001', false)
. Maintenant, indépendamment de savoir si je mets "vrai" ou "faux" dans la ligne ci-dessus du code de l'auditeur et la file d'attente d'aller dans une boucle infinie. Donc, pouvez-vous m'aider comment faire pour contourner ce problème.Nous avons finalement résolu le problème. Iam documenter ce pour le bénéfice des autres.
J'ai eu une erreur de ce printemps.rabbitmq.auditeur.reconnaissez-mode est déconseillé de propriété. J'ai fini la définition de cette propriété sur mon RabbitListenerContainerFactory Bean et il a obtenu de travailler de cette façon.
La propriété a été s'installe à
spring.rabbitmq.listener.simple.acknowledge-mode
. Au Printemps Boot 2.0, il peut êtrespring.rabbitmq.listener.simple.acknowledge-mode
ouspring.rabbitmq.listener.direct.acknowledge-mode
parce que le Printemps AMQP prend désormais en charge 2 types de conteneurs. Voir la documentation.Quelqu'un pourrait-il m'expliquer pourquoi des programmeurs java refuse de mettre les importations dans leur des exemples de code? Je me sens comme il me sauver des heures.
OriginalL'auteur Gary Russell
Juste au cas où vous avez besoin d'utiliser #onMessage() à partir de ChannelAwareMessageListener classe. Ensuite, vous pouvez le faire de cette façon.
}
Et pour le rabbitConfiguration
}
OriginalL'auteur Pari Ngang
Merci pour gary. J'ai finalement résolu le problème. Je suis documenter ce pour le bénéfice des autres.
Ce doit être documentée dans le cadre de la norme de documentation du Printemps AMQP documentation de référence de page.
Classe de Service est comme ci-dessous.
de la configuration a également été modifiés comme ci-dessous
Note: pas besoin de configurer Rabbitconnectionfactory ou containerfactor etc depuis l'annotation implicity prendre soin de tout cela.
basicConsume
oubasicGet
contre la chaîne -basicGet
va chercher un autre message. L'auditeur conteneur est déjà consommer, et le message a été utilisé pour invoquer la méthode de livraison différente de l'étiquette. Au lieu de cela, utiliser@Header(AmqpHeaders.DELIVERY_TAG) long tag
. Voir ma réponse (modifier).Gary, retiré basicConsume et basicGet et utilisé le @en-Tête(AmqpHeaders.DELIVERY_TAG) longue balise dans basicAck/ basicReject Le flux de l'arrêt de travail. La file d'attente est extraite à nouveau et à nouveau dans une boucle infinie et la file d'attente de destination est rempli. Revenue sur le code de retour de basicGet et basicConsume et il est de travail.
Mais cela ne fonctionne PAS - vous êtes acking (et laisser tomber) le message suivant.
donc vous voulez dire que je devrais utiliser une sorte de consommer de l'éviter. Il n'est pas clair, puisque vous l'avez dit plus tôt que nous ne devrions pas utiliser basicConsume.
J'ai juste écrit un rapide Printemps de Démarrage de l'app et il fonctionne exactement comme je l'ai décrit - j'ai édité ma réponse avec le code. Le projet complet est ici et la valider. Si vous définissez un point d'arrêt sur
basicAck
vous pouvez voir l'onu-roupe animé message chez le Lapin, l'Administrateur de l'INTERFACE utilisateur; étape au-dessus, et le message est roupe animé.OriginalL'auteur Guru