1.去官网下载最新版activeMQ,http://activemq.apache.org/download.html然后解压压缩包,运行activemq.bat文件,浏览器访问http://127.0.0.1:8161/
2、新建一个springboot项目引入依赖,
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-pool</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
3、配置yml文件
server:
port: 8080
servlet:
context-path: /activemq-demo
spring:
activemq:
user: admin
password: admin
#注意activemq的http端口是8161但是tcp端口是61616
broker-url: tcp://localhost:61616
#true 表示使用内置的MQ,false则连接服务器
in-memory: false
#true表示使用连接池,这个时候一定要添加依赖包不然会报JmsMessagingTemplate注入失败 ;false时,每发送一条数据创建一个连接
pool:
enabled: true
#连接池最大连接数
max-connections: 10
#空闲的连接过期时间,默认为30秒这里采用默认的就好了
4、编写config类,我们这里采用了两种消息模式,所以需要监听请求模式对PubSubDomain动态设置值
package com.cxw.activemqdemo.config;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQQueue;
import org.apache.activemq.command.ActiveMQTopic;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
import org.springframework.jms.config.JmsListenerContainerFactory;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.jms.core.JmsTemplate;
import javax.jms.ConnectionFactory;
import javax.jms.Queue;
import javax.jms.Topic;
import java.util.concurrent.Executors;
/**
* @Author: cxw
* @CreateDate: 2019-05-29 14:20
* @Description:
*/
@Configuration
public class ActiveMqConfig {
/**
* 一对一模式
* @return
*/
@Bean
public Queue queue(){
return new ActiveMQQueue("activeMQQueue");
}
/**
* 广播模式
* @return
*/
@Bean
public Topic topic(){
return new ActiveMQTopic("activeMQTopic");
}
/************************处理连接池导致jmsMessagingTemplate注入失败的问题 start************************/
@Bean
ConnectionFactory connectionFactory() {
return new ActiveMQConnectionFactory();
}
@Bean
JmsTemplate jmsTemplate(ConnectionFactory connectionFactory) {
JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory);
jmsTemplate.setPriority(999);
return jmsTemplate;
}
@Bean(value="jmsMessagingTemplate")
JmsMessagingTemplate jmsMessagingTemplate(JmsTemplate jmsTemplate) {
JmsMessagingTemplate messagingTemplate = new JmsMessagingTemplate(jmsTemplate);
return messagingTemplate;
}
/************************处理连接池导致jmsMessagingTemplate注入失败的问题 end************************/
/**
* 监听topic消息设置 PubSubDomain为true,虽然可以通过yml设置但是,这样就是单一的消息类型,默认是false也就是queue模式
* @param connectionFactory
* @return
*/
@Bean("topicListenerContainer")
public JmsListenerContainerFactory<?> topicListenerFactory(ConnectionFactory connectionFactory) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setPubSubDomain(true);
factory.setConnectionFactory(connectionFactory);
return factory;
}
@Bean("queueListenerContainer")
public JmsListenerContainerFactory<?> queueListenerFactory(ConnectionFactory connectionFactory) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setPubSubDomain(false);
factory.setConnectionFactory(connectionFactory);
return factory;
}
}
5.编写消息生产者
@Component
public class ActiveMQProvider {
@Autowired
private Queue queue;
@Autowired
private Topic topic;
//注入springboot封装的工具类
@Autowired
private JmsMessagingTemplate jmsMessagingTemplate;
public void sendQueue(){
String msg="我的ActiveMQ sendQueue";
System.out.println("发送消息:"+msg);
jmsMessagingTemplate.convertAndSend(queue,msg);
}
public void sendTopic(){
String msg="我的ActiveMQ sendTopic";
System.out.println("发送消息:"+msg);
jmsMessagingTemplate.convertAndSend(topic,msg);
}
}
6.编写消息消费者
@Component
public class ActivvveMQConsumer {
@JmsListener(destination="activeMQQueue")
public void readActiveQueue(String message) {
System.out.println("接受到:" + message);
}
@JmsListener(destination="activeMQTopic",containerFactory = "topicListenerContainer")
public void readActiveTopic(String message) {
System.out.println("接受到topic1:" + message);
}
@JmsListener(destination="activeMQTopic",containerFactory = "topicListenerContainer")
public void readActiveTopic2(String message) {
System.out.println("接受到topic2:" + message);
}
@JmsListener(destination="activeMQTopic",containerFactory = "topicListenerContainer")
public void readActiveTopic3(String message) {
System.out.println("接受到topic3:" + message);
}
}
7、编写测试案例,要养成良好的习惯
@RunWith(SpringRunner.class)
@SpringBootTest
public class ActivemqDemoApplicationTests {
@Autowired
private ActiveMQProvider activeMQProvider;
@Test
public void sendQueue() {
activeMQProvider.sendQueue();
}
@Test
public void sendTopic() {
activeMQProvider.sendTopic();
}
}
这样一个简单的activemq就写完了
优点:比较老的消息队列,使用Java语言编写。对JMS支持最好,采用多线程并发,资源消耗比较大。
缺点:老的东西肯定是会受到旧的版本的影响和限制的,除非重构,版本更新很缓慢。集群模式需要依赖Zookeeper实现。
--------------------------------------写的不好,仅供参考-------------------------------------------