Spring JMS中的JmsTemplate回调是什么?

Java浏览器

这是我第一次使用Spring JMS(以及一般的JMS),并且我对JmsTemplate回调的概念有些怀疑

我知道JmsTemplate是从Spring提供给以下人员的类:

  • 减少样板代码。
  • 透明地管理资源。
  • 将检查的异常转换为运行时等效项。
  • 提供便利的方法和回调。

并用于消息生成和同步消息接收。由于它在发送或同步接收消息时处理资源的创建和释放,因此它简化了JMS的使用。

我发现阅读Spring官方文档(在这里:http : //docs.spring.io/spring/docs/current/spring-framework-reference/html/jms.html):

使用JmsTemplate的代码仅需要实现回调接口,从而为它们提供明确定义的高级协定。MessageCreator回调接口根据JmsTemplate中的调用代码提供的会话创建消息。

这对我来说还不清楚。这些回调到底是什么?

一开始我以为回调是JmsTemplate提供的方法,但是在这里阅读似乎与我必须实现的接口更相似。怎么运行的?

我也发现了这个例子:

通过JMS发送POJO(使用JmsTemplate):

public class JmsOrderManager implements OrderManager {
    @Autowired JmsTemplate jmsTemplate;
    @Autowired Destination orderQueue;

    public void placeOrder(Order order) {
        String stringMessage = "New order " + order.getNumber();
        jmsTemplate.convertAndSend("messageQueue", stringMessage );
        // use destination resolver and message converter
        jmsTemplate.convertAndSend(orderQueue, order); // use message converter
        jmsTemplate.convertAndSend(order); // use converter and default destination
    }
}

我以为convertAndSend()方法是一个JmsTemplate回调,但此断言可能不正确。

您能解释一下JmsTemplate回调到底是什么吗?

克里希纳

Spring模板类共有的设计原则是提供辅助方法来执行常见操作,并且为了更复杂的使用,将处理任务的实质委托给用户实现的回调接口。

在JMS中,连接将从工厂获得

=>从建立连接会话开始,渗出是工作的一个单元,它还提供事务

=>从会话中,您可以通过以下方式创建不同类型的JMS消息,例如TextMessage,ObjectMessage,MapMessage,BytesMessage和StreamMessage。session.createTextMessage(“ hello queue world”); session.createObjectMessage(someSerializedObject)等

=>同一会话还负责创建MessageProducer session.createProducer(destination)和MessageConsumer session.createConsumer(destination)的实例

您具有以下convertAndSend可能性(重载方法):

        jmsTemplate.convertAndSend(message)
        jmsTemplate.convertAndSend(destination, message)
        jmsTemplate.convertAndSend(message, postProcessor)
        jmsTemplate.convertAndSend(destinationName, message)
        jmsTemplate.convertAndSend(destination, message, postProcessor)
        jmsTemplate.convertAndSend(destinationName, message, postProcessor)

怎么了?回调的基本用法(例如第3个第5个和第6个签名)是,您可以在通过已配置的MessageConverter将对象转换为JMS消息之后更改消息。您看到的是第6种情况下DestinationResolver解析的实际目的地,您没有传递它,如果在JNDI中注册,它将通过JNDI解析。

这是什么意思?

jmsTemplate.send(this.queue, new MessageCreator() {
public  Message createMessage(Session session) throws JMSException {
        return  session.createTextMessage("hello queue world");
    }
});

在此示例中,在此示例中看到的是使用JMS模板的send()方法提供的匿名实现(回调),该方法使您可以访问会话对象,并从该会话中创建自定义的session.createTextMessage(“ hello queue world”)信息。

convertAndSend中的方法相同(您可以访问后处理器进行修改)

public void ConvertSend() {
Map map = new HashMap();
map.put("Name", "Vimal");
map.put("Age", new Integer(45));
jmsTemplate.convertAndSend("jmsQueue", map, new MessagePostProcessor() {
    public Message postProcessMessage(Message message) throws JMSException {
        message.setIntProperty("ID", 9999);
        message.setJMSCorrelationID("123-99999");
        return message;
       }
   });
}

已创建消息对象,但您正在对其进行修改(除了名称和年龄之外,还添加了两个其他属性)。MessagePostProcessor接口使您可以在转换消息之后但在发送消息之前对其进行访问。

换一种说法!消息属性,标头和正文的设置不能封装在转换器类(SimpleMessageConverter)中,但是MessagePostProcessor接口使您可以在转换消息之后但在发送之前访问消息。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章