2016-02-02 2 views
1

У меня есть приложение, которое публикует сообщение с использованием RabbitTemplate Spring AMQP и подписывается на сообщение POJO с помощью MessageListenerAdapter, в значительной степени согласно руководству Getting Started - Messaging with RabbitMQ.Сообщение объекта сериализации Spring + AMQP

void handleMessage(final String message) {...} 

rabbitTemplate.convertAndSend(EXCHANGE_NAME, QUEUE_NAME, "message"); 

Однако это отправка сообщений, как String-х; Конечно, есть способ отправлять и получать сообщения объекта напрямую?

Я пробовал зарегистрироваться JsonMessageConverter, но безрезультатно.

Любая помощь будет принята с благодарностью - в настоящее время я вручную/сериализую строки с обеих сторон, которые кажутся беспорядочными, и я удивлен, что это не поддерживаемая функция.

ответ

1

Спасибо @Artem за подсказки. Мой код в значительной степени соответствует Getting Started Guide, и я уже пробовал добавить Converter.

Но, как отметил @Artem, трюк заключается в регистрации преобразователя как с контейнером, адаптером слушателя, так и с шаблоном кролика (который был сконфигурирован в этом примере).

Так что мой @Configuration класс теперь выглядит так, в дополнение к тому, что упоминается в Getting Started Guide:

@Bean 
SimpleMessageListenerContainer container(final ConnectionFactory connectionFactory, final MessageListenerAdapter messageListenerAdapter, 
    final MessageConverter messageConverter) 
{ 
    final SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(); 
    container.setConnectionFactory(connectionFactory); 
    container.setQueueNames(QUEUE_NAME); 
    container.setMessageListener(messageListenerAdapter); 
    container.setMessageConverter(messageConverter); 

    return container; 
} 

@Bean 
RabbitTemplate rabbitTemplate(final ConnectionFactory connectionFactory, final MessageConverter messageConverter) 
{ 
    final RabbitTemplate rabbitTemplate = new RabbitTemplate(); 
    rabbitTemplate.setConnectionFactory(connectionFactory); 
    rabbitTemplate.setMessageConverter(messageConverter); 

    return rabbitTemplate; 
} 

@Bean 
MessageConverter messageConverter() 
{ 
    return new Jackson2JsonMessageConverter(); 
} 

@Bean 
Receiver receiver() 
{ 
    return new Receiver(); 
} 

@Bean 
MessageListenerAdapter listenerAdapter(final Receiver receiver, final MessageConverter messageConverter) 
{ 
    return new MessageListenerAdapter(receiver, messageConverter); 
} 

что означает, что Receiver может иметь метод объекта подписи, такие как:

void handleMessage(final CbeEvent message) 
0

Я пробовал зарегистрировать JsonMessageConverter, но безрезультатно.

Было бы лучше увидеть вашу попытку и выяснить проблему на нашей стороне.

Сейчас я могу сказать, что вы должны поставить JsonMessageConverter для отправки и получения частей.

Я только тестируется с gs-messaging-rabbitmq:

@Autowired 
RabbitTemplate rabbitTemplate; 

@Autowired 
MessageConverter messageConverter; 

..... 

@Bean 
MessageListenerAdapter listenerAdapter(Receiver receiver, MessageConverter messageConverter) { 
    MessageListenerAdapter adapter = new MessageListenerAdapter(receiver, "receiveMessage"); 
    adapter.setMessageConverter(messageConverter); 
    return adapter; 
} 

@Bean 
MessageConverter messageConverter() { 
    return new Jackson2JsonMessageConverter(); 
} 

..... 

System.out.println("Sending message..."); 
rabbitTemplate.setMessageConverter(messageConverter); 
rabbitTemplate.convertAndSend(queueName, new Foo("Hello from RabbitMQ!")); 

Где Receiver было изменено на следующее:

public void receiveMessage(Foo message) { 
    System.out.println("Received <" + message + ">"); 
    latch.countDown(); 
} 

Итак, вывод:

Waiting five seconds... 
Sending message... 
Received <Foo{foo='Hello from RabbitMQ!'}> 

, когда мы используйте Foo следующим образом:

@Override 
public String toString() { 
    return "Foo{" + 
      "foo='" + foo + '\'' + 
      '}'; 
} 

с соответствующими геттерами и сеттерами.

 Смежные вопросы

  • Нет связанных вопросов^_^