ActiveMQ JMS 项目 基于 Maven 搭建 部署
JAVA版本:

IntellJ IDEA 版本:
IntelliJ IDEA 2017.2
Build #IU-172.3317.76, built on July 15, 2017
Licensed to Administrator
JRE: 1.8.0_131-release-915-b5 amd64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Windows 7 6.1
一、新建Maven工程
1.选择File => New => Project...



2.或者执行maven 命令行创建工程。
D:\ cd D:\JavaSourceCode\JavaSamples mvn archetype:generate -DgroupId=com.phpdragon -DartifactId=jms-activeme-mq -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
3.或者手动创建如下目录结构:

4.如果是手动创建目录,需设置目录属性让 IDEA 识别为源码包路径

二、添加JAR依赖
spring-jms:
spring-test:
activemq-pool:
fastjson:
junit:
testng:
pom.xml配置如下
<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> <groupId>com.phpdragon</groupId>
<artifactId>jms-activemq-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging> <name>jms-activemq-demo</name>
<url>http://maven.apache.org</url> <developers>
<developer>
<id>phpdragon</id>
<name>phpdragon</name>
<email>phpdragon@qq.com</email>
</developer>
</developers> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <fastjson.vesrion>1.2.35</fastjson.vesrion>
<activemq-pool.version>5.15.0</activemq-pool.version>
<spring.version>4.3.10.RELEASE</spring.version>
<junit.version>4.12</junit.version>
<testng.version>6.11</testng.version>
</properties> <dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.vesrion}</version>
</dependency>
<!-- activemq -->
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-pool</artifactId>
<version>${activemq-pool.version}</version>
</dependency>
<!-- spring-jms -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- spring -->
<!--单元测试-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<!--自动化测试-->
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>${testng.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
三、编写生产者、消费者
1.添加生产者者MqProducer.java
import com.sun.nio.sctp.MessageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Component; @Component
public class MqProducer { @Autowired
private JmsTemplate jmsTemplate; public void sendMsg(MessageInfo info) {
try {
jmsTemplate.convertAndSend(info);
} catch (Exception e) {
e.printStackTrace();
}
}
}
2.创建jms消息转换器MqMessageConverter.java
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session; import com.phpdragon.jms.pojo.MessagePojo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jms.support.converter.MessageConversionException; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.springframework.stereotype.Component; @Component("messageConverter")
public class MqMessageConverter implements org.springframework.jms.support.converter.MessageConverter { private static final Logger LOGGER = LoggerFactory.getLogger(MqMessageConverter.class); public Object fromMessage(Message message) throws JMSException, MessageConversionException {
LOGGER.info("从mq获得message, message内容:" + message);
JSONObject jsonRoot = (JSONObject) JSON.parse(message.getStringProperty("obj"));
JSONObject jsonObj = JSONObject.parseObject(jsonRoot.getString("value"));
MessagePojo info = JSON.toJavaObject(jsonObj.getJSONObject("body"), MessagePojo.class);
return info;
} public Message toMessage(Object obj, Session session) throws JMSException, MessageConversionException {
LOGGER.info("往mq插入message, message内容:" + obj);
JSONObject jsonRoot = new JSONObject();
JSONObject jsonObj = new JSONObject();
jsonObj.put("body", obj);
jsonRoot.put("value", jsonObj.toJSONString());
Message message = session.createMapMessage();
message.setObjectProperty("obj", jsonRoot.toJSONString());
return message;
}
}
3.添加spring配置文件, spring-context.xml、app.properties
1)app.properties:
application.main=com.phpdragon.jms.App
application.name=jms_activemq_demo_server
application.owner=phpdragon mq.queue.name=COM.PHPDRAGON.JMS.DEMO.QUEUE
mq.brokerURL=tcp://127.0.0.1:61616
2)spring-context.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd"> <!--扫描classpath路径下的属性配置文件-->
<context:property-placeholder location="classpath*:/*.properties" ignore-resource-not-found="true" "/> <!--配置spring扫描路径-->
<context:component-scan base-package="com.phpdragon.jms"/> <!--创建连接工厂 -->
<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="${mq.brokerURL}"></property>
<property name="useAsyncSend" value="true"></property>
</bean>
<!-- 声明ActiveMQ消息目标,目标可以是一个队列,也可以是一个主题ActiveMQTopic -->
<bean id="destination" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg index="0" value="${mq.queue.name}"></constructor-arg>
</bean> <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="connectionFactory"></property>
<property name="defaultDestination" ref="destination"></property>
<property name="receiveTimeout" value="6000"></property>
<property name="messageConverter" ref="messageConverter"></property>
</bean> </beans>
4.编写启动程序App.java
import com.phpdragon.jms.activemq.MqProducer;
import com.phpdragon.jms.pojo.MessagePojo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Component; import java.io.IOException; @Component
public class App {
public static final String DEFAULT_CONFIG_LOCATION = "/spring-context.xml"; @Autowired
private MqProducer mqProducer; /**
* 程序入口
*
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
ApplicationContext context = new ClassPathXmlApplicationContext(DEFAULT_CONFIG_LOCATION);
App app = (App) context.getBean("app");
app.run(args);
} public void run(String[] args) {
MessagePojo msg = new MessagePojo();
msg.setTitle("Test");
msg.setContent("TestContent");
mqProducer.sendMsg(msg); System.exit(0);
}
}
5.到此,一个activeMQ发送程序就写好了,选中App.java的main函数体,鼠标右键点击 debug 运行,执行效果如下:

6.登录activeMQ管理后台,http://127.0.0.1:8161/admin/queues.jsp, 默认帐号: admin 密码: admin

7.添加消费者
1)创建MqConsumer.java
import com.phpdragon.jms.pojo.MessagePojo;
import org.springframework.stereotype.Component; import javax.jms.JMSException; @Component
public class MqConsumer{ public void handleMessage(MessagePojo msg) throws JMSException {
System.out.println("handleMessage:" + msg.toString());
} }
2)添加activeMQ 监听配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd"> <!--扫描classpath路径下的属性配置文件-->
<context:property-placeholder location="classpath*:/*.properties" ignore-resource-not-found="true"/> <!--配置spring扫描路径-->
<context:component-scan base-package="com.phpdragon.jms"/> <!--创建连接工厂 -->
<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="${mq.brokerURL}"></property>
<property name="useAsyncSend" value="true"></property>
</bean>
<!-- 声明ActiveMQ消息目标,目标可以是一个队列,也可以是一个主题ActiveMQTopic -->
<bean id="destination" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg index="0" value="${mq.queue.name}"></constructor-arg>
</bean> <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="connectionFactory"></property>
<property name="defaultDestination" ref="destination"></property>
<property name="receiveTimeout" value="6000"></property>
<property name="messageConverter" ref="messageConverter"></property>
</bean> <!-- 消息监听适配器 -->
<bean id="myMessageListenerAdapter" class="org.springframework.jms.listener.adapter.MessageListenerAdapter">
<property name="delegate" ref="mqConsumer"/>
<property name="messageConverter" ref="messageConverter"/>
</bean>
<bean id="mqContainer" class="org.springframework.jms.listener.SimpleMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory"/>
<property name="destinationName" value="${mq.queue.name}"/>
<!-- 使用MessageListenerAdapter来作为消息监听器 -->
<property name="messageListener" ref="myMessageListenerAdapter"/>
<!--最小并发数是4,最大并发数为8-->
<property name="concurrency" value="4-8"/>
<property name="sessionTransacted" value="true"/>
</bean> </beans>
3) 右键debug运行,效果如下:

4) 查看消费情况

四、集成logback
是否觉得debug日志太简单?那我们引入logback支持。实现丰富日志输出、日志back等
1.添加logback-classic Maven依赖
<!-- logback -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
2.在resources资源目录中添加logback.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!--日志配置 -->
<property name="LOG_BACK_DIR" value="logs"/> <!-- logback 工程的日志配置 -->
<appender name="DEBUG_ROLLING"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_BACK_DIR}/debug.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- rollover daily -->
<fileNamePattern>${LOG_BACK_DIR}/debug_%d{yyyyMMddHH}.%i.log
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- or whenever the file size reaches 100MB -->
<maxFileSize>256MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>48</maxHistory>
<!-- 保存最大文件数 -->
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd
HH:mm:ss.SSS}|%X{threadId}|%level|%C|%M|%L|%.-512msg%n
</pattern>
<charset>UTF-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter"><!-- 只打印错误日志 -->
<level>TRACE</level>
</filter>
</appender>
<!-- logback 工程的日志配置 END -->
<!-- 开发环境使用 打印在控制台 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<param name="Pattern"
value="%d{yyyy-MM-dd HH:mm:ss.SSS}|%X{threadId}|%X{traceId}-%X{rpcId}|%level|%C|%M|%L|%.-512msg%n"/>
</layout>
</appender> <logger name="org.springframework" level="WARN"/> <!--开发环境为DEBUG等级 -->
<root level="DEBUG">
<appender-ref ref="STDOUT"/>
<appender-ref ref="INFO_ROLLING"/>
</root> </configuration>
3.右键debug运行,效果如下:

五、集成assembly
六、单元测试与自动测试
七、编译并上传远程仓库
八、项目部署
源码地址:
有XML配置版本: https://github.com/phpdragon/JavaSamples/tree/master/jms-activemq-demo-xml
spring注解版本:https://github.com/phpdragon/JavaSamples/tree/master/jms-activemq-demo-annotation
spring-boot版本:https://github.com/phpdragon/JavaSamples/tree/master/spring-boot-starter-activemq-demo
ActiveMQ JMS 项目 基于 Maven 搭建 部署的更多相关文章
- 从头开始基于Maven搭建SpringMVC+Mybatis项目(3)
接上文内容,本节介绍基于Mybatis的查询和分页功能,并展示一个自定义的分页标签,可重复使用以简化JSP页面的开发. 从头阅读传送门 在上一节中,我们已经使用Maven搭建好了项目的基础结构,包括一 ...
- 从头开始基于Maven搭建SpringMVC+Mybatis项目(2)
接上文内容,本节介绍Maven的聚合和继承. 从头阅读传送门 互联网时代,软件正在变得越来越复杂,开发人员通常会对软件划分模块,以获得清晰的设计.良好的分工及更高的可重用性.Maven的聚合特性能把多 ...
- 从头开始基于Maven搭建SpringMVC+Mybatis项目(1)
技术发展日新月异,许多曾经拥有霸主地位的流行技术短短几年间已被新兴技术所取代. 在Java的世界中,框架之争可能比语言本身的改变更让人关注.近几年,SpringMVC凭借简单轻便.开发效率高.与spr ...
- Idea基于maven搭建多模块单体结构项目
菜鸟教程 一.创建一个公共的父工程: 1.1 创建一个新的maven项目: 1.2 先创建公共的父工程,选择maven骨架: 1.3 配置maven: 1.4 填写groupId.artifactId ...
- 从头开始基于Maven搭建SpringMVC+Mybatis项目(4)
接上文内容,上一节中的示例中完成了支持分页的商品列表查询功能,不过我们的目标是打造一个商品管理后台,本节中还需要补充添加.修改.删除商品的功能,这些功能依靠Mybatis操作数据库,并通过Spring ...
- 基于maven搭建hibernate运行环境
准备案例需要的数据库表和测试数据 建表语句: create table DEPARTMENT ( DEPT_ID integer not null, DEPT_NAME ) not null, DEP ...
- Linux环境基于CentOS7 搭建部署Docker容器
1.Docker容器概述 区分Docker容器技术和VM虚拟机技术: evernotecid://394EFE90-9CE0-4D65-A8CD-DFEC0DC8061E/appyinxiangcom ...
- Maven项目搭建(三):Maven直接部署项目
上一章给大家讲解了如何使用Maven搭建SSM框架项目. 这次给大家介绍一下怎么使用Maven直接部署项目. Maven直接部署项目 1.新建系统变量CATALINA_HOME,值为:Tom ...
- Java EE 学习(4):IDEA + maven 搭建 web(2)
参考:http://www.bubuko.com/infodetail-1855067.html 现使用 Maven 创建项目:本节接Java EE 学习(3):IDEA + maven 搭建 web ...
随机推荐
- oracle 列相减——(Oracle分析函数Lead(),Lag())
lag和lead函数,用于取出数据的前n行的数据和后n行的数据,当然要和over(order by)一起组合 其实这2个函数的作用非常好理解,Lead()就是取当前顺序的下一条记录,相对Lag()就是 ...
- ios多target开发
链接: ios开发时,在Xcode中添加多个targets进行版本控制 如何在iOS项目中创建多个target 多个Target的使用 iOS开发中如何创建多个target
- 【翻译】TCP backlog在Linux中的工作原理
原文How TCP backlog works in Linux水平有限,难免有错,欢迎指出!以下为翻译: 当应用程序通过系统调用listen将一个套接字(socket)置为LISTEN状态时,需要为 ...
- 关于在win8系统下用VMware 9.0装系统导致物理机不断重启的解决办法
一.问题描述 前段时间将操作系统换成了Win8,安装上VMware 9.0英文版.然后在VMware中安装centos系统,结果每次到安装系统的时候,物理机系统就会莫名其妙地自动重启,毫无征兆地出现, ...
- 理解TCP之Keepalive
理解HTTP之keep-alive 在前面一篇文章中讲了TCP的keepalive,这篇文章再讲讲HTTP层面keep-alive.两种keepalive在拼写上面就是不一样的,只是发音一样,于是乎大 ...
- vue Object.defineProperty Proxy 数据双向绑定
Object.defineProperty 虽然已经能够实现双向绑定了,但是他还是有缺陷的. 只能对属性进行数据劫持,所以需要深度遍历整个对象 对于数组不能监听到数据的变化 虽然 Vue 中确实能检测 ...
- 详解CentOS设置163的yum源的过程
转自启动CentOS系统,打开火狐浏览器,如下图所示: 2 登录“mirrors.163.com”,如下图所示: 3 点击centos后面的“centos使用帮助”,如下图所示: 4 可以看到设置和使 ...
- ROS中测试机器人里程计信息
在移动机器人建图和导航过程中,提供相对准确的里程计信息非常关键,是后续很多工作的基础,因此需要对其进行测试保证没有严重的错误或偏差.实际中最可能发生错误的地方在于机器人运动学公式有误,或者正负号不对, ...
- MySQL空间索引简单使用
简述 MySQL在5.7之后的版本支持了空间索引,而且支持OpenGIS几何数据模型.国内的MySQL相关的书籍都比较老了,在这方面有详细描述的还没有见过.有一本比较新的PostgreSQL的数据介绍 ...
- 文件批量上传-统一附件管理器-在线预览文件(有互联网和没有两种)--SNF快速开发平台3.0
实际上在SNF里使用附件管理是非常简单的事情,一句代码就可以搞定.但我也要在这里记录一下统一附件管理器能满足的需求. 通用的附件管理,不要重复开发,调用尽量简洁. 批量文件上传,并对每个文件大小限制, ...