2016-08-05 54 views
1

Ich bin neu in Frühling und RabbitMQ und habe herausgefunden, wie Nachrichten so etwas wie dies mit konsumieren:Benötigen mit Kaninchen Anmerkungen helfen Daten im Frühjahr Stiefel mit AMQP verbrauchen

KONFIGURATIONSDATEI:

import org.springframework.amqp.core.AmqpAdmin; 
import org.springframework.amqp.rabbit.connection.ConnectionFactory; 
import org.springframework.amqp.rabbit.core.RabbitAdmin; 
import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer; 
import org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter; 
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; 
import org.springframework.amqp.support.converter.MessageConverter; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 

@Configuration 
public class ConsumerConfiguration { 

    private String queueName; 

    @Autowired 
    private ConnectionFactory connectionFactory; 

    public void setQueueName(final String queueName) { 
     this.queueName = queueName; 
    } 

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

    @Bean 
    public MessageConverter messageConverter() { 
     final Jackson2JsonMessageConverter converter = new Jackson2JsonMessageConverter(); 
     return converter; 
    } 

    @Bean 
    public SimpleMessageListenerContainer listenerContainer() { 
     final SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(); 
     container.setConnectionFactory(this.connectionFactory); 
     container.setQueueNames(this.queueName); 
     container.setMessageListener(messageListenerAdapter()); 

     return container; 
    } 

    @Bean 
    public MessageListenerAdapter messageListenerAdapter() { 
     return new MessageListenerAdapter(this, messageConverter()); 
    } 

} 

CONSUMER DATEI:

import org.springframework.stereotype.Component; 

import com.vts.cped.basic.TopicNames; 
import com.vts.cped.correlator.data.CorrelatedData; 
import com.vts.cped.main.config.BaseReceiver; 

@Component 
public class Consumer { 

    public void handleMessage(final SomeData data) { 
     System.out.println("Consumer received SomeData with data " + data.getData()); 
    } 
} 

ich versuche, das gleiche mit RabbitMQ Anmerkungen in der Hoffnung, zu erreichen, dass sie den Code sauberer machen. Ich habe versucht, dies mit dem folgenden zu tun, aber ich kann es nicht an der Arbeit:

import org.springframework.amqp.rabbit.annotation.RabbitListener; 
import org.springframework.stereotype.Service; 

@Service 
public class Receiver { 

    @RabbitListener(queues = "tut.hello") 
    public void process(final SomeData in) { 
    System.out.println(" [x] Received '" + in + "'"); 
    } 

} 

ich ursprünglich so etwas wie dies versucht hatte, aber es hat auch nicht:

import org.springframework.amqp.rabbit.annotation.RabbitHandler; 
import org.springframework.amqp.rabbit.annotation.RabbitListener; 
import org.springframework.stereotype.Service; 

@RabbitListener(queues = "tut.hello") 
@Service 
public class Receiver { 

    @RabbitHandler 
    public void process(final SomeData in) { 
    System.out.println(" [x] Received '" + in + "'"); 
    } 

} 

Wenn Du hast die geheime Soße, bitte sende mir etwas! Vielen Dank für Ihre Hilfe.

+0

ich, dass in der Konfiguration übernehmen würde 'queueName' wäre immer Null beim Erstellen von Beans. – Piotr

Antwort

1

Es gibt eine Erklärung in der Dokumentation:

Unterstützung aktivieren für @RabbitListener Anmerkungen hinzufügen @EnableRabbit zu einem Ihrer @Configuration Klassen.

http://docs.spring.io/spring-amqp/docs/1.6.1.RELEASE/reference/html/_reference.html#async-annotation-driven-enable

Sie auch benötigen noch eine SimpleRabbitListenerContainerFactory Bohne die Jackson2JsonMessageConverter zu registrieren.

http://docs.spring.io/spring-amqp/docs/1.6.1.RELEASE/reference/html/_reference.html#async-annotation-conversion

+0

Auch die Beispiele, die ich befolge, werden hier https://github.com/kop-still/java-test/tree/master/spring-boot-sample-amqp und hier gepostet ein nd https://github.com/spring-projects/spring-amqp-samples/tree/master/rabbitmq-tutorials (falls das hilft). –

0

fand ich das Update, ich war das fehlt:

@Bean 
public RabbitTemplate rabbitTemplate() { 
    final RabbitTemplate template = new RabbitTemplate(this.connectionFactory); 
    template.setMessageConverter(messageConverter()); 
    return template; 
} 

Insgesamt ist dies meine Konfigurationsdatei:

import org.springframework.amqp.core.AmqpAdmin; 
import org.springframework.amqp.core.Queue; 
import org.springframework.amqp.rabbit.annotation.EnableRabbit; 
import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory; 
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.support.converter.Jackson2JsonMessageConverter; 
import org.springframework.amqp.support.converter.MessageConverter; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 

@EnableRabbit 
@Configuration 
public class CommonConfig { 

    @Autowired 
    private ConnectionFactory connectionFactory; 

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

    @Bean 
    public MessageConverter messageConverter() { 
     final Jackson2JsonMessageConverter converter = new Jackson2JsonMessageConverter(); 
     return converter; 
    } 

    @Bean 
    public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() { 
     final SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); 
     factory.setConnectionFactory(this.connectionFactory); 
     factory.setMessageConverter(messageConverter()); 
     factory.setConcurrentConsumers(3); 
     factory.setMaxConcurrentConsumers(10); 
     return factory; 
    } 

    @Bean 
    public RabbitTemplate rabbitTemplate() { 
     final RabbitTemplate template = new RabbitTemplate(this.connectionFactory); 
     template.setMessageConverter(messageConverter()); 
     return template; 
    } 

    @Bean 
    public Queue helloQueue() { 
     return new Queue("tut.hello"); 
    } 

    @Bean 
    public Sender sender() { 
     return new Sender(); 
    } 

    @Bean 
    public Receiver receiver() { 
     return new Receiver(); 
    } 
} 
+0

Ich fand heraus, dass ich Folgendes tun muss: (1) lese die AMQP-Spezifikation und verstehe sie besser (2) lese die Spring-AMQP-Dokumentation vollständig und (3) schaue das Material unter http://www.rabbitmq.com durch /how.html. Ich dachte, ich könnte einfach ein paar Tutorials machen und es verstehen. –