一、本文章包含的内容
1、列举了ActiveMQ中通过Queue方式发送、消费队列的代码(普通文本、json/xml字符串、对象数据)
2、spring+activemq方式
 
二、配置信息
1、activemq的pom.xml信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!--activemq  Begin-->
       <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-jms</artifactId>
           <version>${spring.version}</version>
       </dependency>
       <!-- <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-messaging</artifactId>
            <version>${spring.version}</version>
        </dependency>-->
       <dependency>
           <groupId>org.apache.activemq</groupId>
           <artifactId>activemq-all</artifactId>
           <version>5.14.0</version>
       </dependency>
       <!--activemq  End-->

2、activemq的配置文件:spring-jms.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<!-- 启用spring mvc 注解 -->
   <context:component-scan base-package="org.soa.test.activemq"/>
 
   <!-- 配置JMS连接工厂 -->
   <bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
       <property name="brokerURL" value="failover:(tcp://192.168.146.129:61616)" />
       <!--解决接收消息抛出异常:javax.jms.JMSException: Failed to build body from content. Serializable class not available to broke-->
       <property name="trustAllPackages" value="true"/>
       <!-- 是否异步发送 -->
       <property name="useAsyncSend" value="true" />
   </bean>
 
   <!--   Queue模式 Begin -->
 
   <!-- 定义消息队列(Queue) -->
   <bean id="queueDestination" class="org.apache.activemq.command.ActiveMQQueue">
       <!-- 设置消息队列的名字 -->
       <constructor-arg>
           <value>defaultQueueName</value>
       </constructor-arg>
   </bean>
 
   <!-- 配置JMS模板,Spring提供的JMS工具类,它发送、接收消息。(Queue) -->
   <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
       <property name="connectionFactory" ref="connectionFactory" />
       <property name="defaultDestination" ref="queueDestination" />
       <property name="pubSubDomain" value="false"/>
       <!--接收超时时间-->
       <!--<property name="receiveTimeout" value="10000" />-->
   </bean>
   <!--   Queue模式 End -->

三、队列发送端及测试程序

1、发送代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package org.soa.test.activemq.queues;
 
import org.soa.test.activemq.StudentInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Component;
 
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import java.util.List;
 
/**
 * Created by JamesC on 16-9-22.
 */
@Component
public class ProduceMsg {
 
    @Autowired
    private JmsTemplate jmsTemplate;
 
    /**
     * 向指定队列发送消息
     */
    public void sendMessage(Destination destination, final String msg) {
        System.out.println("向队列" + destination.toString() + "发送了消息------------" + msg);
        jmsTemplate.send(destination, new MessageCreator() {
            public Message createMessage(Session session) throws JMSException {
                return session.createTextMessage(msg);
            }
        });
    }
 
    /**
     * 向默认队列发送消息(默认队列名称在bean:queueDestination配置)
     */
    public void sendMessage(final String msg) {
        //queue://queue1
        String destination = jmsTemplate.getDefaultDestination().toString();
        System.out.println("向队列" + destination + "发送了消息------------" + msg);
        jmsTemplate.send(new MessageCreator() {
            public Message createMessage(Session session) throws JMSException {
                return session.createTextMessage(msg);
            }
        });
    }
 
    /**
     * 向默认队列发送消息
     */
    public void sendMessageConvertAndSend(final Object msg) {
 
        String destination = jmsTemplate.getDefaultDestination().toString();
        System.out.println("向队列" + destination + "发送了消息------------" + msg);
        //使用内嵌的MessageConverter进行数据类型转换,包括xml(JAXB)、json(Jackson)、普通文本、字节数组
        jmsTemplate.convertAndSend(destination, msg);
    }
 
    /**
     * 向指定队列发送消息
     */
    public void sendStudentInfo(Destination destination, final StudentInfo msg) {
        System.out.println("向队列" + destination.toString() + "发送了消息------------" + msg);
        jmsTemplate.send(destination, new MessageCreator() {
            public Message createMessage(Session session) throws JMSException {
                return session.createObjectMessage(msg);
            }
        });
    }
}

2、测试程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package org.soa.test.activemq.queues;
 
import com.alibaba.fastjson.JSON;
import org.apache.activemq.command.ActiveMQQueue;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.soa.test.activemq.StudentInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
import javax.jms.Destination;
import java.util.Date;
 
 
/**
 * Created by JamesC on 16-9-22.
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/spring-jms.xml")
public class ProduceMsgTest extends AbstractJUnit4SpringContextTests {
 
    @Autowired
    protected ApplicationContext ctx;
 
    /**
     * 队列名queue1  这里使用jms配置文件中的数据
     */
    @Autowired
    private Destination queueDestination;
 
    /**
     * 队列消息生产者
     */
    @Autowired
    private ProduceMsg produceMessage;
 
 
    //向默认队列发消息(文本)
    @Test
    public void produceMsg_DefaultQueue() {
        String msg = "这里是向默认队列发送的消息" + new Date().toString();
        produceMessage.sendMessage(msg);
    }
 
    //向默认队列发消息(Json字符串)
    @Test
    public void produceMsg_Json() {
        StudentInfo info = new StudentInfo();
        info.setId(1);
        info.setStdName("李磊");
        info.setStdNo("001");
        info.setEnterDate(new Date());  //队列存放的是时间戳
 
        String alibabaJson = JSON.toJSONString(info);
        produceMessage.sendMessage(alibabaJson);
    }
 
    //向默认队列发消息(使用convertAndSend发送对象)
    @Test
    public void produceMsg_ConvertAndSend() {
        StudentInfo info = new StudentInfo();
        info.setId(1);
        info.setStdName("李磊");
        info.setStdNo("001");
        info.setEnterDate(new Date());
 
        produceMessage.sendMessageConvertAndSend(info);
    }
 
    //向指定队列发消息(文本)
    @Test
    public void produceMsg_CustomQueue() {
        for (int i = 0; i < 20; i++) {
            ActiveMQQueue myDestination = new ActiveMQQueue("queueCustom");
            produceMessage.sendMessage(myDestination, "----发送消息给queueCustom");
        }
    }
 
    //向指定队列发消息(队列名称从XML读取)
    @Test
    public void produceMsg_XmlQueue() {
        for (int i = 0; i < 20; i++) {
            ActiveMQQueue destinationQueue = (ActiveMQQueue) applicationContext.getBean("queueDestination");
            produceMessage.sendMessage(destinationQueue, "----send my msg to queueXml");
        }
    }
 
    //向指定队列发消息(发送对象)
    @Test
    public void produceMsg_StudentInfo() {
 
        StudentInfo info = new StudentInfo();
        info.setId(1);
        info.setStdName("李磊");
        info.setStdNo("001");
        info.setEnterDate(new Date());
 
        ActiveMQQueue destination = new ActiveMQQueue("StudentInfo");
        produceMessage.sendStudentInfo(destination, info);
    }
}

四、队列消费端及测试程序

1、消费代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package org.soa.test.activemq.queues;
 
import org.soa.test.activemq.StudentInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.support.JmsUtils;
import org.springframework.stereotype.Component;
 
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.ObjectMessage;
import javax.jms.TextMessage;
 
/**
 * Created by JamesC on 16-9-22.
 */
@Component
public class ConsumeMsg {
    @Autowired
    private JmsTemplate jmsTemplate;
 
    /**
     * 接受消息
     */
    public String receive(Destination destination) {
        TextMessage tm = (TextMessage) jmsTemplate.receive(destination);
        String msg = "";
        try {
            msg = tm.getText();
            System.out.println("从队列" + destination.toString() + "收到了消息:\t" + msg);
 
        } catch (JMSException e) {
            e.printStackTrace();
            return "";
        }
        return msg;
    }
 
    /**
     * 接受消息
     */
    public StudentInfo receiveStudentInfo() {
        try {
            String destination = jmsTemplate.getDefaultDestination().toString();
            ObjectMessage msg=(ObjectMessage)jmsTemplate.receive(destination);
            return (StudentInfo)msg.getObject();
 
        } catch (JMSException e) {
            //检查性异常转换为非检查性异常
            throw JmsUtils.convertJmsAccessException(e);
        }
    }
 
    /**
     * 接受消息
     */
    public Object receiveConvertAndReceive() {
        String destination = jmsTemplate.getDefaultDestination().toString();
        Object msg = jmsTemplate.receiveAndConvert(destination);
        return msg;
    }
}

2、测试程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package org.soa.test.activemq.queues;
 
import org.apache.activemq.command.ActiveMQQueue;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.soa.test.activemq.StudentInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
/**
 * Created by JamesC on 16-9-22.
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/spring-jms.xml")
public class ConsumeMsgTest {
 
    @Autowired
    private ConsumeMsg consumeMsg;
 
    //从指定队列接收消息(文本)
    @Test
    public void receiveMsg() {
        //没有消息阻塞一段时间后会抛异常
        //java.lang.NullPointerException
        ActiveMQQueue destination = new ActiveMQQueue("defaultQueueName");
        consumeMsg.receive(destination);
    }
 
    //从指定队列接收消息(StudentInfo对象消息)
    @Test
    public void receiveStudentInfo() {
        StudentInfo msg = consumeMsg.receiveStudentInfo();
        System.out.println(msg.getStdName());
    }
 
    //从指定队列接收消息(Json对象)
    @Test
    public void receiveConvertAndReceive() {
 
        StudentInfo msg =(StudentInfo) consumeMsg.receiveConvertAndReceive();
        System.out.println(msg.getStdName());
    }
}

ActiveMQ_点对点队列(二)的更多相关文章

  1. SDUT-2132_数据结构实验之栈与队列二:一般算术表达式转换成后缀式

    数据结构实验之栈与队列二:一般算术表达式转换成后缀式 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 对于一个基于二元运 ...

  2. RabbitMQ 消息队列 二

    一:查看MQ的用户角色 rabbitmqctl list_users 二:添加新的角色,并授予权限 rabbitmqctl add_user xiaoyao 123456 rabbitmqctl se ...

  3. ActiveMQ笔记之点对点队列(Point-to-Point)

    1. 点对点通信 点对点是一种一对一通信方式,更像是有一个队列,一个人往队列里放消息,另一个人从队列中取消息,其最大的特点是一个消息只会被消费一次,即使有多个消费者同时消费,他们消费的也是不同的消息. ...

  4. day43-python消息队列二-queue模块

    Python提供了Queue模块来专门实现消息队列Queue对象 Queue对象实现一个fifo队列(其他的还有lifo.priority队列,这里不再介绍).queue只有maxsize一个构造参数 ...

  5. Sword 内核队列二

    #ifndef __GTC_FIFO_H_ #define __GTC_FIFO_H_ #ifndef GTC_MAX #define GTC_MAX(a,b) ((a) > (b) ? (a) ...

  6. 剖析nsq消息队列(二) 去中心化代码源码解析

    在上一篇帖子剖析nsq消息队列(一) 简介及去中心化实现原理中,我介绍了nsq的两种使用方式,一种是直接连接,还有一种是通过nslookup来实现去中心化的方式使用,并大概说了一下实现原理,没有什么难 ...

  7. linux网络编程之system v消息队列(二)

    今天继续学习system v消息队列,主要是学习两个函数的使用,开始进入正题: 下面则开始用代码来使用一下该发送函数: 在运行之前,先查看一下1234消息队列是否已经创建: 用上次编写的查看消息队列状 ...

  8. .net core使用rabbitmq消息队列 (二)

    之前有写过.net core集成使用rabbitmq的博文,见.net core使用rabbitmq消息队列,但是里面的使用很简单,而且还有几个bug,想改下,但是后来想了想,还是算了,之前使用的是. ...

  9. 数据结构实验之栈与队列二:一般算术表达式转换成后缀式(SDUT 2132)

    题目链接 #include <bits/stdc++.h> using namespace std; typedef long long ll; int ok(char ch, char ...

随机推荐

  1. Booth Multiplication Algorithm [ASM-MIPS]

    A typical implementation Booth's algorithm can be implemented by repeatedly adding (with ordinary un ...

  2. [cocos2d-x]深入--几个代表性的类 (续)

    摘要: 此文对cocos2d-x引擎中最具代表性,最能体现框架结构的几个类做了简单的介绍, 包括Director,Application, Renderer, EventDispatcher, Sch ...

  3. 配置WebSite的IIS时遇到的问题与解决方法

    http://www.cnblogs.com/mingmingruyuedlut/archive/2011/11/04/2235630.html#commentform

  4. 转:HTML网页中插入视频各种方法

    现在如果要在页面中使用video标签,需要考虑三种情况,支持Ogg Theora或者VP8(如果这玩意儿没出事的话)的(Opera.Mozilla.Chrome),支持H.264的(Safari.IE ...

  5. Visual Studio各版本工程文件之间的转换

    转载于:http://www.cnblogs.com/jmliao/p/5594179.html 由于VS版本比较多,低版本无法直接打开高版本的工程文件,通过对工程文件进行一些修改可以解决这些问题. ...

  6. nodejs里的module.exports和exports的关系

    关于node里面的module.exports和exports的异同,网上已经有很多的资料,很多的文章,很多的博客,看了很多,好像懂了,又好像不懂,过几天又不懂了...大致总结是这样的: //下面这种 ...

  7. Centos5.8 安装openvpn

    安装openssl 和 openssl-devel, 建议使用最新版本, 编译安装 yum install gcc-c++ wget http://www.openssl.org/source/ope ...

  8. ESXi 5.5 解决 cannot edit the settings of virtual machines of version 10

    ESXi 5.5 是VMWare提供的免费虚拟服务器软件, 因为其优秀的性能, 对CPU, 内存和虚拟机数量都解除了限制, 成为很多个人或者小型公司的首选虚拟化工具. 在日常管理时常碰到的一个问题是, ...

  9. .NET Core)的ZooKeeper异步客户端

    支持断线重连.永久watcher.递归操作并且能跨平台(.NET Core)的ZooKeeper异步客户端   阅读目录 什么是ZooKeeper? 项目介绍 提供的功能 使用说明 FAQ 在公司内部 ...

  10. 设置word里的代码格式,使之有底纹的效果

    目录 1    实现效果:    1 2    怎么才能在word里实现这样的显示?    1 如何设置word里的代码格式,使之有底纹的效果    2     实现效果: 怎么才能在word里实现这 ...