spring监听与IBM MQ JMS整合

Posted 心若不动,风又奈何;你若不伤,岁月无恙。

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring监听与IBM MQ JMS整合相关的知识,希望对你有一定的参考价值。

spring xml 的配置:

 文件名:applicationContext-biz-mq.xml

  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"  
  4.     xmlns:tx="http://www.springframework.org/schema/tx"  
  5.     xmlns:jms="http://www.springframework.org/schema/jms"  
  6.     xmlns:aop="http://www.springframework.org/schema/aop"  
  7.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
  8.         http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd  
  9.         http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd  
  10.         http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-3.0.xsd ">  
  11.     <description>MQ</description>  
  12.   
  13.     <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
  14.         <property name="locations">  
  15.             <list>  
  16.                 <value>classpath:/mqconnect.properties</value>  
  17.             </list>  
  18.         </property>  
  19.         <property name="ignoreUnresolvablePlaceholders" value="true" />  
  20.     </bean>  
  21.       
  22.     <!-- 业务实现类 -->  
  23.     <bean id="callRecordBiz" class="com.zmcc.servicemanager.biz.impl.CallRecordBizImpl" autowire="byName"/>  
  24.       
  25.     <!-- <bean id="mqMessageSend" class="com.zmcc.servicemanager.mq.MQMessageSend">  
  26.         jie  
  27.         <property name="queueManagerName" value="${queue.manager.send}" />  
  28.         <property name="host" value="${queue.manager.host.send}" />  
  29.         <property name="destinationName" value="${queue.name.send}" />  
  30.     </bean>  
  31.   
  32.     <bean id="mqMessageReceiveListener" class="com.zmcc.servicemanager.mq.MQMessageReceiveListener" init-method="start">  
  33.         接收方队列管理器名  
  34.         <property name="queueManagerName" value="${queue.manager.get}" />  
  35.         <property name="host" value="${queue.manager.host.get}" />  
  36.         <property name="destinationName" value="${queue.name.get}" />  
  37.     </bean> -->  
  38.       
  39.      <!-- WebSphere MQ Connection Factory -->    
  40.      <bean id="mqConnectionFactory" class="com.ibm.mq.jms.MQConnectionFactory">  
  41.         <property name="hostName" value="${queue.manager.host.get}"/>  
  42.         <property name="queueManager" value="${queue.manager.get}"/>  
  43.         <property name="channel" value="${app.mq.channel}"/>  
  44.         <property name="port" value="${app.mq.port}"/>  
  45.         <property name="transportType" value="${app.mq.transportType}"/>  
  46.      </bean>  
  47.    
  48.     <!-- JMS Queue Connection Factory -->  
  49.     <bean id="transactionManager" class="org.springframework.jms.connection.JmsTransactionManager">  
  50.         <property name="connectionFactory" ref="mqConnectionFactory"/>  
  51.     </bean>  
  52.    
  53.     <!-- JMS Destination Resolver -->   
  54.     <!-- <bean id="jmsDestinationResolver" class="org.springframework.jms.support.destination.DynamicDestinationResolver" /> -->  
  55.     <bean id="messageConverter" class="com.zmcc.servicemanager.mq.spring.MessageConverter" />  
  56.   
  57.     <!-- 定义接收者 -->  
  58.     <bean  id="messageListener" class="com.zmcc.servicemanager.mq.spring.MessageListener" >  
  59.         <property name="callRecordBiz" ref="callRecordBiz" />  
  60.     </bean>  
  61.       
  62.     <!-- JMS  listener -->  
  63.     <!-- <bean id="messageListenerAdapter" class="org.springframework.jms.listener.adapter.MessageListenerAdapter">  
  64.         <property name="defaultListenerMethod" value="receviedMessage"/>  
  65.         <property name="messageConverter" ref="messageConverter"/>  
  66.         <property name="delegate" ref="messageListener"/>  
  67.     </bean> -->  
  68.       
  69.     <!--   
  70.         JMS listener   
  71.         listener:org.springframework.jms.listener.adapter.MessageListenerAdapter  
  72.         message-converter="messageConverter",  
  73.     -->  
  74.     <jms:listener-container connection-factory="mqConnectionFactory" transaction-manager="transactionManager"   
  75.         message-converter="messageConverter">  
  76.         <jms:listener destination="${queue.name.get}" ref="messageListener" method="receviedMessage" />  
  77.     </jms:listener-container>  
  78.       
  79. </beans>  

 

 

mqconnect.properties配置文件:

  1. #通道名  
  2. app.mq.channel=SYSTEM.DEF.SVRCONN  
  3. #传输类型  
  4. app.mq.transportType=1  
  5. #端口号  
  6. app.mq.port=1414  
  7. #队列管理器名称-发送方  
  8. queue.manager.send=WMQ1QM  
  9. #主机地址-发送方  
  10. queue.manager.host.send=10.70.175.81  
  11. #队列名称-发送方  
  12. queue.name.send=WMQ1OutputQ  
  13.   
  14. #队列管理器名称--接收方  
  15. queue.manager.get=WMQ2QM  
  16. #主机地址--接收方  
  17. queue.manager.host.get=10.70.175.82  
  18. #队列名称--接收方  
  19. queue.name.get=WMQ2InputQ  

 

MessageTest.Java测试文件,用来启动接收监听的配置文件:

  1. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  2.   
  3. public class MessageTest {  
  4.   
  5.     /** 
  6.      * @param args 
  7.      */  
  8.     public static void main(String[] args) {  
  9.         new ClassPathXmlApplicationContext("classpath*:/applicationContext-biz-mq.xml");  
  10.   
  11.     }  
  12.   
  13. }  

 

MessageListener.java监听文件:

  1. import com.zmcc.servicemanager.biz.CallRecordBiz;  
  2. import com.zmcc.servicemanager.domain.CallRecord;  
  3.   
  4. /** 
  5.  * 消息监听器 
  6.  * @author ZouXia 
  7.  * 
  8.  */  
  9. public class MessageListener{  
  10.   
  11.     private CallRecordBiz callRecordBiz;  
  12.       
  13.     /** 
  14.      * 接收消息 
  15.      * @param callRecord 
  16.      */  
  17.     public void receviedMessage(CallRecord callRecord) {  
  18.         System.out.println(callRecord.getRequestContent());  
  19. //      callRecordBiz.saveEntity(callRecord);  
  20.     }  
  21.   
  22.     public CallRecordBiz getCallRecordBiz() {  
  23.         return callRecordBiz;  
  24.     }  
  25.   
  26.     public void setCallRecordBiz(CallRecordBiz callRecordBiz) {  
  27.         this.callRecordBiz = callRecordBiz;  
  28.     }  
  29.       
  30. }  

 

MessageConverter.java用来转换的类:

  1. import javax.jms.JMSException;  
  2. import javax.jms.Message;  
  3. import javax.jms.Session;  
  4. import javax.jms.TextMessage;  
  5.   
  6. import org.springframework.jms.support.converter.MessageConversionException;  
  7.   
  8. import com.zmcc.servicemanager.domain.CallRecord;  
  9.   
  10. /** 
  11.  * 消息转换器 
  12.  * @author ZouXia 
  13.  * 
  14.  */  
  15. public class MessageConverter implements org.springframework.jms.support.converter.MessageConverter {  
  16.   
  17.     /** 
  18.      * 发送消息的转换 
  19.      */  
  20.     public Message toMessage(Object object, Session session) throws JMSException, MessageConversionException {  
  21.         return null;  
  22.     }  
  23.   
  24.     /** 
  25.      * 接收消息的转换 
  26.      */  
  27.     public Object fromMessage(Message message) throws JMSException,MessageConversionException {  
  28.         // TODO  
  29.         TextMessage mapMessage = (TextMessage) message;  
  30.         CallRecord callRecord = new CallRecord();  
  31.         callRecord.setEndTime(new Date());  
  32.         callRecord.setRequestContent(mapMessage.getText());  
  33.           
  34.         return callRecord;  
  35.     }  
  36.   
  37. }  


CallRecord.java实体类

  1. public class CallRecord implements Serializable{  
  2.    
  3.      
  4.  private static final long serialVersionUID = 1L;  
  5.   
  6.  private String requestContent;  
  7.   
  8.  private Date endTime;  
  9.   
  10. ……  
  11.   
  12.    
  13.   
  14. }  



JmsProducer.java发送消息:

  1. import javax.jms.Connection;  
  2. import javax.jms.Destination;  
  3. import javax.jms.JMSException;  
  4. import javax.jms.MessageProducer;  
  5. import javax.jms.Session;  
  6. import javax.jms.TextMessage;  
  7.   
  8. import com.ibm.mq.jms.JMSC;  
  9. import com.ibm.mq.jms.MQQueueConnectionFactory;  
  10.   
  11. /** 
  12.  * 点对点模式 
  13.  * @author ZouXia 
  14.  * 
  15.  */  
  16. public class JmsProducer {  
  17.   
  18.     /** 
  19.      * Main method 
  20.      *  
  21.      * @param args 
  22.      */  
  23.     public static void main(String[] args) {  
  24.   
  25.         // Variables  
  26.         Connection connection = null;  
  27.         Session session = null;  
  28.         Destination destination = null;  
  29.         MessageProducer producer = null;  
  30.   
  31.         try {  
  32.             // Create a connection factory  
  33.             // objects  
  34.             MQQueueConnectionFactory factory = new MQQueueConnectionFactory();  
  35.             factory.setQueueManager("WMQ1QM");  
  36.             factory.setHostName("10.70.175.81");  
  37.             factory.setTransportType(JMSC.MQJMS_TP_CLIENT_MQ_TCPIP);  
  38.             factory.setPort(1414);  
  39.             factory.setChannel("SYSTEM.DEF.SVRCONN");  
  40.   
  41.             // Create JMS objects  
  42.             connection = factory.createConnection();  
  43.             session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);  
  44.             destination = session.createQueue("WMQ1OutputQ");  
  45.             producer = session.createProducer(destination);  
  46.   
  47.             long uniqueNumber = System.currentTimeMillis() % 1000;  
  48.             TextMessage message = session  
  49.                     .createTextMessage("JmsProducer: Your lucky number today is " + uniqueNumber);  
  50.   
  51.             // Start the connection  
  52.             connection.start();  
  53.   
  54.             // And, send the message  
  55.             producer.send(message);  
  56.             System.out.println("Sent message:\n" + message);  
  57.   
  58.         } catch (JMSException jmsex) {  
  59.             jmsex.fillInStackTrace();  
  60.         } finally {  
  61.             try {  
  62.                 producer.close();  
  63.                 session.close();  
  64.                 connection.close();  
  65.             } catch (JMSException e) {  
  66.                 e.printStackTrace();  
  67.             }  
  68.         }  
  69.     }   
  70.   
  71. }   


所对应的发送方WMQ1QM的资源管理器:

技术分享

 

所对应的通道:

技术分享

 

接收方WMQ2QM的队列:

技术分享

 

通道:

技术分享

 

资源管理器即IBM MQ explorer是基于eclipse的进行的,在eclipse里面添加plug插件即可,其更新地址为:

http://public.dhe.ibm.com/software/integration/wmq/explorer/v75/updates/

 

如果出现以下问题:
  1. Exception in thread "main" java.lang.NoClassDefFoundError: javax/resource/ResourceException  
  2.     at com.ibm.mq.MQEnvironment.<clinit>(MQEnvironment.java:490)  
  3.     at com.ibm.mq.jms.services.ConfigEnvironment.<clinit>(ConfigEnvironment.java:190)  
  4.     at java.lang.Class.forName0(Native Method)  
  5.     at java.lang.Class.forName(Class.java:247)  
  6.     at com.ibm.mq.jms.MQConnectionFactory$1.run(MQConnectionFactory.java:658)  
  7.     at java.security.AccessController.doPrivileged(Native Method)  
  8.     at com.ibm.mq.jms.MQConnectionFactory.<clinit>(MQConnectionFactory.java:651)  
  9.     at com.zmcc.servicemanager.mq.jms.JmsProducer.main(JmsProducer.java:36)  
  10. Caused by: java.lang.ClassNotFoundException: javax.resource.ResourceException  
  11.     at java.net.URLClassLoader$1.run(URLClassLoader.java:200)  
  12.     at java.security.AccessController.doPrivileged(Native Method)  
  13.     at java.net.URLClassLoader.findClass(URLClassLoader.java:188)  
  14.     at java.lang.ClassLoader.loadClass(ClassLoader.java:307)  
  15.     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)  
  16.     at java.lang.ClassLoader.loadClass(ClassLoader.java:252)  
  17.     at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)  
  18.     ... 8 more  
pom.xml里面要引入connector.jar
  1. <dependency>  
  2.             <groupId>javax.resource</groupId>  
  3.             <artifactId>connector</artifactId>  
  4.             <version>1.0</version>  
  5.         </dependency>  




以上是关于spring监听与IBM MQ JMS整合的主要内容,如果未能解决你的问题,请参考以下文章

spring中配置监听队列的MQ

spring 集成 IBM MQ 启动报错, Uncategorized exception occured during JMS processing;

JMS进阶-Spring整合Active MQ

JMS 的 Spring 配置(Websphere MQ - SSL、Tomcat、JNDI、非 IBM JRE)

Spring整合JMS——消息监听器

MQ总结