2016-04-04 24 views
1

Camel ile bir RabbitMQ bitiş noktası oluştururken sorun yaşıyorum. Sorun, yalnızca camel documentation temel alınarak bir ölü ileti mektup değişimi seçeneği bildirdiğimde oluşur.Deve harf değişimi bildirildiğinde Camel RabbitMQ bitiş noktası oluşturulamıyor

neden: Ben deadLetterExchange seçeneği ihmal ama en kısa sürede dahil olarak aşağıdaki (çok yararlı değil) istisna olsun zaman

rabbitmq://localhost/com.mydomain.inbound.exhange?deadLetterExchange=dead.msgs 

Tüm gayet: Bu son nokta oluşturmak için benim URN'si olduğunu com.rabbitmq.client.impl adresinden java.lang.NullPointerException com.rabbitmq.client.impl.ChannelN.validateQueueNameLength (KanalN.java:1244) ~ [amqp-client-3.6.1.jar :?] .ChannelN.queueDeclare (ChannelN.java:843) ~ [amqp-client-3.6.1.jar :?] com.rabbitmq.client.impl.ChannelN.queueDeclare (KanalN.java:61) ~ [amqp istemcisi -3.6.1 .jar :?] org.apache.camel.component.rabbitmq.RabbitMQDeclareSupport.declareAndBindQueue (RabbitMQDeclareSupport.java:96) ~ [deve-rabbitmq-2.17.0.jar: 2.17.0] org.apache.camel adresinde .component.rabbitmq.RabbitMQDeclareSupport.declareAndBindDeadLetterExchangeWithQueue (RabbitMQDeclareSupport.java:43) ~ [deve RabbitMQ-2.17.0.jar: 2.17.0] org.apache.camel.component.rabbitmq.RabbitMQDeclareSupport.declareAndBindExchangesAndQueuesUsing de (RabbitMQDeclareSupport.java : 35) ~ [camel-rabbitmq-2.17.0.jar: 2.17.0] org.apache.camel.component.rabbitmq.RabbitMQEndpoint.declareExchangeAndQueue (RabbitMQEndpoint.java:222) ~ [deve-rabbitmq-2.17.0 .jar: 2.17.0] org.apache.camel.component.rabbitmq.RabbitConsumer.openChannel adresinden (RabbitConsumer.java:288) ~ [camel-rabbitmq-2.17.0.jar: 2.17.0] org.apache adresinde .camel.component.rabb itmq.RabbitConsumer. (RabbitConsumer.java:57) ~ [camel-rabbitmq-2.17.0.jar: 2.17.0] org.apache.camel.component.rabbitmq.RabbitMQConsumer.createConsumer adresinden (RabbitMQConsumer.java:108) ~ [camel-rabbitmq-2.17.0.jar: 2.17.0] at org.apache.camel.component.rabbitmq.RabbitMQConsumer.startConsumers (RabbitMQConsumer.java:90) ~ [deve-rabbitmq-2.17.0.jar: 2.17 .0] org.apache.camel.component.rabbitmq.RabbitMQConsumer.doStart (RabbitMQConsumer.java:160) ~ [deve-rabbitmq-2.17.0.jar: 2.17.0] org.apache.camel.support adresinde .ServiceSupport.start (ServiceSupport.java:61) ~ [deve-core-2.17.0.jar: 2.17.0] adresindeki org.apache.camel.impl.DefaultCamelContext.startService (DefaultCamelContext.java:3269) ~ [deve -core-2.17.0.jar: 2.17.0] at org.apache.camel.impl.DefaultCamelContext.doStartOrResumeRouteConsumers (DefaultCamelContext.java:3 563) ~ [deve-çekirdek-2.17.0.jar: 2.17.0] org.apache.camel.impl.DefaultCamelContext.doStartRouteConsumers ....

Ben de ettik Sadece hayır not at Bu durumun işe yarayabileceğine dair bir umutla değişimi ve kuyruğu elle oluşturmaya çalıştı.

Ek Bilgi:

  • deve-yay-çizme-marş (2.17.0)
  • deve RabbitMQ (2.17.0)

cevap

1

deneyin bir deadLetterQueue seçeneği ekleyerek -

rabbitmq://localhost/com.mydomain.inbound.exhange?deadLetterExchange=dead.msgs&deadLetterQueue=my.dead.letter.queue

Ayrıca th için başka seçenekler eklemek zorunda kaldım Çalışması için e uri.Ben

queueArgsConfigurer yüzden myArgs (aşağıya bakınız) fasulye fabrikada oluşturulan bir bahar uygulaması org.apache.camel.component.rabbitmq.ArgsConfigurer

class MyQueueArgs implements ArgsConfigurer { 

    void configurArgs(Map<String, Object> args) { //misspelling!! 
     args.put("x-dead-letter-exchange", "my.dead.letter") 
     args.put("x-dead-letter-routing-key", "my.dead.letter.key") 
    } 

} 

Mine bir uygulamasıdır olduğunu queueArgsConfigurer

  • deadLetterExchangeType
  • eklendi .

    Yani, tam uri bu gibi - Herhalde uri ölü mektup alışverişi ve ArgsConfigurer uygulanmasını belirtmek gerekmez

    rabbitmq://hostname/exchangeName?routingKey=$routingKey&vhost=virtualHostname&exchangeType=exType&autoDelete=false&queue=my.queue&deadLetterExchange=my.dead.letter&deadLetterExchangeType=dlExType&deadLetterQueue=my.dead.letter.queue&queueArgsConfigurer=#myArgs

    . Bu Deve sorunu yardımcı olabilecek ArgsConfigurer hakkında daha fazlası için

    - #8457

    Bunun bir çok anlamaya kaynak koduna bakmak zorunda kaldı. Dokümandan eksik olan, bağımlılıkların bir tanımıdır. Biri belirtildiğinde zorunlu olan, ölü mektup alışverişleri etrafında bazı seçenekler vardır. Bu yüzden hatalarını alıyorsun. RabbitMQDeclareSupport'da populateQueueArgumentsFromDeadLetterExchange'a bakın.

    DÜZENLEME

    cevabım A sadeleştirme - Sonunda ArgsConfigurer uygulanmasını düştü. Bununla gitti - Ben zamanında yeni hatası alıyorum bu çalışırken

    rabbitmq://myHostname/myExchangeName? username=myUserName& password=myPassword& queue=myQueueName& routingKey=myRoutingKey& vhost=myVirtualHostname& exchangeType=topic& autoDelete=false& deadLetterExchange=myDeadLetter& deadLetterExchangeType=topic& deadLetterQueue=myDeadLetterQueue& deadLetterRoutingKey=myDeadLetterRoutingKey& autoAck=false

+0

: "** geçersiz arg sıra için '** ölü harfli yönlendirme anahtar x'" ... Ben Bunun işe yaradığına inandığını bilmek ilginizi çekti, belgeler ** deadLetterQueue ** bir seçenek değil, belgesiz mi? – JLove

+0

Cevabımı – KapudanPasha

+0

üzerinde genişlettim. Bu benim için çalıştı. –

İlgili konular