首页 文章

什么是Spring JMS中的JmsTemplate回调?

提问于
浏览
7

这是我第一次使用 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 回答

  • 4

    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可能性(重载方法):

    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)
    

    What is happening? 回调的基本用法,如第3和第5签名,您可以在通过已配置的MessageConverter将对象转换为JMS消息后更改消息 . 你看到一个实际的目的地要由DestinationResolver在6日的情况下解决,你没有传递它,它将从JNDI解析,如果它在那里注册 .

    What does it mean?

    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接口允许您在转换消息之后但在发送之前访问消息 .

    In other words! 消息属性, Headers 和正文的设置无法封装在转换器类(SimpleMessageConverter)中,但MessagePostProcessor接口允许您在转换后但在发送之前访问消息 .

  • 8

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

相关问题