从producer.send(message)获取消息ID

时间:2019-06-21 17:04:37

标签: java-8 spring-jms

发送消息后如何获取消息ID,但又不消耗消息?

我有这种将消息发送到队列的方法

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;
                    }
                });
    }

但是我需要在发送消息后找出ID,但不消耗消息,因此我编写了此方法:

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();
        };
    }

但出现错误:lambda转换的目标类型必须是接口

1 个答案:

答案 0 :(得分:0)

您为什么在那使用lambda?什么是tString不是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();
}

是您所需要的。