2017-12-11 8 views
0

Ich habe eine neue Federanwendung erstellt, die Nachrichten an einen rabbitmq-Server sendet. Meine rabbitMQConfig Java-Datei wie folgt aussieht:RabbitMQ Exchange und Queue werden nicht automatisch erstellt

@Configuration 
public class RabbitMQConfig { 

    private static final Logger LOGGER = LoggerFactory.getLogger(RabbitMQConfig.class); 

    @Value("${spring.rabbitmq.host}") 
    private String SPRING_RABBITMQ_HOST; 

    @Value("${spring.rabbitmq.port}") 
    private int SPRING_RABBITMQ_PORT; 

    @Value("${spring.rabbitmq.username}") 
    private String SPRING_RABBITMQ_USERNAME; 

    @Value("${spring.rabbitmq.password}") 
    private String SPRING_RABBITMQ_PASSWORD; 

    @Bean 
    public RabbitTemplate rabbitTemplate(){ 
     CachingConnectionFactory connectionFactory = new CachingConnectionFactory(SPRING_RABBITMQ_HOST,SPRING_RABBITMQ_PORT); 
     connectionFactory.setUsername(SPRING_RABBITMQ_USERNAME); 
     connectionFactory.setPassword(SPRING_RABBITMQ_PASSWORD); 
     RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory); 
     rabbitTemplate.setExchange("my.controller.exchange"); 
     rabbitTemplate.setRoutingKey("my.controller.key"); 
     return rabbitTemplate; 
    } 

    @Bean 
    DirectExchange exchange() { 
      return new DirectExchange("my.controller.exchange", true, false); 
    } 

    @Bean 
    public Queue queue() { 
      return new Queue("my.controller", true); 
    } 

    @Bean 
    Binding exchangeBinding(DirectExchange exchange, Queue queue) { 
      return BindingBuilder.bind(queue).to(exchange).with("my.controller.key"); 
    } 
} 

Hier ist, wie ich Nachricht an die Warteschlange drücken:

@Service 
public class RabbitPublisher { 

    @Autowired 
    private RabbitTemplate rabbitTemplate; 

    private static Logger LOGGER = Logger.getLogger(RabbitPublisher.class); 

    public Boolean pushToMyQueue(HashMap<String, Object> message) { 
     try { 
      rabbitTemplate.convertAndSend("my.controller.exchange","my.controller.key",message); 
      return true; 
     } catch (Exception e) { 
      e.printStackTrace(); 
      LOGGER.error("Error in pushing to my queue", e); 
     } 
     return false; 
    } 
} 

Da der Austausch und die Warteschlange nicht vorhanden sind auf dem rabbitmq Server, ich sie erwarten automatisch erstellt werden und eine Nachricht gesendet werden soll. Aber es ergibt sich folgende Fehler:

ERROR 18198 --- [168.201.18:5672] o.s.a.r.c.CachingConnectionFactory  : 
Channel shutdown: channel error; protocol method: #method<channel.close> 
(reply-code=404, reply-text=NOT_FOUND - no exchange 
'my.controller.exchange' in vhost '/', class-id=60, method-id=40) 

Wenn ich schaffen den Austausch und die Warteschlange und binden sie manuell auf dem Server eine Nachricht erfolgreich gedrückt wird. Bitte lassen Sie mich wissen, wenn ich etwas vermisse. Vielen Dank.

Antwort

2

Sie müssen ein RabbitAdmin @Bean hinzufügen. Der Admin deklariert die Elemente beim ersten Öffnen einer Verbindung.

Verwandte Themen