Spring Boot集成ActiveMQ 一
1.ActiveMQ简介
需要使用ActiveMQ就要先知道ActiveMQ是什么东西,ActiveMQ是Apache出品,最流行的,能力强劲的开源消息总线。 ActiveMQ完全支持了JMS1.1和J2EE1.4规范的JMS Provider实现。
多种语言和协议编写客户端,语言:Java、C、C++、C#、Ruby、Perl、Python、PHP,应用协议:OpenWire、Stomp REST、WS Notification、XMPP、AMQP
完全支持JMS1.1和J2EE1.4规范
对Spring的支持,ActiveMQ可以很容易内嵌到使用Spring的系统里面去,而且也支持Spring2.0的特性
通过了常见J2EE服务(如Geronimo、JBoss 4、GlassFish、WebLogic)的测试,其中通过JCA1.5 resource adaptors的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE1.4商业服务器上
支持多种传送协议:in-VM、TCP、SSL、NIO、UDP、JGroups、JXTA
支持通过JDBC和journal提供高速的消息持久化
从设计上保证了高性能的集群,客户端--服务器,点对点
支持Ajax
支持与Axis的整合
可以很容易调用内嵌JMS provider,进行测试
2.安装ActiveMQ
Windows环境安装,大家看我这篇帖子 https://blog.csdn.net/dandandeteng/article/details/86525835
3.创建Spring Boot项目
安装完ActiveMQ之后启动
项目环境:IntelliJ IDEA 2017.2.3 x64,jdk1.8
创建两个Spring Boot项目,spring-boot-activemq-customer、spring-boot-activemq-producer,实现消息调用,em。。。消费者与生产者可以角色互换,简单结构画了下,诸位看官别嫌丑
3.1创建消费者spring-boot-activemq-customer,至于怎么创建Spring Boot项目,诸位看官自行google、baidu
下面是pom.xml内容,添加activemq依赖,另外小逸还添加了fastjson依赖,用于格式化返回结果,这也是个人习惯
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com</groupId>
<artifactId>spring-boot-activemq-customer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-boot-activemq-customer</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.5</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.yml内容如下
server:
servlet:
context-path: /
port: 8981
spring:
application:
name: spring-boot-activemq-customer
activemq:
password: admin
user: admin
broker-url: tcp://127.0.0.1:61608
在resources文件夹下创建logback-spring.xml日志文件,该配置会在程序运行根目录下创建一个logs文件夹,生成每天的日志文件,这对于猿类查找问题是非常有帮助的,小逸刚去公司,接手老项目,没有日志文件,真的是两岸猿声啼不住啊。。。配置如下
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<springProperty scope="context" name="logLevel" source="log.level"/>
<property name="logPath" value="logs" />
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%M方法名%L 行号%msg:日志消息,%n是换行符-->
<property name="ENCODER_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}.%M%L - %msg%n" />
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}.%M %L - %msg%n</pattern>
<charset>UTF-8</charset><!-- 此处设置字符集 -->
</encoder>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${logPath}/info.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${logPath}/info.log.%d{yyyy-MM-dd}</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}.%M%L - %msg%n</pattern>
<charset>UTF-8</charset><!-- 此处设置字符集 -->
</encoder>
</appender>
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${logPath}/error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${logPath}/error.log.%d{yyyy-MM-dd}</FileNamePattern>
<MaxHistory>60</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}.%M%L - %msg%n</pattern>
<charset>UTF-8</charset><!-- 此处设置字符集 -->
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>error</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
//指定包名com.server
<logger name="com.server" level="${logLevel}" additivity="false">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE"/>
<appender-ref ref="ERROR_FILE"/>
</logger>
<logger name="org.springframework.jdbc" level="info" additivity="false">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE"/>
</logger>
<!-- 日志输出级别 -->
<root level="info">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE"/>
</root>
</configuration>
基本的配置文件如上,项目使用JmsTemplate进行消息的发送与接收,关于JmsTemplate的API看官们可以去网上查看,小逸这里提供一份官方API,不过对英语水平有一定的要求,咳咳,诸位看官决定是否点击 https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jms/core/JmsTemplate.html
创建MessageProducer.java,用于Jms发送消息,代码如下
package com.server.jms;
import org.apache.activemq.command.ActiveMQQueue;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Component;
import javax.jms.*;
import java.util.Map;
@Component
public class MessagesProducer {
@Autowired
JmsTemplate jmsTemplate;
/**
* msg为消息主题
* destinationName为队列名称
* @param msg
* @param destinationName
*/
public void sendMessageStr(String msg,String destinationName){
jmsTemplate.send(destinationName, new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
TextMessage message = session.createTextMessage();
// message.setStringProperty("msg",msg);
message.setText(msg);
return message;
}
});
}
}
创建了消息发送者之后,看官们自行定义出发方法,小逸这采用接口访问的方式去实现消息的发送,创建MessageController.class
package com.server.controller;
import com.alibaba.fastjson.JSONObject;
import com.server.service.MessageService;
import com.server.utils.JsonResultHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/message")
public class MessageController {
private Logger logger = LoggerFactory.getLogger(MessageController.class);
@Autowired
MessageService messageService;
/**
* 发送简单的字符串
* @param msg
* @return
*/
@RequestMapping(value = "/send-str", method = RequestMethod.POST)
public String sendStr(String msg){
logger.info("/send-str,msg={}",msg);
JSONObject jsonObject = new JSONObject();
try {
messageService.sendMessageStr(msg);
JsonResultHandler.handler(jsonObject,"0","发送成功");
} catch (Exception e) {
logger.error("系统异常,e={}",e);
JsonResultHandler.handler(jsonObject,"-9001","系统异常");
}
return jsonObject.toString();
}
}
创建MessageController.class调用的service类,MessageService.class,代码如下
package com.server.service;
import com.server.jms.MessagesProducer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.jms.Message;
import java.util.HashMap;
import java.util.Map;
@Service
public class MessageService {
@Autowired
MessagesProducer messageProducer;
public void sendMessageStr(String msg){
messageProducer.sendMessageStr(msg,"s.notify");
}
}
3.2创建spring-boot-active-producer项目,项目结构如下
同样的有logback-spring.xml,application.yml内容如下
server:
servlet:
context-path: /
port: 8982
spring:
application:
name: spring-boot-activemq-customer
activemq:
password: admin
user: admin
broker-url: tcp://127.0.0.1:61608
pom.xml文件内容如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com</groupId>
<artifactId>spring-boot-activemq-producer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-boot-activemq-producer</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.5</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
创建消息监听器MessagesListener.class
package com.server.jms;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import java.util.Map;
@Component
public class MessagesListener{
@JmsListener(destination = "s.notify")
public void onStr(String msg){
System.out.println(msg);
}
}
启动spring-boot-activemq-customer与spring-boot-activemq-producer,使用接口测试工具postman访问接口/message/send-str
在spring-boot-activemq-producer控制台中可以看到打印出的msg内容
简单的点对点功能就实现了,目前也只是单向的消息传送,开发中经常需要获取消息调用后的返回值,就需要构建双向的消息队列,详情见下篇,感觉写不动了。。。。