一、本文章包含的内容
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. 怎样运用好ZBrush中的布尔运算

     我们知道DynaMesh常用于基础模型的起稿到中模的制作,它是ZBrush ® 4R2新增的功能,其强大的功能除了对模型进行重新布线,还可以进行布尔运算.配合Insert笔刷进行布尔运算,可以做出Z ...

  2. ural Cipher Message

    Cipher Message Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Desc ...

  3. using语法糖

    资源的分类 首先说一下资源的分类: 托管资源:由CLR管理分配和释放资源 非托管资源:不受CLR管理的对象,如 文件(StreamReader,BinaryReader,DataTable,各种Str ...

  4. AIO 简介

    from:http://blog.chinaunix.net/uid-11572501-id-2868654.html   Linux的I/O机制经历了一下几个阶段的演进: 1. 同步阻塞I/O: 用 ...

  5. rpc使用举例

    #server.py from SimpleXMLRPCServer import SimpleXMLRPCServer def add(x,y): return x+y server=SimpleX ...

  6. SQL探险

    两张表,取相同字段比较 相同则显示true  否则FALSE.

  7. Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.

    Validation failed for one or more entities. See 'EntityValidationErrors' property for more details. ...

  8. 分布式消息系统:Kafka

    Kafka是分布式发布-订阅消息系统.它最初由LinkedIn公司开发,之后成为Apache项目的一部分.Kafka是一个分布式的,可划分的,冗余备份的持久性的日志服务.它主要用于处理活跃的流式数据. ...

  9. weblogic 10.x 上开发restful服务

    之前已经学习过 利用JAX-RS快速开发RESTful 服务,当时是jboss环境,如果原封不动的迁移到weblogic 10.x 版本,会杯具的发现应用启动失败,需要做些小调整: 项目结构如下: 需 ...

  10. 【java】企业级分布式搜索平台Solr视频教程

    课程背景为了满足高可用.可扩展并容错的分布式搜索引擎.Solr是一个高性能,采用Java5开发, 基于Lucene的全文搜索服务器.同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现 ...