- 简介:介绍ActiveMQ5.x消息队列基础特性和本地快速安装
特点:
1)支持来自Java,C,C ++,C#,Ruby,Perl,Python,PHP的各种跨语言客户端和协议
2)支持许多高级功能,如消息组,虚拟目标,通配符和复合目标
3) 完全支持JMS 1.1和J2EE 1.4,支持瞬态,持久,事务和XA消息
4) Spring支持,ActiveMQ可以轻松嵌入到Spring应用程序中,并使用Spring的XML配置机制进行配置
5) 支持在流行的J2EE服务器(如TomEE,Geronimo,JBoss,GlassFish和WebLogic)中进行测试
6) 使用JDBC和高性能日志支持非常快速的持久化
... - 去官网下载适合自己系统的版本:下载地址:官网 http://activemq.apache.org/activemq-5153-release.html
如果是centos系统可以直接命令下载
wget http://archive.apache.org/dist/activemq/5.15.3/apache-activemq-5.15.3-bin.tar.gz
- 下载完成之后,解压
tar -zxvf apache-activemq-5.15.3-bin.tar.gz
- 进入到bin目录下,选择适合自己系统位数的linux-x86-64(我的是64位的)
- 进入之后,执行启动命令
./activemq start
启动成功之后界面如下
查看启动状态
./activemq status
停止启动
./activemq stop
遇到的报错
启动ActiveMQ异常:java.net.URISyntaxException: Illegal character in hostname at index
首先翻译一下这个异常,就是:主机名中包含非法字符,那么非法字符是什么呢?是“_”下划线;
那么解决办法就很简单了,改主机名:
1、方法一使用hostnamectl命令
hostnamectl set-hostname 主机名
2、方法二:修改配置文件 /etc/hostname 保存退出
修改完成之后重启即可,这里我使用的是方法一:
hostnamectl set-hostname activemq
重启后效果:
然后启动ActiveMQ并查看状态:
- 本地浏览器输入IP:8161(管理端)
PS:如果是在阿里云中部署的ActiveMQ,记得将8161端口号开放
点击Manage ActiveMQ broker 进行登录,默认账号密码是admin/admin
登录之后,界面如下。到此ActiveMQ的安装就完成了,接下来让我们实现与springboot的集成
- 首先pom文件中引入相应的jar包依赖
<!-- 整合消息队列ActiveMQ -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
<!-- 如果配置线程池则加入 -->
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-pool</artifactId>
</dependency>
- 然后application.properties配置文件中加入如下配置
##=========ActiveMQ配置=========
#整合jms测试,安装在别的机器,防火墙和端口号记得开放61616是服务端口8161是管理端口
spring.activemq.broker-url=tcp://IP:61616
#集群配置
#spring.activemq.broker-url=failover:(tcp://localhost:61616,tcp://localhost:61617)
spring.activemq.user=admin
spring.activemq.password=admin
#下列配置要增加依赖
spring.activemq.pool.enabled=true
spring.activemq.pool.max-connections=100
PS:spring.activemq.broker-url=tcp://IP:61616配置项中的端口号位服务端的端口号,在阿里云服务器中也要开放此端口号
消息中间件的应用场景是在多个应用之间的,为了方便起见本次的例子是在同一个应用之间操作的
- 在Application启动类中加入注解@EnableJms。用于开启Jms
通过@Bean注解的形式将Queue方法添加到Spring中管理
/**
* 添加到到spring中管理,方便后续使用。默认的queue通常使用比较多,在此注入之后,后续使用不用重复new对象
* @return
*/
@Bean
public Queue queue(){
return new ActiveMQQueue("common.queue");
}
- 创建ProducerService.java接口类
import javax.jms.Destination;
/**
* @Author:Lyd
* @Date 2020/1/13 16:15
* @Description 消息生产者,实际应用消息的生产者和消费者会在不同的项目中,就像webservices的服务端和客户端一样
*/
public interface ProducerService {
/**
* 功能描述:指定消息队列,还有消息
* @param destination
* @param message
*/
void sendMessage(Destination destination, final String message);
/**
* 功能描述:使用默认消息队列, 发送消息
* @param message
*/
void sendMessage( final String message);
}
实现ProducerService.java接口类
import com.lyd.service.ProducerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.stereotype.Service;
import javax.jms.Destination;
import javax.jms.Queue;
import javax.jms.Topic;
/**
* @Author:Lyd
* @Date 2020/1/13 16:28
* @Description
*/
@Service
public class ProducerServiceImpl implements ProducerService {
/**
* 用来发送消息到broker的对象
*/
@Autowired
private JmsMessagingTemplate jmsMessagingTemplate;
@Autowired
private Queue queue;
/**
* 发送消息,destination是发送到的队列,message是待发送的消息
* @param destination
* @param message
*/
@Override
public void sendMessage(Destination destination, String message) {
jmsMessagingTemplate.convertAndSend(destination, message);
}
/**
* 发送消息使用默认的消息队列,message是待发送的消息
* @param message
*/
@Override
public void sendMessage(final String message) {
jmsMessagingTemplate.convertAndSend(this.queue,message);
}
}
- 创建controller层ActiveMqController.java类
import com.lyd.pojo.JsonData;
import com.lyd.service.ProducerService;
import org.apache.activemq.command.ActiveMQQueue;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.jms.Destination;
/**
* @Author:Lyd
* @Date 2020/1/13 16:56
* @Description ActiveMQ调用层
*/
@RestController
@RequestMapping("/api/v1/activeMq")
public class ActiveMqController {
@Autowired
private ProducerService producerService;
/**
* 给指定的queue发送消息
* @param msg
* @return
*/
@GetMapping("sendMessage")
public Object sendMessage(String msg) {
Destination destination = new ActiveMQQueue("common.queue");
producerService.sendMessage(destination, msg);
return JsonData.buildSuccess();
}
/**
* 给默认的queue发送消息
* @param msg
* @return
*/
@GetMapping("sendCommonMessage")
public Object sendCommonMessage(String msg){
producerService.sendMessage(msg);
return JsonData.buildSuccess();
}
}
PS:我根据网上视频写了一个方法执行消息类JsonData.java用于显示方法执行是否成功以及相关信息的类
/**
* @Author:Lyd
* @Date 2019/12/27 20:03
* @Description
*/
import java.io.Serializable;
public class JsonData implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private Integer code; // 状态码 0 表示成功,1表示处理中,-1表示失败
private Object data; // 数据
private String msg;// 描述
public JsonData() {
}
public JsonData(Integer code, Object data, String msg) {
this.code = code;
this.data = data;
this.msg = msg;
}
// 成功,传入数据
public static JsonData buildSuccess() {
return new JsonData(0, null, null);
}
// 成功,传入数据
public static JsonData buildSuccess(Object data) {
return new JsonData(0, data, null);
}
// 失败,传入描述信息
public static JsonData buildError(String msg) {
return new JsonData(-1, null, msg);
}
// 失败,传入描述信息,状态码
public static JsonData buildError(String msg, Integer code) {
return new JsonData(code, null, msg);
}
// 成功,传入数据,及描述信息
public static JsonData buildSuccess(Object data, String msg) {
return new JsonData(0, data, msg);
}
// 成功,传入数据,及状态码
public static JsonData buildSuccess(Object data, int code) {
return new JsonData(code, data, null);
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
@Override
public String toString() {
return "JsonData [code=" + code + ", data=" + data + ", msg=" + msg
+ "]";
}
}
- 启动项目并访问
http://localhost:8080/api/v1/activeMq/sendMessage?msg=测试0
执行成功以后页面显示 {"code":0,"data":null,"msg":null}
此时查看管理端,界面如下。表示消息发送成功
面板字段解释:
Name:队列名称。
Number Of Pending Messages:等待消费的消息个数。
Number Of Consumers:当前连接的消费者数目
Messages Enqueued:进入队列的消息总个数,包括出队列的和待消费的,这个数量只增不减。
Messages Dequeued:已经消费的消息数量。
- 消息发送之后,需要添加消费者去消费
创建ActiveMqConsumer.java用于模拟消费
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;
/**
* @Author:Lyd
* @Date 2020/1/13 21:48
* @Description ActiveMQ消息消费类
*/
@Component
public class ActiveMqConsumer {
@JmsListener(destination = "order.queue")
public void receiveQueue(String text){
System.out.println("收到的ActiveMQ消费消息为:"+text);
}
@JmsListener(destination = "common.queue")
public void receiveCommonQueue(String text){
System.out.println("收到的ActiveMQ默认消费消息为:"+text);
}
}
此时再启动项目,会自动去消费待消费的消息。如下图表示消息已经被消费。
此时再次查看管理页面
以上是简单的springboot集成ActiveMQ,楼主也在不断学习中,后续持续更新相关技术博文。需要源码的小伙伴,加我qq1465585760。