这是我第一次使用 Spring JMS (以及一般的JMS),我对 JmsTemplate 回调的概念有一些疑问 .
我知道 JmsTemplate 是一个从Spring提供的类:
-
减少样板代码 .
-
透明地管理资源 .
-
将已检查的异常转换为运行时等效项 .
-
提供便利方法和回调 .
并且它用于消息生成和同步消息接收 . 它简化了JMS的使用,因为它在发送或同步接收消息时处理资源的创建和释放 .
阅读Spring官方文档(这里:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/jms.html)我发现:
使用JmsTemplate的代码只需要实现回调接口,为它们提供明确定义的高级 Contract . MessageCreator回调接口创建一个消息,给定由JmsTemplate中的调用代码提供的Session .
这对我来说并不清楚 . 这些回调究竟是什么?
一开始我认为回调是 JmsTemplate 提供的一种方法,但在这里阅读它看起来更类似于我必须实现的接口 . 这个怎么运作?
我也发现了这个例子:
SENDING A POJO THROUGHT JMS (using the 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回调究竟是什么吗?
2 回答
Spring模板类常见的设计原则是提供 helper methods to perform common operations 以及更复杂的用法, delegate the essence of the processing task to user implemented callback interfaces.
在JMS Connection中将从工厂获得
=>从创建的连接会话中,视图是一个工作单元,它还提供事务
=>从会话中创建不同类型的JMS消息,如TextMessage,ObjectMessage,MapMessage,BytesMessage和StreamMessage,方法如下:session.createTextMessage(“hello queue world”); session.createObjectMessage(someSerializedObject)等
=>同一会话还负责创建MessageProducer session.createProducer(destination)和MessageConsumer session.createConsumer(destination)的实例
您有以下convertAndSend可能性(重载方法):
What is happening? 回调的基本用法,如第3和第5签名,您可以在通过已配置的MessageConverter将对象转换为JMS消息后更改消息 . 你看到一个实际的目的地要由DestinationResolver在6日的情况下解决,你没有传递它,它将从JNDI解析,如果它在那里注册 .
What does it mean?
在这个示例中,您将看到JMS模板的send()方法,您正在提供匿名实现(回调),其中该方法允许您访问会话对象,并从该会话创建自定义的session.createTextMessage(“hello queue world”)信息 .
convertAndSend中的相同方式(您可以访问要修改的后处理器)
消息对象已创建但您正在修改它(除了名称和年龄之外还添加了两个属性) . MessagePostProcessor接口允许您在转换消息之后但在发送之前访问消息 .
In other words! 消息属性, Headers 和正文的设置无法封装在转换器类(SimpleMessageConverter)中,但MessagePostProcessor接口允许您在转换后但在发送之前访问消息 .
它允许您对JMS实体进行低级访问(例如,使用
execute()
到SessionCallback
中的Session
),同时在操作完成时仍然可靠地释放资源 .