java – Spring JMS中的JmsTemplate回调是什么?

这是我第一次使用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回调究竟是什么吗?

最佳答案
Spring模板类常见的设计原则是提供
辅助方法执行常见操作
并且为了更复杂的用法,委托了它的本质
处理任务到用户实现的回调接口.

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

相关文章

Spring Cloud为Spring Boot应用程序提供Netflix OSS集成。 提供的功能模块包括服务发现(Eureka),断路...
Spring Cloud 学习笔记;maven配置;入门学习;基于Spring Boot 实现;服务端配置,客户端配置;
可以毫不夸张地说,这篇文章介绍的 Spring/SpringBoot 常用注解基本已经涵盖你工作中遇到的大部分常用的...
Spring中各种方式进行日期时间处理,有作用于单个实体的,也有作用于全局的,有作用于请求入参的,有作...
跨域资源共享(Cross-origin resource sharing)(CORS)是W3C的标准,大部分的浏览器都实现了这个标准...
Spring Boot使创建基于Spring的应用程序变得轻松,大部分的SpringBoot应用程序都只需要很少的Spring配置...