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接口给了你在转换后但在发送之前访问消息。
这是我第一次使用 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接口给了你在转换后但在发送之前访问消息。