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_152-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>[email protected]</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}|%X{traceId}-%X{rpcId}|%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

spring注解版本:https://github.com/phpdragon/JavaSamples/tree/master/jms-activemq-demo-no-xml

spring-boot版本:https://github.com/phpdragon/JavaSamples/tree/master/spring-boot-starter-activemq-demo

时间: 2024-10-11 07:39:10

ActiveMQ JMS 项目 基于 Maven 搭建的相关文章

基于Maven搭建SpringMVC+Mybatis项目(4)

从高考,到程序员      CSDN日报20170620--<找一个好工作,谈一份好薪水>      6 月书讯 | 最受欢迎的 SQL 入门书重磅升级 从头开始基于Maven搭建SpringMVC+Mybatis项目(4) 标签:               mavenmybatisspring mvc分页JAVA 2016-07-27 16:53             4598人阅读             评论(0)             收藏              举报 本文章

基于Maven搭建SpringMVC+Mybatis项目(2)

从头开始基于Maven搭建SpringMVC+Mybatis项目(2) 标签:               JAVAmavenmybatisspring mvc 版权声明:欢迎转载, 转载请保留原文链接. 接上文内容,本节介绍Maven的聚合和继承. 从头阅读传送门 互联网时代,软件正在变得越来越复杂,开发人员通常会对软件划分模块,以获得清晰的设计.良好的分工及更高的可重用性.Maven的聚合特性能把多个模块聚合在一起构建,并促进各子模块通过继承父模块的pom配置来保持配置的一致.为了演示这些特

基于Maven搭建SpringMVC+Mybatis项目(3)

| 从高考,到程序员      CSDN日报20170620--<找一个好工作,谈一份好薪水>      6 月书讯 | 最受欢迎的 SQL 入门书重磅升级 从头开始基于Maven搭建SpringMVC+Mybatis项目(3) 标签:               JAVAmavenspring mvcmybatis 2016-07-26 10:06             42087人阅读             评论(2)             收藏              举报 本文

从头开始基于Maven搭建SpringMVC+Mybatis项目(2)

接上文内容,本节介绍Maven的聚合和继承. 从头阅读传送门 互联网时代,软件正在变得越来越复杂,开发人员通常会对软件划分模块,以获得清晰的设计.良好的分工及更高的可重用性.Maven的聚合特性能把多个模块聚合在一起构建,并促进各子模块通过继承父模块的pom配置来保持配置的一致.为了演示这些特性,本文的示例划分为数据持久层petstore-persist和petstore-web两个模块. 下面来介绍创建项目的过程,首先创建父模块perstore-parent. File -> New ->

从头开始基于Maven搭建SpringMVC+Mybatis项目(1)

技术发展日新月异,许多曾经拥有霸主地位的流行技术短短几年间已被新兴技术所取代. 在Java的世界中,框架之争可能比语言本身的改变更让人关注.近几年,SpringMVC凭借简单轻便.开发效率高.与Spring框架无缝整合等特点,逐渐击败前辈Struts/Struts2,成为最常用的Web框架.而Mybatis相对于Hibernate,同样具有开发简单.效率高的优势,而且对SQL的可控性更好,有利于性能调优,逐渐也积累了挑战Hibernate的实力和人气. 当前SpringMVC+Mybatis已经

基于maven搭建hibernate运行环境

准备案例需要的数据库表和测试数据 建表语句: create table DEPARTMENT ( DEPT_ID integer not null, DEPT_NAME varchar(255) not null, DEPT_NO varchar(20) not null, LOCATION varchar(255), primary key (DEPT_ID), unique (DEPT_NO) ); create table EMPLOYEE ( EMP_ID bigint not null

基于maven搭建的struts 1 java工程

今天在家尝试搭建和公司一样的开发环境(struts1+maven+resin),结果遇到很多的问题,记录下来,如果遇到相似问题,可参考: 我的工程下载地址:http://files.cnblogs.com/files/focusahaha/struts1.rar maven maven值得注意的地方其实只有conf文件夹的setting.xml文件,其实不用任何设置就可以使用了.但是也可以通过修改这个文件,手动设置本地maven库的位置,使用镜像(如果使用的是本公司自主搭建的maven库),使用

基于Spring+IDEA+Maven搭建测试项目

一.背景介绍 1.1公司相关技术 Git:是一款免费的开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目,方便多人集成开发 Maven:是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具,同时还提供了高级项目管理工具 Jira:是Atlassian公司出品的项目与事务跟踪工具,被广泛应用于缺陷跟踪.客户服务.需求收集.流程审批.任务跟踪.项目跟踪和敏捷管理等工作领域 Dubbo:是阿里巴巴公司一个开源的分布式服务框架,致力于提供高性能和

微服务中基于Spring Boot的maven分布式项目框架的搭建

项目介绍 这里搭建的是基于 maven 的分布式工程,因为在一个项目中,多个微服务是属于同一个工程,只不过是提供不同的服务而已,再加上 IDEA 是默认一个窗口打开一个项目工程(这点和 eclipse 不同),如果项目大,不用 maven 聚合工程的话,那估计会打开十几个窗口--会崩溃--而且在架构上,也应该使用 maven 分布式工程来搭建微服务架构.这里手把手教大家在 IDEA 中搭建基于 maven 分布式的 Spring Cloud 微服务工程架构. maven分布式工程架构首先来看一下