将Sun的Open Message Queue与Spring集成

1.       前言

基于JMS标准的消息中间件实现的产品有很多,JBossMQActiveMQOpenMQOpenJMS等等,最常用的还是apacheActiveMQ。有时也使用SunOpenMQ。在官网http://mq.java.net/处可以下载。Open Message QueueSun Java System Message Queue的一个开源版本。Open message queue是一个企业级,可升级,非常成熟的消息服务器。它为面向消息的系统集成提供一套完整的JMSJava Message Service )实现。由于Open MQ源自SunJava Message Queue,所以其具有Java System Message Queue拥有的所有特性,功能和性能。

2.       环境配置

下载后将相关的jar拷贝到项目的classpath下面。笔者在此为了安全起见,引入了很多jar包,将语言包都引入了。各位读者可以因地制宜。

以下是引入jar包的列表

Java代码   收藏代码
  1. lib/openmqjar/common-message.jar  
  2. lib/openmqjar/fscontext.jar  
  3. lib/openmqjar/grizzly.jar  
  4. lib/openmqjar/imq_de.jar  
  5. lib/openmqjar/imq_es.jar  
  6. lib/openmqjar/imq_fr.jar  
  7. lib/openmqjar/imq_it.jar  
  8. lib/openmqjar/imq_ja.jar  
  9. lib/openmqjar/imq_ko.jar  
  10. lib/openmqjar/imq_pt_BR.jar  
  11. lib/openmqjar/imq_zh_CN.jar  
  12. lib/openmqjar/imq_zh_TW.jar  
  13. lib/openmqjar/imq.jar  
  14. lib/openmqjar/imqadmin.jar  
  15. lib/openmqjar/imqbridgemgr.jar  
  16. lib/openmqjar/imqbroker.jar  
  17. lib/openmqjar/imqjmsbridge.jar  
  18. lib/openmqjar/imqjmsra.rar  
  19. lib/openmqjar/imqjmx_de.jar  
  20. lib/openmqjar/imqjmx_es.jar  
  21. lib/openmqjar/imqjmx_fr.jar  
  22. lib/openmqjar/imqjmx_it.jar  
  23. lib/openmqjar/imqjmx_ja.jar  
  24. lib/openmqjar/imqjmx_ko.jar  
  25. lib/openmqjar/imqjmx_pt_BR.jar  
  26. lib/openmqjar/imqjmx_zh_CN.jar  
  27. lib/openmqjar/imqjmx_zh_TW.jar  
  28. lib/openmqjar/imqjmx.jar  
  29. lib/openmqjar/imql10n_server_de.jar  
  30. lib/openmqjar/imql10n_server_es.jar  
  31. lib/openmqjar/imql10n_server_fr.jar  
  32. lib/openmqjar/imql10n_server_it.jar  
  33. lib/openmqjar/imql10n_server_ja.jar  
  34. lib/openmqjar/imql10n_server_ko.jar  
  35. lib/openmqjar/imql10n_server_pt_BR.jar  
  36. lib/openmqjar/imql10n_server_zh_CN.jar  
  37. lib/openmqjar/imql10n_server_zh_TW.jar  
  38. lib/openmqjar/imqservlet.jar  
  39. lib/openmqjar/imqstomp.jar  
  40. lib/openmqjar/imqutil.jar  
  41. lib/openmqjar/imqxm.jar  
  42. lib/openmqjar/jaxm-api.jar  
  43. lib/openmqjar/jhall.jar  
  44. lib/openmqjar/jms.jar  
  45. lib/openmqjar/jta.jar  
  46. lib/openmqjar/protobuf-2.3.0.jar  

3.       之后项目加入Spring的相关jar包。

增加Spring配置文件内容如下:

Java代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"  
  4.     xsi:schemaLocation="http://www.springframework.org/schema/beans   
  5.         http://www.springframework.org/schema/beans/spring-beans-2.5.xsd   
  6.         http://www.springframework.org/schema/context   
  7.         http://www.springframework.org/schema/context/spring-context-2.5.xsd"  
  8.     default-autowire="byName">  
  9.   
  10.     <!--消息连接工厂-->  
  11.     <bean id="connectionfactoryfactory"  
  12.         class="message.listener.OpenMqConnectionFactory">  
  13.         <property name="properties">  
  14.             <props>  
  15.                 <prop key="imqAddressList">127.0.0.1:7676</prop>  
  16.                 <prop key="imqDefaultUsername">admin</prop>  
  17.                 <prop key="imqDefaultPassword">admin</prop>  
  18.                 <prop key="imqReconnectEnabled">true</prop>  
  19.                 <prop key="imqReconnectAttempts">3</prop>  
  20.                 <prop key="imqReconnectInterval">5000</prop>  
  21.                 <prop key="imqAddressListBehavior">RANDOM</prop>  
  22.             </props>  
  23.         </property>  
  24.     </bean>  
  25.   
  26.     <bean id="mqConnectionFactory" factory-bean="connectionfactoryfactory"  
  27.         factory-method="createConnectionFactory" />  
  28.   
  29.     <!--设置广发消息目的-->  
  30.     <bean id="updateLocalRouteMap" class="com.sun.messaging.Topic">  
  31.         <constructor-arg type="java.lang.String" value="mytopic" />  
  32.     </bean>  
  33.   
  34.     <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">  
  35.         <property name="connectionFactory" ref="mqConnectionFactory" />  
  36.         <property name="defaultDestination" ref="updateLocalRouteMap" />  
  37.         <property name="receiveTimeout" value="20000" />  
  38.     </bean>  
  39.   
  40.     <!--消息监听器-->  
  41.     <bean id="messageListener1"  
  42.         class="org.springframework.jms.listener.adapter.MessageListenerAdapter">  
  43.         <constructor-arg>  
  44.             <bean  
  45.                 class="message.listener.JMSMessageListener" />  
  46.         </constructor-arg>  
  47.         <property name="defaultListenerMethod" value="receive" />  
  48.         <property name="messageConverter">  
  49.             <null />  
  50.         </property>  
  51.     </bean>  
  52.   
  53.     <!—实际的消息监消费者配置-->  
  54.     <bean id="consumercontainer"  
  55.         class="org.springframework.jms.listener.DefaultMessageListenerContainer">  
  56.         <property name="connectionFactory" ref="mqConnectionFactory" />  
  57.         <property name="destination" ref="updateLocalRouteMap" />  
  58.         <property name="messageListener" ref="messageListener1" />  
  59.         <property name="transactionTimeout" value="180000" />  
  60.         <property name="receiveTimeout" value="180000" />  
  61.         <property name="sessionTransacted" value="true" />  
  62.     </bean>  
  63. </beans>  

4.       消息监听器

类代码如下

 

Java代码   收藏代码
  1. /** 
  2.  * JMS消息消费者。 
  3.  * 接收JMS消息后获得router想要的消息后,调用router接口更新本地缓存 
  4.  * @author liuyan 
  5.  *  
  6.  */  
  7. public class JMSMessageListener implements MessageListener {  
  8.   
  9.     private Logger log = Logger.getLogger(JMSMessageListener.class.getName());  
  10.   
  11.     /** 
  12.      * 接收JMS消息后的业务处理 
  13.      */  
  14.     public void onMessage(Message message) {  
  15.   
  16.         log.info("接收消息……");  
  17.         byte[] byteMessage = JMSByteConverterUtil  
  18.                 .ConverterMessageToBttes(message);  
  19.         try {  
  20.   
  21.             log.info("将转型成实体对象……");  
  22.             //……………………………………………………  
  23.   
  24.             }  
  25.   
  26.         } catch (InvalidProtocolBufferException e) {  
  27.             log.error("JMS异常" + e.getMessage());  
  28.             e.printStackTrace();  
  29.         } catch (Exception e) {  
  30.             log.error("其他异常" + e.getMessage());  
  31.             e.printStackTrace();  
  32.         }  
  33.     }  
  34. }  

 因为一些原因此处就不给出完整代码了~~~反正是获取一个字节流后,转成对象,直接从对象中获取想要的信息。转成对象的辅助类如下

Java代码   收藏代码
  1. /** 
  2.  * 对获得的消息对象进行转型 
  3.  * @author liuyan 
  4.  */  
  5. public class JMSByteConverterUtil {  
  6.   
  7.     private static Logger log = Logger.getLogger(JMSMessageListener.class  
  8.             .getName());  
  9.       
  10.     /** 
  11.      * 对获得的消息对象进行转型 
  12.      * @param message 
  13.      * @return 
  14.      */  
  15.     public static byte[] ConverterMessageToBttes(Message message) {  
  16.   
  17.         if (message == null) {  
  18.             log.error("消息对象为空……");  
  19.             return null;  
  20.         } else if (message instanceof BytesMessage) {  
  21.   
  22.             log.debug("消息强制转型BytesMessage");  
  23.             BytesMessage bytesMessage = (BytesMessage) message;  
  24.   
  25.             byte[] messageBytes;  
  26.             try {  
  27.   
  28.                 log.debug("建立空的消息二进制数组");  
  29.                 messageBytes = new byte[(int) bytesMessage.getBodyLength()];  
  30.   
  31.                 log.debug("往二进制数组中写进二进制信息");  
  32.                 bytesMessage.readBytes(messageBytes);  
  33.   
  34.                 log.debug("messageBytes.length=" + messageBytes.length);  
  35.                 return messageBytes;  
  36.   
  37.             } catch (JMSException e) {  
  38.                 log.error("JMS错误:" + e.getMessage());  
  39.                 e.printStackTrace();  
  40.                 return null;  
  41.             }  
  42.   
  43.         }else{  
  44.               
  45.             log.error("消息对象不能正确转型");  
  46.             return null;  
  47.         }  
  48.           
  49.     }  
  50. }  

 5.       启动消息监听器

开启OpenMQ的服务,启动{OpenMQ_HOME}\mq\bin\下的imqcmd.exe命令

启动消息消费者很简单,代码如下

Java代码   收藏代码
  1. public class MessageConsumer {  
  2.   
  3.     /** 
  4.      * @param args 
  5.      */  
  6.     public static void main(String[] args) {  
  7.         ApplicationContext applicationContext = new ClassPathXmlApplicationContext(  
  8.                 new String[] { "classpath:/spring/applicationContext-openmq-jms.xml" });  
  9.   
  10.         System.out.println(applicationContext.getId());  
  11.   
  12.     }  
  13. }  

 6.       消息发送者

启动消息消费者服务后,写一个测试类测试一下消息的,代码如下

Java代码   收藏代码
  1. public class MessageSender {  
  2.   
  3.     /** 
  4.      * @param args 
  5.      * @throws JMSException 
  6.      */  
  7.     public static void main(String[] args) throws JMSException {  
  8.         ConnectionFactory myConnFactory;  
  9.         myConnFactory = new com.sun.messaging.ConnectionFactory();  
  10.         myConnFactory.setProperty(ConnectionConfiguration.imqAddressList,  
  11.                 "mq://127.0.0.1:7676");  
  12.         myConnFactory.setProperty(ConnectionConfiguration.imqReconnectEnabled,  
  13.                 "true");  
  14.         Connection myConn = myConnFactory.createConnection();  
  15.         myConn.start();  
  16.         // Step 4:  
  17.         // Create a session within the connection.  
  18.         Session mySess = myConn.createSession(false, Session.AUTO_ACKNOWLEDGE);  
  19.         Topic myTopic = new com.sun.messaging.Topic("testmq");// .Queue("testmq");  
  20.         MessageProducer myMsgProducer = mySess.createProducer(myTopic);  
  21.   
  22.         ObjectMessage objectMessage = mySess.createObjectMessage();  
  23.   
  24.         RouterMessageBean routerMessageBean = new RouterMessageBean();  
  25.         routerMessageBean.setDbName("mysql-test");  
  26.         routerMessageBean.setUserName("liuyan");  
  27.         routerMessageBean.setMaster(null);  
  28.         routerMessageBean.setSlave(null);  
  29.           
  30.         objectMessage.setObject(routerMessageBean);  
  31.           
  32.         BytesMessage bytesMessage = mySess.createBytesMessage();  
  33.         bytesMessage.writeUTF("the message is 消息内容!");  
  34.           
  35.   
  36.         myMsgProducer.send(bytesMessage);  
  37.         System.out.println("测试发送JMS消息");  
  38.   
  39.         mySess.close();  
  40.         myConn.close();  
  41.   
  42.     }  
  43. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值