Spring JMS 中的 JmsTemplate 回调是什么?

What is a JmsTemplate callback in Spring JMS?

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

我知道 JmsTemplate 是 class 从 Spring 提供给:

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

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

Code that uses the JmsTemplate only needs to implement callback interfaces giving them a clearly defined high level contract. The MessageCreator callback interface creates a message given a Session provided by the calling code in 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 callback 但这个断言可能不正确。

你能解释一下什么是 JmsTemplate 回调吗?

它允许您对 JMS 实体进行低级访问(例如,使用 execute() 访问 SessionCallback 中的 Session),同时在操作完成时仍然可靠地释放资源。

Spring模板classes的共同设计原则是提供 执行常见操作的辅助方法 对于更复杂的用法,委托 处理任务到用户实现的回调接口。

在JMS中Connection会从一个工厂中获取

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

=> 从会话中,您可以通过以下方式创建不同类型的 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 签名这样的回调的基本用途是您可以在将对象转换为 JMS 消息后更改消息 通过配置的 MessageConverter。 在第 6 个情况下,您会看到一个实际目标将由 DestinationResolver 解析,您没有传递它,它将从 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 接口使您可以在消息转换之后但在发送之前访问消息。

换句话说!消息属性、消息头和消息体的设置不能封装在转换器中class(SimpleMessageConverter),但是MessagePostProcessor接口给了你在转换后但在发送之前访问消息。