activemq的配置与结合spring使用

其实无论在win下还是在linux下,都可以运行得很爽

下载安装包地址:

http://www.apache.org/dyn/closer.cgi?path=/activemq/5.12.1/apache-activemq-5.12.1-bin.tar.gz

安装

1)解压文件

tar zxvf apache-activemq-5.12.1-bin.tar.gz

2)改个文件名字

mv apache-activemq-5.12.1 ../system/activemq

3)配置用户密码,比如我在user.properties中添加了信息

admin=admin
chenweixian=chenweixian

4)启动,根据你自己当前部署的系统环境选择启动,如果是win下的,就根据自己系统的位数,选择32或64.如果是linux就直接启动activemq就可以了

执行命令:*****为具体路径。。

******/activemq/bin/activemq start

执行命令前请去确认是否已经授权,如果没有授权,到当前bin目录下,执行:

chmod 777 *

java工程中的配置

5)启动完成后

测试访问:

http://ip:8161/admin/

正常如下图:

6)maven工程中添加引入jar包,不是maven工程,自己找以下两个jar包加入工程中。

<!-- 使用activeMq消息队列 -->
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-core</artifactId>
            <version>5.7.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-spring</artifactId>
            <version>5.7.0</version>
        </dependency>

7)在web.xml中添加引入:

    <!-- ContextLoaderListener初始化Spring上下文时需要使用到的contextConfigLocation参数 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <!-- 配置spring.xml和spring-mybatis.xml这两个配置文件的位置,固定写法 -->
        <param-value>
            classpath:spring.xml,
            classpath:spring-mybatis.xml,
            classpath:spring-activitymq.xml,
            classpath:dubbo.xml
        </param-value>
    </context-param>

8)spring-activitymq.xml文件配置

位置:

内容:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:task="http://www.springframework.org/schema/task"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
    http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
    http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd">

    <!--创建连接工厂-->
    <bean id="targetConnectionFactory"
        class="org.apache.activemq.ActiveMQConnectionFactory">
        <property name="brokerURL" value="tcp://192.168.10.102:61616"></property>
    </bean>
    <!-- 声明ActiveMQ消息目标,目标可以是一个队列,也可以是一个主题ActiveMQTopic,消息队列名称
    <bean id="destination" class="org.apache.activemq.command.ActiveMQQueue">
        <constructor-arg index="0" value="myQueue"></constructor-arg>
    </bean>-->
    <!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->
    <bean id="connectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">
        <!-- 目标ConnectionFactory对应真实的可以产生JMS Connection的ConnectionFactory -->
        <property name="targetConnectionFactory" ref="targetConnectionFactory"/>
    </bean>
    <!--模板消息-->
    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory" ref="connectionFactory" />
        <property name="receiveTimeout" value="600"></property>
    </bean>

    <!-- 队列A start-->
    <!--这个是队列目的地-->
    <bean id="demoQueueA" class="org.apache.activemq.command.ActiveMQQueue">
        <constructor-arg><value>demoQueueA</value></constructor-arg>
    </bean>
    <!-- 消息监听容器 -->
    <bean id="demoMessageListenerA"
        class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="connectionFactory" />
        <property name="destination" ref="demoQueueA" />
        <property name="messageListener" ref="demoMessageListener" />
    </bean>
    <!-- 队列A end-->
    <!-- 队列B start-->

    <!-- 队列A start-->
    <!--这个是队列目的地-->
    <bean id="demoQueueB" class="org.apache.activemq.command.ActiveMQQueue">
        <constructor-arg><value>demoQueueB</value></constructor-arg>
    </bean>
    <!-- 消息监听容器 -->
    <bean id="demoMessageListenerB"
        class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="connectionFactory" />
        <property name="destination" ref="demoQueueB" />
        <property name="messageListener" ref="demoMessageListener2" />
    </bean>
    <!-- 队列A end-->
    <!-- 队列B end-->
</beans>

9)java监听器

DemoMessageListener.java

package com.iafclub.demo.activityMq;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;

/**接收mq消息
 *
 * @author chenweixian
 *
 */
@Component
public class DemoMessageListener implements MessageListener {
    private static final Logger logger = Logger.getLogger(DemoMessageListener.class);

    public void onMessage(Message message) {
        String messageStr = "DemoMessageListener接收消息";
        //这里我们知道生产者发送的就是一个纯文本消息,所以这里可以直接进行强制转换
        TextMessage textMsg = (TextMessage) message;
        logger.info(messageStr + "..........start......");
        try {  

            logger.info("消息内容是:" + textMsg.getText());
        } catch (JMSException e) {
            logger.error(messageStr, e);
        }
        logger.info(messageStr + "..........end.");
    }
}

DemoMessageListener2.java

package com.iafclub.demo.activityMq;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;

import com.iafclub.baseTools.contants.ControllerContants;

/**接收mq消息
 *
 * @author chenweixian
 *
 */
@Component
public class DemoMessageListener2 implements MessageListener {
    private static final Logger logger = Logger.getLogger(DemoMessageListener2.class);

    public void onMessage(Message message) {
        String messageStr = "DemoMessageListener2接收消息";
        //这里我们知道生产者发送的就是一个纯文本消息,所以这里可以直接进行强制转换
        TextMessage textMsg = (TextMessage) message;
        logger.info(messageStr + ControllerContants.MESSAGE_START);
        try {  

            logger.info("消息内容是:" + textMsg.getText());
        } catch (JMSException e) {
            logger.error(messageStr, e);
        }
        logger.info(messageStr + ControllerContants.MESSAGE_START);
    }
}

10)使用junit测试:

package test.iafclub.mq;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.iafclub.baseTools.mq.ActiveMqUtil;
import com.iafclub.demo.domain.Dictionary;

@RunWith(SpringJUnit4ClassRunner.class)
//配置了@ContextConfiguration注解并使用该注解的locations属性指明spring和配置文件之后,
@ContextConfiguration(locations = {"classpath:spring.xml","classpath:spring-activitymq-test.xml", "classpath:spring-mybatis.xml", "classpath:dubbo-test.xml" })
public class ActiveMqTest {
    @Autowired
    private ActiveMqUtil activeMqUtil;
    String queueName = "chenweixianQueue";

    @Test
    public void testSenderMq(){
        for (int i=0;i<10;i++){
            Dictionary dictionary = new Dictionary();
            dictionary.setId(UUID.randomUUID().toString());
            dictionary.setTypeId("002");
            dictionary.setTypeName("字典分类");
            dictionary.setFieldKey("username"+i);
            dictionary.setFieldValue("陈惟鲜");
            dictionary.setFieldBack("back1");
            dictionary.setFieldBack2("back2");
            dictionary.setFieldBack3("back3");
            dictionary.setRemark("备注"+i);
            String messageContent = JSONObject.fromObject(dictionary).toString();
            System.out.println("发送消息:" + messageContent);
            activeMqUtil.sendMq("chenweixianQueue", messageContent);
        }

        List<Dictionary> dictionarys = new ArrayList<Dictionary>();
        for (int i=0;i<10;i++){
            Dictionary dictionary = new Dictionary();
            dictionary.setId(UUID.randomUUID().toString());
            dictionary.setTypeId("002");
            dictionary.setTypeName("字典分类");
            dictionary.setFieldKey("username"+i);
            dictionary.setFieldValue("陈惟鲜");
            dictionary.setFieldBack("back1");
            dictionary.setFieldBack2("back2");
            dictionary.setFieldBack3("back3");
            dictionary.setRemark("备注"+i);
            dictionarys.add(dictionary);
        }
        String messageContent = JSONArray.fromObject(dictionarys).toString();
        System.out.println("发送消息:" + messageContent);
        activeMqUtil.sendMq("chenweixianQueue2", messageContent);

        System.out.println("发送完成");
    }

//    @Test
//    public void testReceiverMq(){
//        String result = activeMqUtil.receiveMq(queueName);
//        System.out.println(result);
//        System.out.println("接收完成");
//    }
//    @Test
//    public void testParam(){
//        System.out.println(System.getProperty("webAppRootKey"));
//    }
}

因为使用简单方便,都是用json进行数据传输,所以,封装了一个工具类ActiveMqUtil.java

package com.iafclub.baseTools.mq;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.command.ActiveMQTextMessage;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Component;

@Component
public class ActiveMqUtil {

    private Logger logger = Logger.getLogger(ActiveMqUtil.class);

    @Autowired
    private JmsTemplate jmsTemplate;

    /**发送消息
     *
     * @param messageString
     */
    public void sendMq(String destinationName, final String messageString) {

        jmsTemplate.send(destinationName, new MessageCreator() {
            public Message createMessage(Session session) throws JMSException {
                // 消息内容
                TextMessage message = session.createTextMessage(messageString);
                return message;
            }
        });
    }

    /**接收消息系统启动的时候
     *
     * @param messageString
     */
    public String receiveMq(String destinationName) {
        String result = "";
        ActiveMQTextMessage message = (ActiveMQTextMessage)jmsTemplate.receive(destinationName);
        try {
            result = message.getText();
        } catch (JMSException e) {
            logger.error(e);
        }
        return result;
    }
}

运行junit:

进入mq管理界面:可以看到我们刚刚发送的消息队列中有的消息个数,消费次数。。。

进入一个消息中,能看到消息具体内容,因为我们发送过来的是json格式的信息,所以,在这个服务器上能看到的内容也是json格式的内容。

11)现在消息在服务器上,因为我们刚刚已经配置了与之关联的spring-activemq.xml中指定了消息名字,所以。当我们的web服务启动后,就自动订阅这个服务器上的消息。

当然也可以自己手动去触发,刚刚的测试例子中也有手动触发的个例。

12)完毕。。。

时间: 2024-12-14 18:45:19

activemq的配置与结合spring使用的相关文章

ActiveMQ(二)与Spring集成

声明 转载请注明出处! Reprint please indicate the source! http://www.hiknowledge.top/2017/04/03/activemq%ef%bc%88%e4%ba%8c%ef%bc%89%e4%b8%8espring%e9%9b%86%e6%88%90/ ActiveMQ与Spring集成 由于历史原因,JMS有4个版本.Spring提供了用于简化JMS API使用的抽象框架,并且对用户屏蔽了JMS API中1.0.2和1.1版本的差异.

tomcat监听activemq jms配置

当从webservice接收到信息的时候,消息生产者producer立刻把收到的消息放入到jms里面,消费者cusomer这时要设置一个监听,当生产者发送消息时,只要消息被发出来,消费者就会接收到消息,然后进行相应的操作. 在tomcat里面,要进行配置. 首先在tomcat安装目录里面,对conf/context.xml进行配置,加入以下代码: <Resource name="jms/FailoverConnectionFactory" auth="Container

(转)关于ActiveMQ的配置

目前常用的消息队列组建无非就是MSMQ和ActiveMQ,至于他们的异同,这里不想做过多的比较.简单来说,MSMQ内置于微软操作系统之中,在部署上包含一个隐性条件:Server需要是微软操作系统.(对于这点我并去调研过MSMQ是否可以部署在非微软系统,比如:Linux,只是拍脑袋想了想,感觉上是不可以).对于ActiveMQ,微软系统和Linux都是可以部署的.从功能方面来说,一般最常用的就是:消息的收/发,感觉差异不大.从性能上来说,一般的说法是ActiveMQ略高.在稳定性上,个人感觉MSM

Spring配置与第一Spring HelloWorld

林炳文Evankaka原创作品. 转载请注明出处http://blog.csdn.net/evankaka 本文将主讲了Spring在Eclipse下的配置,并用Spring执行了第一个HelloWorld. 一.下载须要的文件 这里我们已经配置好Java的执行环境和装好Eclipse了. 下载Spring 下载地址:http://maven.springframework.org/release/org/springframework/spring/ 下载commons-logging 下载地

Spring配置及第个Spring HelloWorld

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 本文将主讲了Spring在Eclipse下的配置,并用Spring运行了第一个HelloWorld. 一.下载需要的文件 这里我们已经配置好Java的运行环境和装好Eclipse了. 下载Spring 下载地址:http://projects.spring.io/spring-framework/ 下载commons-logging 下载地址:http://commons.apache.or

第八章 分布式配置中心:Spring Cloud Config

Spring Cloud Config 是 Spring Cloud 团队创建的一个全新项目,用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持, 它分为服务端与客户端两个部分. 其中服务端也称为分布式配置中心, 它是一个独立的微服务应用, 用来连接配置仓库并为客户端提供获取配置信息. 加密/解密信息等访问接口:而客户端则是微服务架构中的各个微服务应用或基础设施, 它们通过指定的配置中心来管理应用资源与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息. Spring

spring-cloud-Zuul学习(一)--典型配置【重新定义spring cloud实践】

引言 上一节是一个最基本的zuul网关实例,它是整个spring-cloud生态里面“路由-服务”的一个缩影,后续也就是锦上添花.这节主要讲述zuul的一些基本典型配置,包括路由与一些增强配置. 路由配置 zuul作为微服务的“路由器”,有很多的路由功能: 路由配置简化与规则 前面单实例serviceId映射: zuul: routes: client-a: path: /client/** serviceId: client-a 是从/client/**到client-a服务的映射规则,其实还

创建客户端项目并读取服务化的配置中心(Consul + Spring Cloud Config)

创建客户端项目并读取服务化的配置中心 将配置中心注册到服务中心(Consul) POM文件添加依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.sprin

学习activemq,在spring中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:jms="http://www.springframework.org/sch