Spring之JMS之发送消息

本文介绍了Spring框架中JmsTemplate类的多种消息发送方法,包括使用MessageCreator、消息转换器、SessionCallback和ProducerCallback等高级特性。文章还探讨了如何自定义消息转换流程以及如何调整消息属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JmsTemplate包含了许多方法发送消息。有一些发送方法,其指定了目的地,使用了一个javax.jms.Destination对象并且还有那些使用一个String作为参数,需要JNDI查询。没有指定目的的发送方法使用默认的目的。下面是一个例子,发送消息到一个队列中。


import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Queue;
import javax.jms.Session;

import org.springframework.jms.core.MessageCreator;
import org.springframework.jms.core.JmsTemplate;

public class JmsQueueSender {

    private JmsTemplate jmsTemplate;
    private Queue queue;

    public void setConnectionFactory(ConnectionFactory cf) {
        this.jmsTemplate = new JmsTemplate(cf);
    }

    public void setQueue(Queue queue) {
        this.queue = queue;
    }

    public void simpleSend() {
        this.jmsTemplate.send(this.queue, new MessageCreator() {
            public Message createMessage(Session session) throws JMSException {
                return session.createTextMessage("hello queue world");
            }
        });
    }
}


这个例子使用MessageCreator回调从支持的Session对象中创建文本消息。JmsTemplate通过传递ConnectionFactory的引用构建。另外可选地,提供一个缺省的构造器和connectionFactory并可用于构建JavaBean类型的实例(使用一个BeanFactory或者POJO)。另外,考虑Spring的JmsGatewaySupport提供的基类,为JMS配置提供了预先内置的bean属性。


send(String destinationName, MessageCreator creator)方法让你使用目的的名字发送一条消息。如果这些名字在JNDI中注册,你需要给JndiDestinationResolver的实例设置这个模板的destinationResolver属性。


如果你创建了JmsTemplate并且指定了默认的目的,send(MessageCreator c)发送消息到目的地。


23.3.1 使用消息转换器

为方便发送领域模型对象,JmsTemplate有不同的发送方法,其针对一个消息的数据内容,以一个Java 对象作为参数。JmsTemplate中重载的方法convertAndSend()receiveAndConvert()将处理委派给MessageConverter接口的一个实例。接口定义了一个简单的协议在Java 对象和JMS消息之间进行转换。默认的实现SimpleMessageConverter支持StringTextMessagebyte[]BytesMesssagejava.util.MapMapMessage之间的转换。通过使用这个转化器,你和你的应用程序代码可以专心处理要发送的业务对象或者借助JMS接受的业务对象,而不必关注那些作为一个JMS消息如何如何表示的细节。


包含了MapMessageConverter的沙箱,使用反射在JavaBean和MapMessage之间进行转换。其他你可以自己实现的是转换器,其使用了一个已存在的XML组成的包,比如JAXB,Castor,XMLBeans,或者XStream,来创建表示对象的TextMessage


为调整消息属性的设置,消息头和主体,不能封装到一个转换器类内部,MessagePostProcessor,让你在其被转化后和发送前访问消息。下面的例子演示了在java.util.Map转换为一条消息前如何修改消息头和一个属性。


public void sendWithConversion() {
    Map map = new HashMap();
    map.put("Name", "Mark");
    map.put("Age", new Integer(47));
    jmsTemplate.convertAndSend("testQueue", map, new MessagePostProcessor() {
        public Message postProcessMessage(Message message) throws JMSException {
            message.setIntProperty("AccountID", 1234);
            message.setJMSCorrelationID("123-00001");
            return message;
        }
    });
}

这是消息格式的结果:


MapMessage={
	Header={
		... standard headers ...
		CorrelationID={123-00001}
	}
	Properties={
		AccountID={Integer:1234}
	}
	Fields={
		Name={String:Mark}
		Age={Integer:47}
	}
}


23.3.2 SessionCallback和ProducerCallback


发送方法囊括了大多数通用的使用场景,也有这些场景,你想在一个JMS的会话或MessageProducer执行多个操作。SessionCallbackProducerCallback分别暴露JMS会话和成对的Session / MessageProducerJmsTemplate上的execute()方法执行这些回调方法。



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值