一、下载activeMQ
官方网站下载:http://activemq.apache.org/,我这边下载的是apache-activemq-5.15.3-bin,解压到本地目录,双击D:\apache-activemq-5.15.3\bin\win64\activemq.bat运行activeMQ。
启动后打开http://localhost:8161/admin/,输入用户名/密码:admin/admin,即可登录。
二、spring集成activeMQ
1、引入依赖包
<!-- xbean 如<amq:connectionFactory /> -->
<dependency>
<groupId>org.apache.xbean</groupId>
<artifactId>xbean-spring</artifactId>
<version>3.16</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.9.0</version>
</dependency>
<!-- 集成JMS -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>4.1.9.RELEASE</version>
</dependency>
2、配置activeMQ.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:amq="http://activemq.apache.org/schema/core"
xmlns:jms="http://www.springframework.org/schema/jms"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/jms
http://www.springframework.org/schema/jms/spring-jms-4.0.xsd
http://activemq.apache.org/schema/core
http://activemq.apache.org/schema/core/activemq-core-5.8.0.xsd">
<amq:connectionFactory id="amqConnectionFactory"
brokerURL="${brokerURL}" userName="admin" password="admin" />
<bean id="connectionFactory"
class="org.springframework.jms.connection.CachingConnectionFactory">
<constructor-arg ref="amqConnectionFactory" />
<property name="sessionCacheSize" value="100" />
</bean>
<!-- Producer star -->
<!-- 定义JmsTemplate的Queue类型 -->
<bean id="jmsQueueTemplate" class="org.springframework.jms.core.JmsTemplate">
<constructor-arg ref="connectionFactory" />
<!-- 非pub/sub模型(发布/订阅),即队列模式 -->
<property name="pubSubDomain" value="false" />
</bean>
<!-- Producer end-->
<!-- Consumer start-->
<!-- 定义Queue监听器 -->
<jms:listener-container destination-type="queue" container-type="default" connection-factory="connectionFactory" acknowledge="auto">
<jms:listener destination="test.queue" ref="testMQHandler"/>
</jms:listener-container>
<!-- Consumer end -->
</beans>
3、web.xml
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springContext.xml,classpath*:config/ActiveMQ.xml</param-value>
</context-param>
4、生产者实现类
@Autowired
@Qualifier("jmsQueueTemplate")
private JmsTemplate jmsTemplate;// 通过@Qualifier修饰符来注入对应的bean
public void send(final String queueName , final String message_type, final String message) {
final String uuid = UUID.randomUUID().toString();
log.info("进入队列发送 :" + queueName + ";" + "消息:" + message + "uuid:" + uuid);
try {
jmsTemplate.send(queueName, new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
TextMessage textMessage = session.createTextMessage(message);
textMessage.setStringProperty("destName", queueName);
textMessage.setStringProperty("uuid", uuid);
textMessage.setJMSType(message_type);
return textMessage;
}
});
} catch (Exception e) { e.printStackTrace();
// jms消息发送异常
log.error("进入队列发送异常 :" + queueName + ";" + "异常原因" + e.getMessage() + "uuid:" + uuid);
}
log.info("进入队列发送结束 :" + queueName + ";" + "uuid:" + uuid);
}
5、消费者实现类
/**
* jms 消息接受监听扩展抽象类
*
*/
public abstract class AbstractReceiver implements MessageListener {
public void onMessage(Message message) {
// 回调函数
messageCallBack(message);
}
/**
* 回调方法用于消息接受处理操作
*
* @param message
*/
public abstract void messageCallBack(Message message);
}
@Component
public class TestMQHandler extends AbstractReceiver {
private static Logger logger = Logger.getLogger(TestMQHandler.class);
/**
*
* @param message the Message
*/
@Override
public void messageCallBack(Message message) {
try {
String msg = ((TextMessage) message).getText();
String type = message.getJMSType();
logger.info("msg=" + msg + ";type=" + type);
} catch (Exception e) {
e.printStackTrace();
}
}
}
三、总结
1、相关概念
Provider/MessageProvider:生产者
Consumer/MessageConsumer:消费者
P2P:Point to Point,点对点通信消息模型
Pub/Sub:Publish/Subscribe,发布订阅消息模型
Queue:队列,目标类型之一,和P2P结合
Topic:主题,目标类型之一,和Pub/Sub结合
ConnectionFactory:连接工厂,JMS用它创建连接
Connnection:JMS Client到JMS Provider的连接
Destination:消息目的地,由Session创建
Session:会话,由Connection创建,实质上就是发送、接受消息的一个线程,因此生产者、消费者都是Session创建的
2、两种消息传输方式
Queue(队列模式):消息生产者发送消息到队列,消息消费者从队列中接收消息(只能由一个消费者进行消费)
Topic(发布/订阅模式):消息生产者将消息发布到某个主题,消息订阅者则从主题订阅消息(可以由多个消费者进行消费)