ActiveMQ 主要有两种模式:
1、点对点(Point-to-Potin) : 消息队列模式
2、发布/订阅 (Publish/Subcribe):广播模式
消息接收又分为两种
1、同步接收消息 : 接收者阻塞式的,会有一个线程一直等待接收消息。
2、异步接收消息:监听者模式,有消息时被调用,没消息时,线程会处理别的业务。
集成 spring boot 有两种方式。一种完全注解,一种基于config 配置。
点对点模式(同步阻塞式):
第一步 加入依赖
第二步 编写配置
第三步 编写代码。
环境 idea maven
第一步 加入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
第二步 编写properties
#active 服务连接地址
spring.activemq.broker-url=tcp://localhost:61616
# 集群模式(只需要使用 failover:(xxxx:xx) 方式)
#spring.activemq.broker-url=failover:(tcp://localhost-0:61616,tcp://localhost-1:61616,tcp://localhost-2:61616)
#集群模式 只需要换成下面的链接就行
#spring.activemq.broker-url=tcp://localhost:61616
#配置服务中心 目标地址
spring.jms.template.default-destination=testMessage
#如果在 activemq.xml 中配置了用户名密码就需要用户名密码访问
#spring.activemq.user=username
#spring.activemq.password=password
用户名密码的配置方式看上一章 最后面的位置
第三步 编写代码。(controller 只需要调用就行,这里就不沾出来了)
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Service;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import javax.jms.TextMessage;
/**
* @Author: zll
* @Date @{DATE} 14:54
*/
@Service
public class TestService {
@Autowired
JmsTemplate jmsTemplate;
public void sendMessage() {
jmsTemplate.send(new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
return session.createTextMessage("hello ActiveMQ~~!");
}
});
}
//同步阻塞式 接收消息
public String getMessage(){
Message message = jmsTemplate.receive();
String text = "没有收到消息";
if(message instanceof TextMessage){
try {
text = ((TextMessage) message).getText();
} catch (JMSException e) {
e.printStackTrace();
}
}
return text;
}
}
调用测试一下。
先发送: http://localhost:8080/send
在接收: http://localhost:8080/get
发布订阅模式:
在上面的代码基础上改一个配置就可以完成:
spring.jms.pub-sub-domain=true (模式是false)
#active 服务连接地址
spring.activemq.broker-url=tcp://localhost:61616
#配置服务中心 目标地址
spring.jms.template.default-destination=testMessage
#如果在 activemq.xml 中配置了用户名密码就需要用户名密码访问
#spring.activemq.user=username
#spring.activemq.password=password
#true 为 发布订阅模式 false 为点对点模式。 默认是 false。
spring.jms.pub-sub-domain=true
异步模式
在上面的代码基础上 ,只是修改接收端代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Service;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import javax.jms.TextMessage;
/**
* @Author: zll
* @Date @{DATE} 14:54
*/
@Service
public class TestService {
@Autowired
JmsTemplate jmsTemplate;
public void sendMessage() {
jmsTemplate.send(new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
return session.createTextMessage("hello ActiveMQ~~!");
}
});
}
//异步模式 ( 这里于上面的方式不是 需要使用 JmsListener)
//concurrency 表示开启一个监听者来处理 接收,
// 在点对点模式(队列模式)中可以加快处理速度,没有监听者会循环取出队列中的消息,
// 广播模式(发布订阅)就会导致4个接收到一样的消息处理。
@JmsListener(destination = "${spring.jms.template.default-destination}",concurrency = "4")
public void getAsynMessage(Message message){
String text = "没有收到消息";
if(message instanceof TextMessage){
try {
text = ((TextMessage) message).getText();
} catch (JMSException e) {
e.printStackTrace();
}
}
System.out.println("最新消息:"+text);
}
}