这是我第一次使用Spring JMS(以及一般的JMS),我对JmsTemplate回调的概念有些怀疑.
我知道JmsTemplate是一个从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回调,但可能这个断言是不正确的.
你能解释一下JmsTemplate回调究竟是什么吗?
辅助方法执行常见操作
并且为了更复杂的用法,委托了它的本质
处理任务到用户实现的回调接口.
在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可能性(重载方法):
jmsTemplate.convertAndSend(message)
jmsTemplate.convertAndSend(destination,message)
jmsTemplate.convertAndSend(message,postProcessor)
jmsTemplate.convertAndSend(destinationName,message)
jmsTemplate.convertAndSend(destination,message,postProcessor)
怎么了?
回调的基本用法如第3和第5签名是您可以在将对象转换为JMS消息后更改消息
通过配置的MessageConverter.
你看到一个实际的目的地要由DestinationResolver在6日的情况下解决,你没有传递它,它将从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接口允许您在转换消息之后但在发送之前访问消息.