Получить идентификатор сообщения от производителя.send (сообщение) - PullRequest
0 голосов
/ 21 июня 2019

Как я могу получить MessageId после отправки сообщения, но без использования сообщения?

У меня есть этот метод, который отправляет сообщение в очередь

public void sentMessage(JmsTemplate jmsTemplate, String queueName, String message, String uuid) {
        jmsTemplate.convertAndSend(queueName, message,
                new MessagePostProcessor() {
                    @Override
                    public Message postProcessMessage(Message message) throws JMSException {
                        message.setStringProperty("uuid", uuid);
                        log.info("CorId:{}", message.getJMSCorrelationID());
                        return message;
                    }
                });
    }

но мне нужно было узнать идентификатор после отправки сообщения, но без использования сообщения, и я написал этот метод:

public ApplicationRunner sentMessage(JmsTemplate jmsTemplate, String queueName, String message, String uuid) {
        return args -> {
            final AtomicReference<Message> msg = new AtomicReference<>();
            jmsTemplate.convertAndSend(queueName, message, m -> {
                msg.set(m);
                return m;
            });
            String message1 = msg.get().getJMSCorrelationID();
            log.info("CorId:{}", message1);
        };
    }

как переписать метод, чтобы вы могли вызвать его в другом классе и получить messageId?

Я пишу это

public String sentMessage(JmsTemplate jmsTemplate, String queueName, String message, String uuid) throws JMSException {
        return t -> {
            final AtomicReference<Message> msg = new AtomicReference<>();
            jmsTemplate.convertAndSend(queueName, message, m -> {
                msg.set(m);
                return m;
            });
            return msg.get().getJMSCorrelationID();
        };
    }

но получите ошибку: целевой тип лямбда-преобразования должен быть интерфейсом

1 Ответ

0 голосов
/ 21 июня 2019

Почему вы используете там лямбду? Что такое t? A String не является Consumer<?>.

public String sentMessage(JmsTemplate jmsTemplate, String queueName, String message, String uuid)
        throws JMSException {

    final AtomicReference<Message> msg = new AtomicReference<>();
    jmsTemplate.convertAndSend(queueName, message, m -> {
        msg.set(m);
        return m;
    });
    return msg.get().getJMSCorrelationID();
}

- это все, что вам нужно.

...