Spring之JMS之发送消息

2 篇文章 0 订阅

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


[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. import javax.jms.ConnectionFactory;  
  2. import javax.jms.JMSException;  
  3. import javax.jms.Message;  
  4. import javax.jms.Queue;  
  5. import javax.jms.Session;  
  6.   
  7. import org.springframework.jms.core.MessageCreator;  
  8. import org.springframework.jms.core.JmsTemplate;  
  9.   
  10. public class JmsQueueSender {  
  11.   
  12.     private JmsTemplate jmsTemplate;  
  13.     private Queue queue;  
  14.   
  15.     public void setConnectionFactory(ConnectionFactory cf) {  
  16.         this.jmsTemplate = new JmsTemplate(cf);  
  17.     }  
  18.   
  19.     public void setQueue(Queue queue) {  
  20.         this.queue = queue;  
  21.     }  
  22.   
  23.     public void simpleSend() {  
  24.         this.jmsTemplate.send(this.queue, new MessageCreator() {  
  25.             public Message createMessage(Session session) throws JMSException {  
  26.                 return session.createTextMessage("hello queue world");  
  27.             }  
  28.         });  
  29.     }  
  30. }  


这个例子使用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转换为一条消息前如何修改消息头和一个属性。


[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public void sendWithConversion() {  
  2.     Map map = new HashMap();  
  3.     map.put("Name""Mark");  
  4.     map.put("Age"new Integer(47));  
  5.     jmsTemplate.convertAndSend("testQueue", map, new MessagePostProcessor() {  
  6.         public Message postProcessMessage(Message message) throws JMSException {  
  7.             message.setIntProperty("AccountID"1234);  
  8.             message.setJMSCorrelationID("123-00001");  
  9.             return message;  
  10.         }  
  11.     });  
  12. }  

这是消息格式的结果:


[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. MapMessage={  
  2.     Header={  
  3.         ... standard headers ...  
  4.         CorrelationID={123-00001}  
  5.     }  
  6.     Properties={  
  7.         AccountID={Integer:1234}  
  8.     }  
  9.     Fields={  
  10.         Name={String:Mark}  
  11.         Age={Integer:47}  
  12.     }  
  13. }  


23.3.2 SessionCallback和ProducerCallback


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值