转载请出自出处:http://eksliang.iteye.com/blog/2242729
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-jms</artifactId> <version>3.2.9.RELEASE</version> </dependency> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-all</artifactId> <version>5.5.0</version> </dependency> <!-- ActiveMQ依赖的日志包 --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.14</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.5.6</version> </dependency>
?
配置JMS的连接工厂,让Spring知道如何连接到ActiveMQ。ActiveMQConnectionFactory是ActiveMQ自带的连接工厂,在spring中可以使用如下方式进行配置:
<bean id="connectionFactory" class="org.apache.activemq.spring.ActiveMQConnectionFactory"> <property name="brokerURL" value="tcp://localhost:61616"/> </bean>
?
消息目的地可以是一个队列,也可以是一个主题,这取决于应用的需求。如果便是在spring中分别创建的队列(queue)目的地与主题(topic)目的地
<!-- 队列的目的 --> <bean id="queue" class="org.apache.activemq.command.ActiveMQQueue"> <constructor-arg value="queue.destination"/> </bean> <!-- 主题的目的地 --> <bean id="topic" class="org.apache.activemq.command.ActiveMQTopic"> <constructor-arg value="topic.Destination"/> </bean>
?
针对如果消除冗余和重复的JMS代码,Spring给出的解决方案是JmsTemplate.为了使用JmsTemplate,我们需要在Spring的配置文件中将他声明为一个Bean,如下所示。
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> <property name="connectionFactory" ref="connectionFactory"/> <!-- 下面这两个不是必须的,因为jmsTemplate的方法可以指定目的地 --> <!-- <property name="defaultDestinationName" value="queue.destination"/> --> <property name="defaultDestination" ref="queue"></property> </bean> <!-- 装配发送消息实体 --> <bean id="queueSendService" class="com.gosun.jms.QueueSendService"> <property name="jmsTemplate" ref="jmsTemplate"/> </bean> <!-- 装配接收消息实体 --> <bean id="queuesAcceptService" class="com.gosun.jms.QueuesAcceptService"> <property name="jmsTemplate" ref="jmsTemplate"/> </bean>
?
package com.gosun.jms.domain; import java.io.Serializable; public class User implements Serializable{ private static final long serialVersionUID = 13531L; private String userName; private String userPwd; private Float sal; get() set().....!省略 @Override public String toString() { return "User [userName=" + userName + ", userPwd=" + userPwd + ", sal=" + sal + "]"; } }
package com.gosun.jms; import javax.jms.JMSException; import javax.jms.ObjectMessage; import javax.jms.Session; import org.springframework.jms.core.JmsTemplate; import org.springframework.jms.core.MessageCreator; import com.gosun.jms.domain.User; /** * 发送消息,消息的生产者 * @author Ickes */ public class QueueSendService { private JmsTemplate jmsTemplate; /** * 使用JmsTemplate发送序列化消息 * @param user */ public void send(final User user){ // jmsTemplate.send(destination, messageCreator)//可以自己指定目的地 jmsTemplate.send(new MessageCreator() { @Override public ObjectMessage createMessage(Session session) throws JMSException { ObjectMessage msg = session.createObjectMessage(); msg.setObject(user); return msg; } }); } public JmsTemplate getJmsTemplate() { return jmsTemplate; } public void setJmsTemplate(JmsTemplate jmsTemplate) { this.jmsTemplate = jmsTemplate; } }
?
package com.gosun.jms; import javax.jms.JMSException; import javax.jms.ObjectMessage; import org.springframework.jms.core.JmsTemplate; /** * 接收消息,消息的消费者 * @author Ickes */ public class QueuesAcceptService { private JmsTemplate jmsTemplate; /** * 接收消息 */ public void receive(){ ObjectMessage msg = (ObjectMessage) jmsTemplate.receive(); try { System.out.println(msg.getObject()); } catch (JMSException e) { e.printStackTrace(); } } public JmsTemplate getJmsTemplate() { return jmsTemplate; } public void setJmsTemplate(JmsTemplate jmsTemplate) { this.jmsTemplate = jmsTemplate; } }
?
测试代码如下:
public static void main(String[] args) { ApplicationContext context =new ClassPathXmlApplicationContext("applicationContext-activeMQ.xml"); //先发送消息 QueueSendService qss = (QueueSendService) context.getBean("queueSendService"); User user = new User(); user.setUserName("ickes"); user.setUserPwd("123456"); user.setSal(12000F); qss.send(user); //接收消息 QueuesAcceptService qas = (QueuesAcceptService) context.getBean("queuesAcceptService"); qas.receive();
?
当调用JmsTemplate的receive()方法时,JmsTemplate会尝试从ActiveMQ中获取一个消息。如果没有可用的消息,receive()方法会一直等待,直到获得消息为止。也就是说该方法时同步的。这意味着接收者必须耐心等待消息的到来,因此receive()方法会一直被阻塞,直到有可用消息(或者消息超时),同步接收异步发送的消息,是不是感觉很怪异?怎么解决这个问题呢?
答:使用消息驱动POJO,怎么使用,在下篇博客中进行阐述。
?
?
?
?
原文:http://eksliang.iteye.com/blog/2242729