目录
1.环境配置
2.说明
3.服务启动
4.示例
导入依赖
配置文件
service层
配置类
监听器
5.总结
1.环境配置
下载地址: https://activemq.apache.org/components/classic/download /
安装:解压缩即可
注意每个版本对应的java版本不一样,需要根据服务器的java版本来下载对应的mq的版本
在conf文件的路径下有个activemq.xml的配置文件,文件中的这个地址需要修改一下,改成127.0.0.1,这样安全性更高。端口号有冲突的也需要修改一下,或者kill掉占用的端口号。
2.说明
JMS ( Java Message Service ):一个规范,等同于 JDBC 规范,提供了与消息服务相关的 API 接口
JMS 消息模型
peer-2-peer :点对点模型 , 消息发送 到一个 队列中, 队列 保存消息。队列 的消息只能被一个消费者 消费,或超时
pub lish- sub scribe :发布 订阅模型,消息可以被多个消费者消费,生产者和消费者完全独立,不需要感知对方的 存在
ActiveMQ属于JMS类型的消息队列
3.服务启动
进入到安装目录下,这是我的安装目录,点击启动脚本完成启动。
D:\queue\apache-activemq-5.16.5\bin\win64
启动成功的场合
可以通过 http://127.0.0.1:8161/进行到消息队列的管理界面,用户名和密码都是admin。
进入之后能够看到相应的队列信息。
queues代表点对点模式发送的消息,可以看到消费者信息,消息的信息。
topics代表发布订阅模式发送的消息,也可以看到消费者的信息,消息的信息。
4.示例
导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
配置文件
spring:
activemq:
broker-url: 127.0.0.1:61616
jms:
pub-sub-domain: true
template:
default-destination: orderInfoamation
jms的配置,主要是设置消息的类型是点对点还是发布订阅模式,默认是点对点模式,将pub-sub-domain设置为true,则表示是发布订阅模式
default-destination表示设置一个默认的名字,用来存放消息,一般不用指定,可以在代码中进行设置
service层
package com.example.demo.activemq.impl;
import com.example.demo.activemq.ActivemqService;
import org.apache.activemq.command.ActiveMQQueue;
import org.apache.activemq.command.ActiveMQTopic;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.stereotype.Service;
/**
* @author linaibo
* @version 1.0
* Create by 2023/1/16 13:55
*/
@Service
public class ActivemqServiceImpl implements ActivemqService {
@Autowired
private JmsMessagingTemplate messagingTemplate;
@Override
public void sendMessage(String msg) {
System.out.println("activemq发送topic消息:"+msg);
ActiveMQTopic topic_test = new ActiveMQTopic("topic_test");
messagingTemplate.convertAndSend(topic_test,msg);
System.out.println("activemq发送queue消息:"+msg);
ActiveMQQueue queue_test = new ActiveMQQueue("queue_test");
messagingTemplate.convertAndSend(queue_test,msg);
}
}
注入JmsMessagingTemplate对象之后,创建对应的发布消息的模式,进行消息的发布
配置类
package com.example.demo.activemq.config;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.springframework.context.annotation.Bean;
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 org.springframework.stereotype.Component;
import javax.jms.ConnectionFactory;
/**
* @author linaibo
* @version 1.0
* Create by 2023/1/16 14:46
*/
@Component
public class activemqConfig {
@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;
}
@Bean(name="queueListenerContainerFactory")
public JmsListenerContainerFactory queueListenerContailerFactory(ConnectionFactory connectionFactory){
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setPubSubDomain(false);
return factory;
}
@Bean(name="topicListenerContainerFactory")
public JmsListenerContainerFactory topicListenerContainerFactory(ConnectionFactory connectionFactory){
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setPubSubDomain(true);
return factory;
}
}
配置类中,设置JmsMessagingTemplate以及队列和主题这两种消息模式。
监听器
package com.example.demo.activemq.listener;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;
/**
* @author linaibo
* @version 1.0
* Create by 2023/1/16 13:58
*/
@Component
public class ActivemqListener {
@JmsListener(destination = "topic_test",containerFactory = "topicListenerContainerFactory")
public void reciveTopic1(String msg) {
System.out.println("接收到active的topic消息1:" + msg);
}
@JmsListener(destination = "topic_test",containerFactory = "topicListenerContainerFactory")
public void reciveTopic2(String msg) {
System.out.println("接收到active的topic消息2:" + msg);
}
@JmsListener(destination = "queue_test",containerFactory = "queueListenerContainerFactory")
public void reciveQueue(String msg) {
System.out.println("接收到active的queue消息:" + msg);
}
}
监听器中要对destination及 containerFactory进行设置,通过消息名称和模式来进行监听。点对点模式,只有一个消费者能够消费消息,而发布订阅模式有多个消费者可以消费这一条消息。
5.总结
按照上面这种方式来进行消息的发布,可以进行点对点或者发布订阅模式的消息发送,如果在配置文件中指定了点对点或者发布订阅模式的时候,只能进行一种消息的发送。