2017-12-20 6 views
0

Ich habe eine Spring-Amqp-App, die ich verwenden möchte, aber ich kann nicht zu wissen scheinen, wie ich es bekommen kann, um meinen Listener-Service zu registrieren. Dies ist meine annotierungsbasierte Konfigurationsdatei.Registrieren eines Listener-Dienstes mit setMessageListener

package com.jerry.configuration; 

import org.springframework.amqp.core.AmqpAdmin; 
import org.springframework.amqp.core.Queue; 
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory; 
import org.springframework.amqp.rabbit.connection.ConnectionFactory; 
import org.springframework.amqp.rabbit.core.RabbitAdmin; 
import org.springframework.amqp.rabbit.core.RabbitTemplate; 
import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 


@Configuration 
public class SpringAmqpConfiguration { 

    protected final String helloWorldQueueName = "hello.world.queue"; 

    @Bean 
    public ConnectionFactory connectionFactory() { 
     CachingConnectionFactory connectionFactory = new CachingConnectionFactory("localhost"); 
     connectionFactory.setUsername("guest"); 
     connectionFactory.setPassword("guest"); 
     return connectionFactory; 
    } 

    @Bean 
    public AmqpAdmin amqpAdmin() { 
     return new RabbitAdmin(connectionFactory()); 
    } 

    @Bean 
    public RabbitTemplate rabbitTemplate() { 
     RabbitTemplate template = new RabbitTemplate(connectionFactory()); 
     //The routing key is set to the name of the queue by the broker for the default exchange. 
     template.setRoutingKey(this.helloWorldQueueName); 
     //Where we will synchronously receive messages from 
     template.setQueue(this.helloWorldQueueName); 
     return template; 
    } 

    @Bean 
    // Every queue is bound to the default direct exchange 
    public Queue helloWorldQueue() { 
     return new Queue(this.helloWorldQueueName); 
    } 

    @Bean 
    public Binding binding() { 
     return declare(new Binding(helloWorldQueue(), defaultDirectExchange())); 
    } 

    //https://docs.spring.io/spring-amqp/docs/1.5.0.BUILD-SNAPSHOT/reference/html/_reference.html#async-annotation-driven 

    @Bean 
    public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() { 
     SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); 
     factory.setConnectionFactory(connectionFactory()); 
     factory.setConcurrentConsumers(3); 
     //If you want a fixed number of consumers, omit the max. 
     factory.setMaxConcurrentConsumers(10); 
     //Set message listener : container.setMessageListener(this.myFirstListener); 
     return factory; 
    } 


    /** 
    * Listener Bean 
    * Threadpool 
    *  
    <bean id="messageListener" class="com.spring.rabbitmq.service.MessageListenerService" /> 

    <rabbit:listener-container connection-factory="connectionFactory"> 
     <rabbit:listener ref="messageListener" queues="my.first.queue" /> 
    </rabbit:listener-container> 

    */ 


} 

verwenden i die Listenerdienst

Dies wünsche
package com.jerry.services; 

import org.slf4j.Logger; 
import org.springframework.amqp.core.Message; 
import org.springframework.amqp.core.MessageListener; 


public class MessageListenerService implements MessageListener { 

    private static final Logger LOGGER = org.slf4j.LoggerFactory.getLogger(MessageListenerService.class); 

    @Override 
    public void onMessage(Message message) { 
     LOGGER.info(message.getMessageProperties().toString());; 
     LOGGER.info(new String(message.getBody())); 
    } 
} 

Wie kann ich den Hörer Service in diesem Bean registrieren und wie würde ich mich über mehrere Zuhörer Registrierung zu verschiedenen Warteschlangen zu hören?

@Bean 
    public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() { 
     SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); 
     factory.setConnectionFactory(connectionFactory()); 
     factory.setConcurrentConsumers(3); 
     //If you want a fixed number of consumers, omit the max. 
     factory.setMaxConcurrentConsumers(10); 
     //Set message listener : container.setMessageListener(this.myFirstListener); 
     return factory; 
    } 

Antwort

1

Wie ich den Hörer Service in diesem Bean registrieren Sie

ein für MessageListenerService@Bean definieren und erstellen a @Bean und setMessageListener() verwenden.

Die Container-Factory ist nicht für benutzerdefinierte Listener gedacht, sondern für @RabbitListener Pojo-Annotationen.

und wie würde ich über das Registrieren mehrerer Listener, die verschiedene Warteschlangen hören, gehen?

Wenn derselbe Listener mehrere Warteschlangen hören soll, legen Sie die Warteschlangennamen im Container fest.

Wenn Sie für jede Warteschlange unterschiedliche Listener benötigen, benötigen Sie jeweils einen .

Oder verwenden Sie stattdessen @RabbitListener Annotationen.

0

Für Ihre Listener-Klasse sollten Sie etwas tun:

@EnableRabbit 
@Service 
public class MessageListenerService { 

    private static final Logger LOGGER = org.slf4j.LoggerFactory.getLogger(MessageListenerService.class); 

    @RabbitListener(queues = { Constant.QUEUE_NAME }) 
    public void onMessage(Message message) { 
    LOGGER.info(message.getMessageProperties().toString());; 
    LOGGER.info(new String(message.getBody())); 
    } 
} 
+0

Wie sieht Ihre Konfiguration für den obigen Dienst aus und wie kann ich mehrere Listener haben? – Gandalf

+0

Verwenden Sie Springboot? – Hiren

+0

Nein. Spring mvc – Gandalf

Verwandte Themen