Spring之JMS之发送消息

来源:互联网 发布:grpc golang用法 编辑:程序博客网 时间:2024/04/29 05:45

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()方法执行这些回调方法。



0 0