2017-01-28 34 views
1

我想我在這裏缺少的東西..我想創建簡單的兔子清單,它可以接受自定義對象作爲消息類型。現在按照文檔說使用兔子聽衆的春天amqp轉換器問題

在1.6以前的版本中,轉換JSON的類型信息必須在消息頭中提供,或者需要定製ClassMapper。從版本1.6開始,如果沒有類型信息頭,則可以從目標方法參數中推斷出該類型。

我把消息手動在儀表板用兔MQ ADM排隊,得到錯誤像

Caused by: org.springframework.messaging.converter.MessageConversionException: Cannot convert from [[B] to [com.example.Customer] for GenericMessage [payload=byte[21], headers={amqp_receivedDeliveryMode=NON_PERSISTENT, amqp_receivedRoutingKey=customer, amqp_deliveryTag=1, amqp_consumerQueue=customer, amqp_redelivered=false, id=81e8a562-71aa-b430-df03-f60e6a37c5dc, amqp_consumerTag=amq.ctag-LQARUDrR6sUcn7FqAKKVDA, timestamp=1485635555742}] 

我的配置:

@Bean 
    public ConnectionFactory connectionFactory() { 
     CachingConnectionFactory connectionFactory = new CachingConnectionFactory("localhost"); 
     connectionFactory.setUsername("test"); 
     connectionFactory.setPassword("test1234"); 
     connectionFactory.setVirtualHost("/"); 
     return connectionFactory; 
    } 

    @Bean 
    RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) { 
     RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory); 
     rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter()); 
     return rabbitTemplate; 
    } 

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

    @Bean 
    public Jackson2JsonMessageConverter jackson2JsonMessageConverter() { 
     return new Jackson2JsonMessageConverter(); 
    } 

另外的問題是與此異常的消息是不是放回到隊列中。

我正在使用帶有amqp 1.6.1的spring boot 1.4。如上所示,我還沒有配置任何偵聽器容器。編輯1:我如上所述添加了jackson轉換器(對於spring引導不需要這個問題)並給出了rmq admin中的內容類型,但仍然在下面,如上所示。

Caused by: org.springframework.messaging.converter.MessageConversionException: Cannot convert from [[B] to [com.example.Customer] for GenericMessage [payload=byte[21], headers={amqp_receivedDeliveryMode=NON_PERSISTENT, amqp_receivedRoutingKey=customer, content_type=application/json, amqp_deliveryTag=3, amqp_consumerQueue=customer, amqp_redelivered=false, id=7f84d49d-037a-9ea3-e936-ed5552d9f535, amqp_consumerTag=amq.ctag-YSemzbIW6Q8JGYUS70WWtA, timestamp=1485643437271}] 

回答

3

如果使用的是引導,你可以簡單地添加一個Jackson2JsonMessageConverter@Bean的配置,它會自動連線到監聽器(只要它是唯一的轉換器)。如果您使用管理控制檯發送消息,則需要將content_type屬性設置爲application/json

默認情況下,轉換錯誤被認爲是致命的,因爲通常沒有理由重試;否則他們會永遠循環。

編輯

這裏有一個工作啓動應用程序...

@SpringBootApplication 
public class So41914665Application { 

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

    @Bean 
    public Queue queue() { 
     return new Queue("foo", false, false, true); 
    } 

    @Bean 
    public Jackson2JsonMessageConverter converter() { 
     return new Jackson2JsonMessageConverter(); 
    } 

    @RabbitListener(queues = "foo") 
    public void listen(Foo foo) { 
     System.out.println(foo); 
    } 


    public static class Foo { 

     public String bar; 

     public String getBar() { 
      return this.bar; 
     } 

     public void setBar(String bar) { 
      this.bar = bar; 
     } 

     @Override 
     public String toString() { 
      return "Foo [bar=" + this.bar + "]"; 
     } 

    } 

} 

我發這個消息

Publish json message

有了這樣的結果:

2017-01-28 21:49:45.509 INFO 11453 --- [   main] com.example.So41914665Application  : Started So41914665Application in 4.404 seconds (JVM running for 5.298) 
Foo [bar=baz] 

引導將爲您定義管理員和模板。

+0

BTW當前引導版本是1.4.4 –

+0

我與上述一樣,同樣的錯誤 – user3444718

+0

見我的編輯用於非常簡單的引導程序的一個例子。 '>我還沒有配置任何監聽器容器。「如果這是真的,那麼如何獲得轉換異常並不清楚。 –