- mq下载地址: http://activemq.apache.org/
- 运行:解压缩apache-activemq-5.15.6-bin.zip,然后双击apache-activemq-5.15.6\bin\activemq.bat运行ActiveMQ程序。
- 启动ActiveMQ以后,登陆:http://localhost:8161/admin 默认用户名和密码是都是admin
- 修改用户名密码:找到 conf/jetty.xml文件
<bean id="adminSecurityConstraint"class="org.eclipse.jetty.util.security.Constraint">
<property name="name"value="BASIC"/>
<property name="roles"value="admin"/>
<!-- set authenticate=false to disable login -->
<property name="authenticate"value="true"/>
</bean>
将property name为authenticate的属性value=“true"改为"false”,登录http://localhost:8161/admin/时就不会弹出用户名密码要求输入。authenticate的属性value=“true” 时,控制台的登录用户名密码保存在conf/jetty-realm.properties文件中
admin: username, password
user: user, user
用户名:密码,权限
- 消息处理机制(具体可查询官网)
activeMQ分两种处理模式queue和topic
- Topic ----- Publish Subscribe messaging 发布订阅消息
一般来说publisher发布消息到某一个topic时,只有正在监听该topic地址的sub能够接收到消息;如果没有sub在监听,该topic就丢失了。 - Queue ----- Point-to-Point 点对点
Sender发送消息到目标Queue,receiver可以异步接收这个Queue上的消息。Queue上的消息如果暂时没有receiver来取,也不会丢失。
- 配置文件applicationContext-ActiveMQ.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.apache.org/schema/core"
xmlns:jms="http://www.springframework.org/schema/jms"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
http://www.springframework.org/schema/jms
http://www.springframework.org/schema/jms/spring-jms-4.1.xsd
http://activemq.apache.org/schema/core
http://activemq.apache.org/schema/core/activemq-core-5.12.1.xsd">
<!-- 配置项 -->
<context:component-scan
base-package="com.spring" />
<mvc:annotation-driven />
<!-- mq默认是不校验用户名和密码的,可以不写 -->
<amq:connectionFactory id="amqConnectionFactory" brokerURL="tcp://127.0.0.1:61616" userName="user" password="user" />
<!-- 配置JMS连接工长 -->
<bean id="connectionFactory"
class="org.springframework.jms.connection.CachingConnectionFactory">
<constructor-arg ref="amqConnectionFactory" />
<property name="sessionCacheSize" value="100" />
</bean>
<!-- 生产者 -->
<!-- 定义消息队列(Queue) -->
<bean id="demoQueueDestination"
class="org.apache.activemq.command.ActiveMQQueue">
<!-- 设置消息队列的名字 -->
<constructor-arg index="0" value="qzl" />
</bean>
<!-- 配置JMS模板(Queue),Spring提供的JMS工具类,它发送、接收消息。 -->
<bean id="jmsTemplate"
class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="connectionFactory" />
<property name="defaultDestination"
ref="demoQueueDestination" />
<property name="receiveTimeout" value="10000" />
<!-- true是topic,false是queue,默认是false,此处显示写出false -->
<property name="pubSubDomain" value="false" />
</bean>
<!-- 消费者 -->
<!-- 消费者生产者可以不在同一个项目或者服务器,来减少服务器压力,生产者可以不用配以下内容,消费者不用配以上内容 -->
<!-- 配置消息队列监听者(Queue) -->
<bean id="queueMessageListener" class="com.spring.Filter.QueueMessageListener" />
<!-- 显示注入消息监听容器(Queue),配置连接工厂,监听的目标是demoQueueDestination,监听器是上面定义的监听器 -->
<bean id="queueListenerContainer"
class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory" />
<property name="destination" ref="demoQueueDestination" />
<property name="messageListener" ref="queueMessageListener" />
</bean>
</beans>
其他配置文件沿用spring配置就可以,引用的jar包除了spring的还有就是下载的activeMQ压缩包里的 activemq-all-5.15.6.jar;
7. 生产者代码
package com.spring.service;
import javax.annotation.Resource;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Service;
/**
* 生产者
*/
@Service
public class ProducerService {
@Resource(name="jmsTemplate")
private JmsTemplate jmsTemplate;
public void sendMessage(final String msg){
String destination = jmsTemplate.getDefaultDestination().toString();
System.out.println(Thread.currentThread().getName()+" 向队列"+destination+"发送消息---------------------->"+msg);
jmsTemplate.send(new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
return session.createTextMessage(msg);
}
});
}
}
消费者(监听)代码
package com.spring.Filter;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
public class QueueMessageListener implements MessageListener{
public void onMessage(Message message) {
TextMessage tm = (TextMessage) message;
try {
System.out.println("QueueMessageListener监听到了文本消息:\t"
+ tm.getText());
//do something ...
} catch (JMSException e) {
e.printStackTrace();
}
}
}
写了个Controller用于调试
package com.spring.Controller;
import javax.annotation.Resource;
import javax.jms.Destination;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.spring.service.ProducerService;
@Controller
public class MessageController {
@Resource(name = "demoQueueDestination")
private Destination destination;
//队列消息生产者
@Resource(name = "producerService")
private ProducerService producer;
@RequestMapping(value = "/SendMessage")
@ResponseBody
public void send(String msg) {
producer.sendMessage(msg);
}
}