Spring Boot集成ActiveMQ 一

2 篇文章 0 订阅
2 篇文章 0 订阅

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内容

简单的点对点功能就实现了,目前也只是单向的消息传送,开发中经常需要获取消息调用后的返回值,就需要构建双向的消息队列,详情见下篇,感觉写不动了。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值