消息队列:快速上手ActiveMQ消息队列的JMS方式使用(两种模式:Topic和Queue的消息推送和订阅)
1、实现功能
希望使用一套API,实现两种模式下的消息发送和接收功能,方便业务程序调用
1、发送Topic
2、发送Queue
3、接收Topic
4、接收Queue
2、接口设计
根据功能设计公共调用接口
- /**
- * 数据分发接口(用于发送、接收消息队列数据)
- *
- * @author eguid
- *
- */
- public interface MsgDistributeInterface {
- /**
- * 发送到主题
- *
- * @param topicName -主题
- * @param data -数据
- * @return
- */
- public boolean sendTopic(String topicName, byte[] data);
- /**
- * 发送到主题
- * @param topicName -主题
- * @param data-数据
- * @param offset -偏移量
- * @param length -长度
- * @return
- */
- boolean sendTopic(String topicName, byte[] data, int offset, int length);
- /**
- * 发送到队列
- *
- * @param queueName -队列名称
- * @param data -数据
- * @return
- */
- public boolean sendQueue(String queueName, byte[] data);
- /**
- * 发送到队列
- * @param queueName -队列名称
- * @param data -数据
- * @param offset
- * @param length
- * @return
- */
- public boolean sendQueue(String queueName, byte[] data,int offset, int length);
- /**
- * 接收队列消息
- * @param queueName 队列名称
- * @param listener
- * @throws JMSException
- */
- void receiveQueue(String queueName, MessageListener listener) throws JMSException;
- /**
- * 订阅主题
- * @param topicName -主题名称
- * @param listener
- * @throws JMSException
- */
- void receiveTopic(String topicName, MessageListener listener) throws JMSException;
- }
3、基于ActiveMQ的接口实现
- /**
- * 基于activeMQ的消息生产者/消费者实现(初始化该对象时即初始化连接消息队列,如果无法连接到消息队列,立即抛出异常)
- *
- * @author eguid
- *
- */
- public class ActiveMQImpl implements MsgDistributeInterface {
- private String userName;
- private String password;
- private String brokerURL;
- private boolean persistentMode;//持久化模式
- //连接工厂
- ConnectionFactory connectionFactory;
- //发送消息的线程
- Connection connection;
- // 事务管理
- Session session;
- //存放各个线程订阅模式生产者
- ThreadLocal<MessageProducer> topicThreadLocal = new ThreadLocal<MessageProducer>();
- //存放各个线程队列模式生产者
- ThreadLocal<MessageProducer> queueThreadLocal = new ThreadLocal<MessageProducer>();
- public ActiveMQImpl(String userName, String password, String brokerURL) throws JMSException {
- this(userName, password, brokerURL, true);
- }
- public ActiveMQImpl(String userName, String password, String brokerURL,boolean persistentMode) throws JMSException {
- this.userName = userName;
- this.password = password;
- this.brokerURL = brokerURL;
- this.persistentMode=persistentMode;
- init();
- }
- public void init() throws JMSException {
- try {
- // 创建一个链接工厂
- connectionFactory = new ActiveMQConnectionFactory(this.userName, this.password, this.brokerURL);
- // 从工厂中创建一个链接
- connection = connectionFactory.createConnection();
- // 开启链接
- connection.start();
- // 创建一个事务(订阅模式,事务采用自动确认方式)
- session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
- } catch (JMSException e) {
- throw e;
- }
- }
- @Override
- public boolean sendTopic(String topicName, byte[] data) {
- return sendTopic(topicName, data, 0, data.length);
- }
- @Override
- public boolean sendTopic(String topicName, byte[] data, int offset, int length) {
- return send(true, topicName, data, offset, length);
- }
- @Override
- public boolean sendQueue(String queueName, byte[] data) {
- return sendQueue(queueName, data, 0, data.length);
- }
- @Override
- public boolean sendQueue(String queueName, byte[] data, int offset, int length) {
- return send(false, queueName, data, offset, length);
- }
- /**
- * 发送数据
- *
- * @param name
- * @param data
- * @param offset
- * @param length
- * @param type
- * -类型
- * @return
- */
- private boolean send(boolean type, String name, byte[] data, int offset, int length) {
- try {
- MessageProducer messageProducer = getMessageProducer(name, type);
- BytesMessage msg = createBytesMsg(data, offset, length);
- System.err.println(Thread.currentThread().getName()+"发送消息");
- // 发送消息
- messageProducer.send(msg);
- } catch (JMSException e) {
- return false;
- }
- return false;
- }
- public void receive(String topicName) throws JMSException {
- final Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
- Topic topic =session.createTopic(topicName);
- MessageConsumer consumer=session.createConsumer(topic);
- consumer.setMessageListener(new MessageListener() {
- @Override
- public void onMessage(Message message) {
- BytesMessage msg=(BytesMessage) message;
- System.err.println(Thread.currentThread().getName()+"收到消息:"+msg.toString());
- }
- });
- }
- /**
- * 创建字节数组消息
- *
- * @param data
- * @param offset
- * @param length
- * @return
- * @throws JMSException
- */
- private BytesMessage createBytesMsg(byte[] data, int offset, int length) throws JMSException {
- BytesMessage msg = session.createBytesMessage();
- msg.writeBytes(data, offset, length);
- return msg;
- }
- /**
- * 创建对象序列化消息
- * @param obj
- * @return
- * @throws JMSException
- */
- private ObjectMessage createMapMsg(Serializable obj) throws JMSException {
- // MapMessage msg = session.createMapMessage();//key-value形式的消息
- ObjectMessage msg = session.createObjectMessage(obj);
- return msg;
- }
- /**
- * 创建字符串消息
- * @param text
- * @return
- * @throws JMSException
- */
- private TextMessage createTextMsg(String text) throws JMSException {
- TextMessage msg = session.createTextMessage(text);
- return msg;
- }
- /**
- * 获取创建者
- *
- * @param name -名称(主题名称和队列名称)
- * @param type -类型(true:topic,false:queue)
- * @return
- * @throws JMSException
- */
- private MessageProducer getMessageProducer(String name, boolean type) throws JMSException {
- return type?getTopicProducer(name):getQueueProducer(name);
- }
- /**
- * 创建或获取队列
- * @param queueName
- * @return
- * @throws JMSException
- */
- private MessageProducer getQueueProducer(String queueName) throws JMSException {
- MessageProducer messageProducer = null;
- if ((messageProducer = queueThreadLocal.get()) == null) {
- Queue queue = session.createQueue(queueName);
- messageProducer = session.createProducer(queue);
- //是否持久化(1-不持久化(如果没有消费者,消息就也会自动失效),2-持久化(如果没有消费者进行消费,消息队列也会缓存消息等待消费者进行消费))
- messageProducer.setDeliveryMode(persistentMode?DeliveryMode.PERSISTENT:DeliveryMode.NON_PERSISTENT);
- queueThreadLocal.set(messageProducer);
- }
- return messageProducer;
- }
- /**
- * 创建或获取主题
- * @param topicName
- * @return
- * @throws JMSException
- */
- private MessageProducer getTopicProducer(String topicName) throws JMSException {
- MessageProducer messageProducer = null;
- if ((messageProducer = topicThreadLocal.get()) == null) {
- Topic topic = session.createTopic(topicName);
- messageProducer = session.createProducer(topic);
- //是否持久化(1-不持久化(如果没有消费者,消息就也会自动失效),2-持久化(如果没有消费者进行消费,消息队列也会缓存消息等待消费者进行消费))
- messageProducer.setDeliveryMode(persistentMode?DeliveryMode.PERSISTENT:DeliveryMode.NON_PERSISTENT);
- topicThreadLocal.set(messageProducer);
- }
- return messageProducer;
- }
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- @Override
- public void receiveQueue(String queueName,MessageListener listener) throws JMSException {
- final Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
- Queue topic =session.createQueue(queueName);
- MessageConsumer consumer=session.createConsumer(topic);
- consumer.setMessageListener(listener);
- }
- @Override
- public void receiveTopic(String topicName,MessageListener listener) throws JMSException {
- final Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
- Topic topic =session.createTopic(topicName);
- MessageConsumer consumer=session.createConsumer(topic);
- consumer.setMessageListener(listener);
- }
4、测试一下Topic和Queue
- public static void main(String[] args) throws JMSException{
- //如果创建失败会立即抛出异常
- MsgDistributeInterface producter = new ActiveMQImpl("system", "manager", "tcp://127.0.0.1:61616");
- Test testMq = new Test();
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- //Thread 1
- new Thread(testMq.new ProductorMq(producter)).start();
- //Thread 2
- new Thread(testMq.new ProductorMq(producter)).start();
- //Thread 3
- new Thread(testMq.new ProductorMq(producter)).start();
- //Thread 4
- new Thread(testMq.new ProductorMq(producter)).start();
- //Thread 5
- new Thread(testMq.new ProductorMq(producter)).start();
- //Thread 6
- new Thread(testMq.new ProductorMq(producter)).start();
- //订阅接收线程Thread 1
- new Thread(new Runnable() {
- @Override
- public void run() {
- try {
- producter.receiveTopic("eguid-topic",new MessageListener() {
- @Override
- public void onMessage(Message message) {
- BytesMessage msg=(BytesMessage) message;
- System.err.println(Thread.currentThread().getName()+"订阅主题消息:"+msg.toString());
- }
- });
- } catch (JMSException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }).start();
- //订阅接收线程Thread 2
- new Thread(new Runnable() {
- @Override
- public void run() {
- try {
- producter.receiveTopic("eguid-topic",new MessageListener() {
- @Override
- public void onMessage(Message message) {
- BytesMessage msg=(BytesMessage) message;
- System.err.println(Thread.currentThread().getName()+"订阅主题消息:"+msg.toString());
- }
- });
- } catch (JMSException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }).start();
- //队列消息生产线程Thread-1
- new Thread(testMq.new QueueProductor(producter)).start();
- //队列消息生产线程Thread-2
- new Thread(testMq.new QueueProductor(producter)).start();
- //队列接收线程Thread 1
- new Thread(new Runnable() {
- @Override
- public void run() {
- try {
- producter.receiveQueue("eguid-queue",new MessageListener() {
- @Override
- public void onMessage(Message message) {
- BytesMessage msg=(BytesMessage) message;
- System.err.println(Thread.currentThread().getName()+"收到队列消息:"+msg.toString());
- }
- });
- } catch (JMSException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }).start();
- //队列接收线程Thread2
- new Thread(new Runnable() {
- @Override
- public void run() {
- try {
- producter.receiveQueue("eguid-queue",new MessageListener() {
- @Override
- public void onMessage(Message message) {
- BytesMessage msg=(BytesMessage) message;
- System.err.println(Thread.currentThread().getName()+"收到队列消息:"+msg.toString());
- }
- });
- } catch (JMSException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }).start();
- }
- private class ProductorMq implements Runnable{
- Jtt809MsgProducter producter;
- public ProductorMq(Jtt809MsgProducter producter){
- this.producter = producter;
- }
- @Override
- public void run() {
- while(true){
- try {
- String wang=Thread.currentThread().getName()+"Hello eguid! This is topic.";
- producter.sendTopic("eguid-topic",wang.getBytes());
- Thread.sleep(2000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }
- private class QueueProductor implements Runnable{
- Jtt809MsgProducter producter;
- public QueueProductor(Jtt809MsgProducter producter){
- this.producter = producter;
- }
- @Override
- public void run() {
- while(true){
- try {
- String eguid=Thread.currentThread().getName()+"Hello eguid! This is queue.";
- producter.sendQueue("eguid-queue",eguid.getBytes());
- Thread.sleep(2000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }
-------------------End--------------------
消息队列:快速上手ActiveMQ消息队列的JMS方式使用(两种模式:Topic和Queue的消息推送和订阅)的更多相关文章
- PHP版微信公共平台消息主动推送,突破订阅号一天只能发送一条信息限制
2013年10月06日最新整理. PHP版微信公共平台消息主动推送,突破订阅号一天只能发送一条信息限制 微信公共平台消息主动推送接口一直是腾讯的私用接口,相信很多朋友都非常想要用到这个功能. 通过学习 ...
- 数据结构队列的java实现,包括线性和链式两种方式
实现的思路为: 采用泛型的方式,首先定义了一个Queue的接口,然后通过实现该接口实现了线性和链式的两种形式的队列: 接口代码如下: package com.peter.java.dsa.interf ...
- [Todo] Redis里面队列的两种模式,以及抢红包在Redis中的实现
两种队列模式: 一种是利用list的lpush/rpop等 另一种是redis自带的发布者/订阅者模式 http://www.cnblogs.com/alazalazalaz/p/5512258.ht ...
- ActiveMQ两种模式PTP和PUB/SUB<转>
1.PTP模型 PTP(Point-to-Point)模型是基于队列(Queue)的,对于PTP消息模型而言,它的消息目的是一个消息队列(Queue),消息生产者每次发送消息总是把消息送入消息队列中, ...
- SpringBoot整合ActiveMq实现Queue和Topic两种模式(看不懂你来打我)
目录 一.前言 二.ActiveMq的下载和使用 三.依赖准备 四.yml文件配置 五.配置Bean 六.创建生产者(Queue+Topic) 七.创建消费者(Topic模式下) 八.测试结果(Top ...
- logstash快速入门 (这篇文章很不错 ) | 两种方式往logstash传输数据实例:Apache 日志(从文件获取)、Syslog方式
原文地址:http://www.2cto.com/os/201411/352015.html 原文地址:http://logstash.net/docs/1.4.2/tutorials/getting ...
- AngularJS+ASP.NET MVC+SignalR实现消息推送
原文:AngularJS+ASP.NET MVC+SignalR实现消息推送 背景 OA管理系统中,员工提交申请单,消息实时通知到相关人员及时进行审批,审批之后将结果推送给用户. 技术选择 最开始发现 ...
- Android应用实现Push推送消息原理
本文介绍在Android中实现推送方式的基础知识及相关解决方案.推送功能在手机开发中应用的场景是越来起来了,不说别的,就我 们手机上的新闻客户端就时不j时的推送过来新的消息,很方便的阅 ...
- SpringBoot使用JMS(activeMQ)的两种方式 队列消息、订阅/发布
刚好最近同事问我activemq的问题刚接触所以分不清,前段时间刚好项目中有用到,所以稍微整理了一下,仅用于使用 1.下载ActiveMQ 地址:http://activemq.apache.org/ ...
随机推荐
- Android有关surfaceView又一次创建的问题。
近期在做一个Android视频播放器的项目.遇到一个问题,就是锁屏之后.surfaceview就会被销毁掉,然后就会出现各种错误.到csdn论坛去发帖提问,各种所谓的大神都说,解锁屏在又一次创建一个, ...
- 某个时间段关闭API
def bet(): if 000000 < int(time.strftime("%H%M%S", time.localtime())) < 90000: print ...
- gulp入门-压缩js/css文件(windows)
类似于grunt,都是基于Node.js的前端构建工具.不过gulp压缩效率更高. 工具/原料 nodejs/npm 方法/步骤 首先要确保pc上装有node,然后在global环境和项目文件中都in ...
- iOS开发人员程序许可协议
请细致阅读以下的许可协议条款和条件之前下载或使用苹果软件. 这些条款和条件构成你和苹果之间的法律协议. iOS开发人员程序许可协议 目的 你想使用苹果软件(例如以下定义)来开发一个或多个应 ...
- Spark源码分析之七:Task运行(一)
在Task调度相关的两篇文章<Spark源码分析之五:Task调度(一)>与<Spark源码分析之六:Task调度(二)>中,我们大致了解了Task调度相关的主要逻辑,并且在T ...
- 九度OJ 1036:Old Bill (老比尔) (基础题)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2691 解决:1432 题目描述: Among grandfather's papers a bill was found. 72 ...
- 在WePY中实现了小程序的组件化开发,组件的所有业务与功能在组件本身实现,组件与组件之间彼此隔离,上述例子在WePY的组件化开发过程中,A组件只会影响到A所绑定的myclick
wepyjs - 小程序组件化开发框架 https://tencent.github.io/wepy/document.html#/?id=%e5%be%ae%e4%bf%a1%e5%b0%8f%e7 ...
- 辛星跟您玩转vim第四节之操作文本内容
首先值得一提的是.我的vim教程pdf版本号已经写完了.大家能够去下载,这里是csdn的下载地址:csdn下载,假设左边的下载地址挂掉了,也能够自行在浏览器以下输入例如以下地址进行下载:http:// ...
- hashMap的线程不安全
hashMap是非线程安全的,表现在两种情况下: 1 扩容: t1线程对map进行扩容,此时t2线程来读取数据,原本要读取位置为2的元素,扩容后此元素位置未必是2,则出现读取错误数据. 2 hash碰 ...
- Python爬虫 —— 抓取美女图片(Scrapy篇)
杂谈: 之前用requests模块爬取了美女图片,今天用scrapy框架实现了一遍. (图片尺度确实大了点,但老衲早已无恋红尘,权当观赏哈哈哈) Item: # -*- coding: utf-8 - ...