2015-03-30 3 views
3

Я потратил последнее немного, пытаясь получить его, чтобы обработчик, зарегистрированный с помощью @RabbitListener, передал сообщение с помощью Jackson2JsonMessageConverter. К сожалению, независимо от того, какую конфигурацию я пытаюсь использовать только SimpleMessageConverter.Использование @RabbitListener с Jackson2JsonMessageConverter

@Component 
@Slf4j 
public class TestQueueListener { 
    @RabbitListener(queues = "#{@allQueue}") 
    public void processMessage(String data) { 
     log.trace("Message received: {}", data); 
    } 

    @RabbitListener(queues = "#{@invokeQueue}") 
    public void processSpawnInstanceMessage(TestConfig config) { 
     log.trace("Invoking with config: {}", config); 

     invokeSomeMethod(config); 
    } 
} 

Это конфиг у меня есть в настоящее время, что я думаю, что ближе всего к тому, что документируется:

@Configuration 
@EnableRabbit 
public class MessagingConfiguration { 
    @Bean 
    public MessageConverter messageConverter() { 
     ContentTypeDelegatingMessageConverter messageConverter = new ContentTypeDelegatingMessageConverter(); 
     messageConverter.addDelgate("application/json", new Jackson2JsonMessageConverter()); 
     return messageConverter; 
    } 

    @Bean 
    public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory, MessageConverter messageConverter) { 
     RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory); 
     rabbitTemplate.setMessageConverter(messageConverter); 
     return rabbitTemplate; 
    } 

    @Bean 
    public TopicExchange testExchange() { 
     return new TopicExchange("test"); 
    } 

    @Bean 
    public Queue allQueue() { 
     return new Queue("all", false, true, true); 
    } 

    @Bean 
    public Binding allBinding(TopicExchange testExchange, Queue allQueue) { 
     return BindingBuilder.bind(allQueue).to(testExchange).with("*"); 
    } 

    @Bean 
    public Queue invokeQueue() { 
     return new Queue("invoke", false, true, true); 
    } 

    @Bean 
    public Binding invokeBinding(TopicExchange testExchange, Queue invokeQueue) { 
     return BindingBuilder.bind(invokeQueue).to(testExchange).with("invoke"); 
    } 
} 

Что я понимаю до сих пор, что там, где я застрял, что RabbitTemplate используется, когда отправив сообщение из приложения в RabbitMQ. Поэтому я понимаю, почему мой специальный MessageConverter не используется для вызова Handler. К сожалению, я не вижу, как настроить MessageConverter на входящей стороне. Как использовать MessageConverter, который я настроил с входящими сообщениями?

ответ

3

См the documentation о том, как настроить слушателя контейнеров, созданных для аннотированных конечных точек:

@Bean 
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() { 
    SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); 
    factory.setConnectionFactory(rabbitConnectionFactory()); 
    factory.setMessageConverter(messageConverter()); 
    return factory; 
} 
+1

я прочитал, что в документации несколько раз и даже в какой-то момент помните реализации этого метода, который вы перечислили, но Бесполезный» похоже, работает. Пробовал снова сейчас, и он отлично работает. Теперь работаем через classMapper, так как мой клиент не будет предоставлять тип класса в заголовке. –

+0

Просто наткнулся на эту зависимость ClassMapper - как вы подошли к этой проблеме? – Spiff