转载请出自出处:http://eksliang.iteye.com/blog/2242729
一、必须导入spring对JMS封装的包
<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>
三、声明ActiveMQ消息目的地
消息目的地可以是一个队列,也可以是一个主题,这取决于应用的需求。如果便是在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>
四、使用Spring的模板代码来简化消息的发送与接收
针对如果消除冗余和重复的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>
- com.gosun.jms.domain.User代码如下:
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 + "]";
}
}
- com.gosun.jms.QueueSendService代码
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;
}
}
- com.gosun.jms.QueuesAcceptService代码如下
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,怎么使用,在下篇博客中进行阐述。