com.sharp.mq.test.SGMessageListenerContainer(org.springframework.jms.listener.DefaultMessageListenerContainer的子类,继承是为了做异常处理)
connectionFactory --连接工厂,用于连接队列管理器(JNDI)
destination --连接某个队列(JNDI)
messageListener --消息监听,用于接口消息 (自定义类)
<!-- 公共连接工厂,连接MQ队列管理器 --> <bean id="mqConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName" value="java:jms/队列管理器名" /> </bean> <!-- 公共jms模板,发送消息使用 --> <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> <property name="connectionFactory" ref="mqConnectionFactory" /> </bean> <!--接收消息--> <!-- 消息监听容器 --> <bean id="mqMSGReceiveContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> <property name="concurrentConsumers" value="1" /> <property name="connectionFactory" ref="mqConnectionFactory" /> <property name="destination" ref="receiveQueue" /> <property name="messageListener" ref="qu_sms_msg_receive_biz" /> </bean> <!-- 操作队列 --> <bean id="receiveQueue" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName" value="qu_asuraexp_msg_in" /> </bean> <!-- 消息接收模板 --> <bean id="queueAccept" class="com.sharp.mq.accept.SGMessageListener" abstract="true"> <property name="jmsConverter"> <!-- 消息转换 --> <bean class="org.springframework.jms.support.converter.SimpleMessageConverter"/> </property> </bean> <!-- 自定义消息监听机制 --> <bean id="qu_sms_msg_receive_biz" class="com.sharp.mq.accept.MQReceive" parent="queueAccept"/> <!--发送消息--> <!-- 操作发送队列 --> <bean id="qu_mem_coupon_send_jndi" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName" value="qu_scs_coupon_out" /> </bean> <!-- 发送消息操作类 --> <bean id="mqSendAdapter" class="com.sharp.mq.send.SendJMSAdapter"> <property name="jmsTemplate" ref="jmsTemplate" /> </bean>
SGMessageListenerContainer:
package com.sharp.mq.accept; import javax.jms.JMSException; import javax.jms.MessageConsumer; import javax.jms.Session; import org.springframework.jms.listener.DefaultMessageListenerContainer; public class SGMessageListenerContainer extends DefaultMessageListenerContainer { public SGMessageListenerContainer() { } protected boolean receiveAndExecute(Session session, MessageConsumer consumer) throws JMSException { boolean messageReceived = false; try { messageReceived = super.receiveAndExecute(this, session, consumer); } catch(Throwable e) { handleException(e); } return messageReceived; } protected void handleListenerException(Throwable ex) { super.handleListenerException(ex); handleException(ex); } private void handleException(Throwable e) { } }
MQReceive :
package com.sharp.mq.accept; public class MQReceive extends SGMessageListener { @Override public void processMessage(String s) { System.out.println(s); } }
SGMessageListener :
package com.sharp.mq.accept; import javax.jms.Message; import javax.jms.MessageListener; import org.springframework.jms.support.converter.MessageConverter; public abstract class SGMessageListener implements MessageListener { public SGMessageListener() { } public void setJmsConverter(MessageConverter jmsConverter) { this.jmsConverter = jmsConverter; } public void onMessage(Message message) { try { String xml = (String)jmsConverter.fromMessage(message); processMessage(xml); } catch(Throwable e) { e.printStackTrace(); throw new RuntimeException(e.getMessage()); } } public abstract void processMessage(String s); private MessageConverter jmsConverter; }
JNDI配置:
<?xml version="1.0" encoding="UTF-8"?> <connection-factories> <!-- connection factory definition --> <tx-connection-factory> <jndi-name>jms/qm_scsdev</jndi-name> <xa-transaction /> <rar-name>wmq.jmsra.rar</rar-name> <connection-definition>javax.jms.ConnectionFactory</connection-definition> <config-property name="channel" type="java.lang.String">CH_SCS_SVRCONN</config-property> <config-property name="hostName" type="java.lang.String">localhost</config-property> <config-property name="port" type="java.lang.String">1414</config-property> <config-property name="queueManager" type="java.lang.String">QM_SCSDEV</config-property> <config-property name="transportType" type="java.lang.String">CLIENT</config-property> <config-property name="CCSID" type="java.lang.String">1381</config-property> <max-pool-size>25</max-pool-size> <!--security-domain-and-application>JmsXARealm</security-domain-and-application --> </tx-connection-factory> <!-- ASURAEXP Msg Queue Config - QU_ASURAEXP_MSG_IN --> <mbean code="org.jboss.resource.deployment.AdminObject" name="jca.wmq:name=qu_asuraexp_msg_in"> <attribute name="JNDIName">qu_asuraexp_msg_in</attribute> <depends optional-attribute-name="RARName">jboss.jca:service=RARDeployment,name='wmq.jmsra.rar'</depends> <attribute name="Type">javax.jms.Queue</attribute> <attribute name="Properties"> baseQueueManagerName=QM_SCSDEV baseQueueName=QU_ASURAEXP_MSG_IN CCSID=1381 </attribute> </mbean> <!-- MEM Coupon Queue Config - QU_SCS_COUPON_OUT --> <mbean code="org.jboss.resource.deployment.AdminObject" name="jca.wmq:name=qu_scs_coupon_out"> <attribute name="JNDIName">qu_scs_coupon_out</attribute> <depends optional-attribute-name="RARName">jboss.jca:service=RARDeployment,name='wmq.jmsra.rar'</depends> <attribute name="Type">javax.jms.Queue</attribute> <attribute name="Properties"> baseQueueManagerName=QM_SCSDEV baseQueueName=QU_SCS_COUPON_OUT CCSID=1381 </attribute> </mbean> </connection-factories>
发送消息篇
com.sharp.mq.accept.AsyncJMSAdapter()
jmsTemplate jms模板
sendQueue 发送对列(JNDI)
converter 消息转换(自定义消息转换器)
IJMSAdapter:
package com.sharp.mq.send; import java.util.Map; public interface IJMSAdapter { public abstract Object send(MQQueueConstant.SEND_QUEUE sendQueue, Object obj) throws MQException; public abstract Object send(MQQueueConstant.SEND_QUEUE sendQueue, Object obj, String s) throws MQException; public abstract Object send(MQQueueConstant.SEND_QUEUE sendQueue, Object obj, Map map) throws MQException; public abstract Object send(MQQueueConstant.SEND_QUEUE sendQueue, Object obj, String s, Map map) throws MQException; }
SendJMSAdapter:
package com.sharp.mq.send; import java.util.Map; import javax.jms.JMSException; import javax.jms.Message; import org.springframework.jms.core.JmsTemplate; import org.springframework.jms.core.MessagePostProcessor; import com.sharp.common.utils.xml.XmlTools; public class SendJMSAdapter implements IJMSAdapter { public Object send(MQQueueConstant.SEND_QUEUE sendQueue, Object to) throws MQException { String xml = XmlTools.objectToXml(to); jmsTemplate.convertAndSend(sendQueue.getQueue(), xml); return null; } public Object send(MQQueueConstant.SEND_QUEUE sendQueue, Object to, String correlationID) throws MQException { return send(sendQueue,to, correlationID, null); } public Object send(MQQueueConstant.SEND_QUEUE sendQueue, Object to, Map header) throws MQException { return send(sendQueue,to, null, header); } public Object send(MQQueueConstant.SEND_QUEUE sendQueue, Object to, final String correlationID, final Map header) throws MQException { String xml = XmlTools.objectToXml(to); jmsTemplate.convertAndSend(sendQueue.getQueue(), xml, new MessagePostProcessor() { @Override public Message postProcessMessage(Message arg0) throws JMSException { return arg0; } }); return null; } public void setJmsTemplate(JmsTemplate jmsTemplate) { this.jmsTemplate = jmsTemplate; } private JmsTemplate jmsTemplate; }
放置wmq.jmsra-ds.xml文件和wmq.jmsra.rar文件在D:\JBoss-4.2-scs\server\default\deploy\jms 目录内
更新jar 包:
更新 jboss_home\server\default\lib,需更新以下jar包
com.ibm.mqetclient.jar
jms.jar
jta-1.1.jar
jta-spec1_0_1.jar
ojdbc14.jar
JBoss相关jar包删除
把jboss-**\server\default(或者其它选择部署的目录)\lib下的hibernate*.jar删除(一般为以下列表的5个)
删除包列表:
hibernate3.jar
hibernate-annotations.jar
hibernate-commons-annotations.jar
hibernate-entitymanager.jar
hibernate-validator.jar