Spring AMQP - MessageListenerAdapter - передать дополнительные аргументы - PullRequest
0 голосов
/ 16 октября 2018

Чтобы создать SimpleMessageListenerContainer, я делаю что-то вроде этого.

SimpleMessageConsumer simpleMessageConsumer = new SimpleMessageConsumer();

MessageListenerAdapter adapter =
    new CustomMessageListenerAdapater(simpleMessageConsumer);
adapter.setDefaultListenerMethod("consume");
adapter.setMessageConverter(new SimpleMessageConverter());

SimpleMessageListenerContainer
    container =
    new SimpleMessageListenerContainer(connectionFactory);

container.setMessageListener(adapter);

Мой SimpleMessageConsumer

  public void consume(String message){
      log.info(message);
}

В Spring-amqp-refrence я заметил, что " аннотированная инфраструктура конечных точек прослушивателя "позволяет вам удобно передавать дополнительные свойства сообщения вашему потребителю, например, так:

@RabbitListener(queues = "myQueue")
public void processOrder(Order order, @Header("order_type") String orderType) {
...
}

Можно ли это сделать с помощью подхода создания потребителя, о котором я упоминал выше?Я хочу получить доступ к некоторым заголовкам объекта Message.Я знаю, что могу заставить моего потребителя реализовать MessageListener или ChannelAwareMessageListener и иметь доступ ко всему объекту Message.Однако мне не нужен весь объект Message, поскольку мне нравится удобство использования ContentTypeDelegatingMessageConverter с Jackson2JsonMessageConverter для преобразования в желаемый тип (в моем реальном приложении) до того, как мой потребительский делегированный метод будет запущен.

Ответы [ 2 ]

0 голосов
/ 16 октября 2018
public class CustomMessageListenerAdapter extends MessageListenerAdapter {



 public CustomMessageListenerAdapter(Object delegate) {
    super(delegate);
  }

  @Override
  protected Object invokeListenerMethod(String methodName, Object[] arguments,
      Message originalMessage) throws Exception {


    Object[] modifiedArguments = new Object[arguments.length+1];
    System.arraycopy(arguments, 0, modifiedArguments,
                     0, arguments.length);

    //add the original message with headers
    modifiedArguments[arguments.length] = originalMessage;

    return super.invokeListenerMethod(methodName, modifiedArguments, originalMessage);
  }

}

и у моего потребителя сообщений теперь есть дополнительный аргумент - исходное сообщение

public class SimpleMessageConsumer {


  private static final Logger log = LoggerFactory.getLogger(SimpleMessageConsumer.class);


  public void consume(String messageConverted, Message originalMessage){
    log.info(originalMessage.toString());
  }

}

Моя конфигурация бина выглядит примерно так:

SimpleMessageConsumer simpleMessageConsumer = new SimpleMessageConsumer();

    MessageListenerAdapter adapter =
        new CustomMessageListenerAdapter(simpleMessageConsumer);
    adapter.setDefaultListenerMethod("consume");
    adapter.setMessageConverter(messageConverter());

//container
    SimpleMessageListenerContainer
        container =
        new SimpleMessageListenerContainer(connectionFactory);

    container.setMessageListener(adapter);
0 голосов
/ 16 октября 2018

Вам нужно использовать MessagingMessageConverter с payloadConverter в качестве упомянутого Jackson2JsonMessageConverter, а затем в вашем CustomMessageListenerAdapater вы переопределяете там:

/**
 * Build an array of arguments to be passed into the target listener method. Allows for multiple method arguments to
 * be built from a single message object.
 * <p>
 * The default implementation builds an array with the given message object as sole element. This means that the
 * extracted message will always be passed into a <i>single</i> method argument, even if it is an array, with the
 * target method having a corresponding single argument of the array's type declared.
 * <p>
 * This can be overridden to treat special message content such as arrays differently, for example passing in each
 * element of the message array as distinct method argument.
 * @param extractedMessage the content of the message
 * @return the array of arguments to be passed into the listener method (each element of the array corresponding to
 * a distinct method argument)
 */
protected Object[] buildListenerArguments(Object extractedMessage) {

приведение этого extractedMessage кMessage<?> и извлеките нужные заголовки, если это так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...