2016-10-19 3 views
2

У меня есть простой слушатель, получающий сообщения от Rabbitmq. Я хотел бы изменить сообщение и опубликовать его в новом обмене/очереди. Я не смог заставить шаблон кролика работать в слушателе. Любая помощь будет оценена по достоинству. Мой код ниже, когда я пытался autowire шаблон я получаюВесенняя ботинок весеннего кролика: Как создать шаблон кролика для отправки сообщения в слушателе

Caused by: java.lang.NullPointerException: null 
    at com.example.Consumer.onMessage(Consumer.java:27) ~[classes!/:0.0.1-SNAPSHOT] 

Классы:

package com.example; 

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 


@SpringBootApplication 
public class RabbittestApplication { 

    public static void main(String[] args) { 
     SpringApplication.run(RabbittestApplication.class, args); 
    } 
} 


package com.example; 

import org.springframework.amqp.core.AcknowledgeMode; 
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory; 
import org.springframework.amqp.rabbit.connection.ConnectionFactory; 
import org.springframework.amqp.rabbit.core.RabbitTemplate; 
import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer; 
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 

@Configuration 
@EnableAutoConfiguration 
public class RabbitConfig { 

    private static final String SIMPLE_MESSAGE_QUEUE = "qDLX1.dlx"; 

    @Bean 
    public ConnectionFactory connectionFactory() { 
     CachingConnectionFactory connectionFactory = new CachingConnectionFactory("RabbitErl19"); 
     connectionFactory.setUsername("gregg"); 
     connectionFactory.setPassword("gregg"); 
     connectionFactory.setPort(5672); 
     connectionFactory.setVirtualHost("dlxtest"); 
     return connectionFactory; 
    } 

    @Bean 
    public RabbitTemplate rabbitTemplate() { 
     RabbitTemplate template = new RabbitTemplate(connectionFactory()); 
     return template; 
    } 



    @Bean 
    public SimpleMessageListenerContainer listenerContainer() { 
     SimpleMessageListenerContainer listenerContainer = new SimpleMessageListenerContainer(); 
     listenerContainer.setConnectionFactory(connectionFactory()); 
     listenerContainer.setQueueNames(SIMPLE_MESSAGE_QUEUE); 
     listenerContainer.setMessageListener(new Consumer()); 
     listenerContainer.setAcknowledgeMode(AcknowledgeMode.AUTO); 
     return listenerContainer; 
    } 



} 

package com.example; 


import org.springframework.amqp.core.Message; 
import org.springframework.amqp.core.MessageListener; 
import org.springframework.amqp.rabbit.core.RabbitTemplate; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Component; 


@Component 
public class Consumer implements MessageListener { 

    @Autowired 
    private RabbitTemplate rabbitTemplate; 

    @Override 
    public void onMessage(Message message) { 


     System.out.println("Body: "+new String(message.getBody())); 


     System.out.println(); 


     message.getMessageProperties().setExpiration("5000");   
     rabbitTemplate.send("xDLX1.delay", "xq1.retry", message); 



    } 
} 

ответ

2

Вот ваш код:

listenerContainer.setMessageListener(new Consumer()); 

Как вы видите, что это абсолютно нормально, что @Autowired не работает. Просто потому, что вы обошли инъекцию зависимости.

Поскольку ваш Consumer помечается @Component вы можете просто вводить его в это определение SimpleMessageListenerContainer боба:

@Bean 
public SimpleMessageListenerContainer listenerContainer(Consumer consumer) 
0

Спасибо, что сделал это, я изменил мой код, что находится ниже, и она работала. Ваша помощь очень ценится!

@Autowired 
private Consumer consumer; 


@Bean 
public SimpleMessageListenerContainer listenerContainer() { 
    SimpleMessageListenerContainer listenerContainer = new SimpleMessageListenerContainer();   
    listenerContainer.setConnectionFactory(connectionFactory()); 
    listenerContainer.setQueueNames(SIMPLE_MESSAGE_QUEUE); 
    listenerContainer.setMessageListener(consumer); 
    listenerContainer.setAcknowledgeMode(AcknowledgeMode.AUTO); 
    return listenerContainer; 
}