首先创建一个生产者 public class Producer { private JmsTemplate jmsTemplate; private Destination topic; /** * 发送JMS消息 * @param xml 发送的消息 */ public void send(String xml) { jmsTemplate.convertAndSend(topic, xml); } public void setJmsTemplate(JmsTemplate jmsTemplate) { this.jmsTemplate = jmsTemplate; } public void setTopic(Destination topic) { this.topic = topic; } } 再来一个消费者 public class DIYConsumer implements MessageListener { private Logger logger = Logger.getLogger(this.getClass()); public void onMessage(Message msg) { System.out.println(msg); String sMsg = null; try { if (msg instanceof TextMessage) { sMsg = ((TextMessage)msg).getText(); logger.info("onMessage: " + sMsg); //这里放置处理JMS消息的代码 //将传过来的消息转换成XML的格式, XmlUtil读者可以自己去网上下载一个 Document doc = XmlUtil.synString2Document(msgXml); if(doc == null) { throw new DocumentException("doc is null. xml:" + msgXml); } Element root = doc.getRootElement(); if(!"m".equals(root.getName())) { throw new DocumentException("doc root error. xml:" + doc.asXML()); } //这里仅仅是打印出结果 System.out.println(root.attributeValue("t")); System.out.println(root.attributeValue("a")); System.out.println(root.attributeValue("st")); Element eElement = root.element("e") //后续工作就不再叙述了 } else { logger.error("msg: msg instanceof TextMessage return false!"); } }catch (Exception e) { logger.error(e + "msg:" + sMsg); } } } 主要的applicationContext-jms.xml的配置 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:amq="http://activemq.org/config/1.0" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://activemq.org/config/1.0 http://activemq.org/config/1.0"> <!--a pooling based JMS provider --> <!--客户端使用普通传输方式:tcp://localhost:61616 此处需加以注意的是Listener端的borkerURL使用了failover传输方式: failover:(tcp://localhost:61616)?initialReconnectDelay=100& maxReconnectAttempts=5 failover transport是一种重新连接机制,用于建立可靠的传输。此处配置的是一旦ActiveMQ broker中断,Listener端将每隔100ms自动尝试连接,直至成功连接或重试5次连接失败为止。 failover还支持多个borker同时提供服务,实现负载均衡的同时可增加系统容错性,格式: failover:(uri1,...,uriN)?transportOptions --> <bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop"> <property name="connectionFactory"> <bean class="org.apache.activemq.ActiveMQConnectionFactory"> <property name="brokerURL" value="tcp://localhost:61616"/> <property name="userName" value=""/> <property name="password" value=""/> </bean> </property> </bean> <!--Spring JMS Template --> <!-- Spring JMS Template JmsTemplate 类的实例 一经配置便是线程安全 的。 要清楚一点,JmsTemplate 是有状态的,因为它维护了 ConnectionFactory 的引用,但这个状态时不是会话状态。 --> <bean id="myJmsTemplate" class="org.springframework.jms.core.JmsTemplate"> <property name="connectionFactory" ref="jmsFactory"/> <!--JMS API有两种发送方法,一种采用发送模式、 优先级和存活时间作为服务质量(QOS)参数, 默认{deliveryMode:2(1),priority:4,timeToLive:0} 另一种使用无需QOS参数的缺省值方法。 <property name="explicitQosEnabled" value="true"/> <property name="deliveryMode" value="2"/> <property name="priority" value="4"/> <property name="timeToLive" value="1000"/> <property name="receiveTimeout" value="1000" /> --> </bean> <!-- 创建一个Queue,这里还可以创建一个topic --> <bean id="diyQueue" class="org.apache.activemq.command.ActiveMQQueue"> <constructor-arg index="0" value="USER_WEB_QUEUE" /> </bean> <!-- 发送消息 --> <bean id="ossRequest" class="com.jms.Producer"> <property name="jmsTemplate" ref="myJmsTemplate"/> <property name="topic" ref="diyQueue"/> </bean> <!-- 从web后台传过来的消息 --> <bean id="diyConsumer" class="com.jms.DIYConsumer"/> <!-- 消息监听 --> <bean id="listenerContainerQueue" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> <property name="concurrentConsumers" value="5" /> <property name="destination" ref="diyQueue"/> <property name="connectionFactory" ref="jmsFactory" /> <property name="destinationName" value="USER_WEB_QUEUE" /> <property name="messageListener" ref="diyConsumer" /> </bean> </beans> 测试代码 public class JMSTest { @Test public void testJMS() throws Exception{ ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"spring/applicationContext-jms.xml"}); Producer producer = (Producer) context.getBean("ossRequest"); producer.send("<m t=/"8600/" a=/"10000001/" st=/"2009-07-16 15:42:39/">/n" + "/t<e id=/"10000/" type=/"1000/"/>/n" + "</m>"); //消费消息 } }