首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用JmsTemplate设置replyTo?

如何用JmsTemplate设置replyTo?
EN

Stack Overflow用户
提问于 2017-09-14 18:10:59
回答 1查看 3.1K关注 0票数 1

我让一个消费者消费一条消息,进行一些转换,然后创建一个新的Pojo并将其传递给生产者。生产者使用JmsTemplate在队列中发送消息。生产者应该将原始消息的头部(如(JMSType,JMSCorrelationID,JMSExpiration,JMSDeliveryMode) )设置为要发送的新消息。但是生产者应该更改原始消息的replyTo目的地。我还没有找到创建目的地并设置为JMSReplyTo的方法。有些人知道我如何做到这一点?

也许JmsTemplate不是做这件事的正确类。

代码语言:javascript
复制
public class Producer {

    private final JmsTemplate jmsTemplate;

    @Value("${jms-destination}")
    private String destination;

    public Producer(@Autowired JmsTemplate jmsTemplate) {
        this.jmsTemplate = jmsTemplate;
    }

    public void send(final MessageHeaders headers, final Pojo pojo) {
        Validate.notNull(order);

        jmsTemplate.convertAndSend(destination, pojo, (message) -> {
          final Destination replyToDestination = ???;
          message.setJMSReplyTo(replyToDestination);

          message.setJMSType((String) headers.get(JmsHeaders.TYPE));
          message.setJMSCorrelationID((String) headers.get(JmsHeaders.CORRELATION_ID));
          message.setJMSExpiration((long) headers.get(JmsHeaders.EXPIRATION));
          message.setJMSDeliveryMode((int) headers.get(JmsHeaders.DELIVERY_MODE));
          return message;
      });

    }
}

我发现只有这种方法可以做到,但我不喜欢也不确定这会带来副作用:

代码语言:javascript
复制
public class Producer {

    private final JmsTemplate jmsTemplate;

    @Value("${jms-destination}")
    private String destination;

    @Value("${jms-replyTo}")
    private String replyTo;

    public Producer(@Autowired JmsTemplate jmsTemplate) {
        this.jmsTemplate = jmsTemplate;
    }

    public void send(final MessageHeaders headers, Pojo pojo) {
        Validate.notNull(order);

        jmsTemplate.convertAndSend(destination, order, (message) -> {
          final Destination replyToDestination = buildReplyTo();
          message.setJMSReplyTo(replyToDestination);

          message.setJMSType((String) headers.get(JmsHeaders.TYPE));
          message.setJMSCorrelationID((String) headers.get(JmsHeaders.CORRELATION_ID));
          message.setJMSExpiration((long) headers.get(JmsHeaders.EXPIRATION));
          message.setJMSDeliveryMode((int) headers.get(JmsHeaders.DELIVERY_MODE));
          return message;
      });

    }

    private Destination buildReplyTo() throws JMSException {
      final Session session = jmsTemplate.getConnectionFactory().createConnection()
          .createSession(false, Session.AUTO_ACKNOWLEDGE);
      final Destination queue =
          jmsTemplate.getDestinationResolver().resolveDestinationName(session, replyTo, false);
      return queue;
    }

}
EN

回答 1

Stack Overflow用户

发布于 2019-08-19 20:39:06

您的解决方案创建了不闭合的侧向连接。您应该使用已有的session对象,通过send API手动发送您的pojo。使用getRequiredMessageConverter转换您的pojo。

代码语言:javascript
复制
public void send(final MessageHeaders headers, Pojo pojo) {
    Validate.notNull(order);

    final String responseQueue = "responseQ";
    jmsTemplate.send(destination,
            session -> {
                Message message = getRequiredMessageConverter().toMessage(message, session);
                message.setJMSReplyTo(session.createQueue(responseQueue)); //fill queue

                //any other setters             
                return message;
            });         
}

// based on Spring JmsTemplate library
private MessageConverter getRequiredMessageConverter() throws IllegalStateException {
    MessageConverter converter = jmsTemplate.getMessageConverter();
    if (converter == null) {
        throw new IllegalStateException("No 'messageConverter' specified. Check configuration of JmsTemplate.");
    } else {
        return converter;
    }
}   
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46216326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档