1. 原文地址:[ActiveMQ实战]基于JMS的pub/sub传播机制

发布订阅模型

就像订阅报纸,我们可以选择一份或者多份报纸。比如:北京日报、人民日报。这些报纸就相当于发布订阅模型中的topic。如果有很多人订阅了相同的报纸,那我们就在同一个topic中注册,对于报纸发行方,它就和所有的订阅者形成了一对多的关系。并且,当你开始订阅报纸之后,正常情况下,你订阅之前的报纸你是拿不到的,除非有人给你留存了;

pom.xml文件内容

<!-- https://mvnrepository.com/artifact/org.apache.activemq/activemq-core -->
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-core</artifactId>
<version>5.5.1</version>
</dependency>

消息生产者


/**
* 基于发布模式的 消息生产者
*/
public class JMSPubProducer { //默认连接用户名
private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;
//默认连接密码
private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
//默认的连接地址
private static final String BROKEURL = "tcp://xx.xx.xx.xx:61616";
//发送的消息数量
private static final int SENNUM = 10; public static void main(String[] args){
ConnectionFactory factory ; //连接工厂
Connection connection = null ; //连接
Session session ; //会话,接收或者发送消息的线程
Destination destination; //消息的目的地
MessageProducer messageProducer; //消息生产者
//实例化连接工厂
factory = new ActiveMQConnectionFactory(JMSPubProducer.USERNAME, JMSPubProducer.PASSWORD, JMSPubProducer.BROKEURL);
//通过连接工厂获取connection
try {
connection = factory.createConnection();
connection.start(); //启动连接
//创建session
session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
//创建主题
destination = session.createTopic("topic1");
//创建消息发布者
messageProducer = session.createProducer(destination);
//发送消息
sendMessage(session, messageProducer);
session.commit();
} catch (JMSException e) {
e.printStackTrace();
}finally{
if (connection != null) {
try {
connection.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
} /**
* 发送消息
* @param session
* @param mp
* @throws JMSException
*/
public static void sendMessage(Session session, MessageProducer mp) throws JMSException{
for(int i = 0 ; i < JMSPubProducer.SENNUM;i++){
TextMessage message = session.createTextMessage("ActiveMq 发布的消息 ---> " + i);
System.out.println("发布消息:" + "ActiveMq 发布的消息" + i);
mp.send(message);
}
} }

消息消费者(可以有多个)

import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory; import javax.jms.*; /**
* Created by boothsun on 2017/9/6.
*/
public class JMSSubConsumer { //默认连接用户名
private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;
//默认连接密码
private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
//默认的连接地址
private static final String BROKEURL = "tcp://119.29.182.145:61616"; public static void main(String[] args) {
ConnectionFactory factory ; //连接工厂
Connection connection = null ; //连接
Session session ; //会话,接收或者发送消息的线程
Destination destination; //消息的目的地
MessageConsumer messageConsumer; //消息消费者
//实例化连接工厂
factory = new ActiveMQConnectionFactory(JMSSubConsumer.USERNAME, JMSSubConsumer.PASSWORD, JMSSubConsumer.BROKEURL);
//通过连接工厂获取connection
try {
connection = factory.createConnection();
connection.start(); //启动连接
//创建session
session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
//创建连接消息队列,消息到达的目的地
destination = session.createTopic("topic1");
//创建消费者
messageConsumer = session.createConsumer(destination);
//注册消息监听
messageConsumer.setMessageListener(new Listener1());
}catch(Exception e){
e.printStackTrace();
}
}
} /**
* 订阅者1的监听
* 消息监听类
* @author xx
*/
class Listener1 implements MessageListener { @Override
public void onMessage(Message message) {
try {
System.out.println("订阅者一收到的消息:" + ((TextMessage)message).getText());
} catch (JMSException e) {
e.printStackTrace();
}
} }

测试类

对于订阅发布模型,要先启动订阅者,订阅者先订阅topic,再发布消息;否则先发布的消息将无法被后启动的订阅者消费。就像是上面说的订阅报纸,订阅之前的报纸,正常情况下,订阅者是拿不到的。

ActiveMQ基于JMS的pub/sub传播机制的更多相关文章

  1. ActiveMQ中JMS的可靠性机制

    全文用到的生产者代码: package cn.qlq.activemq; import javax.jms.Connection; import javax.jms.ConnectionFactory ...

  2. ActiveMq 之JMS 看这一篇就够了

    什么是JMS MQ 全称:Java MessageService 中文:Java 消息服务. JMS 是 Java 的一套 API 标准,最初的目的是为了使应用程序能够访问现有的 MOM 系 统(MO ...

  3. spring事务传播机制实例讲解

    http://kingj.iteye.com/blog/1680350   spring事务传播机制实例讲解 博客分类:   spring java历险     天温习spring的事务处理机制,总结 ...

  4. ActiveMQ:JMS开源框架入门介绍

    介绍基本的JMS概念与开源的JMS框架ActiveMQ应用,内容涵盖一下几点: 基本的JMS概念 JMS的消息模式 介绍ActiveMQ 一个基于ActiveMQ的JMS例子程序 一:JMS基本概念 ...

  5. spring事务隔离级别、传播机制以及简单配置

    转自 https://blog.csdn.net/zht741322694/article/details/78676964 一.spring支持的事务声明方式1.  编程式事务  当系统需要明确的, ...

  6. activemq和jms是种什么关系

    JMS是一个用于提供消息服务的技术规范,它制定了在整个消息服务提供过程中的所有数据结构和交互流程. 而activemq则是消息队列服务,是面向消息中间件(MOM)的最终实现,是真正的服务提供者. jm ...

  7. Spring事务传播机制和数据库隔离级别

    Spring事务传播机制和数据库隔离级别 转载 2010年06月26日 10:52:00 标签: spring / 数据库 / exception / token / transactions / s ...

  8. ActiveMQ基本详解与总结& 消息队列-推/拉模式学习 & ActiveMQ及JMS学习

    转自:https://www.cnblogs.com/Survivalist/p/8094069.html ActiveMQ基本详解与总结 基本使用可以参考https://www.cnblogs.co ...

  9. Spring的事务传播机制实例 (转)

    1,Propagation.REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中.详细解释在代码下方. 实例 员工service @Service public ...

随机推荐

  1. 51NOD 1227:平均最小公倍数——题解

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1227 懒得打公式了,看这位的吧:https://blog.csdn.ne ...

  2. React Patterns

    Contents Stateless function JSX spread attributes Destructuring arguments Conditional rendering Chil ...

  3. 国庆 Day1

    This is a 玄学 exam A.年轮蛋糕 最小的最大,二分首选 断环为链,check(x),x为答案,然后将每个大于x的子区间记录下来 如果有大于3个的话,那么x就可以是答案 那么·,在优化下 ...

  4. 全面解析JavaScript的Backbone.js框架中的Router路由

    这篇文章主要介绍了Backbone.js框架中的Router路由功能,Router在Backbone中相当于一个MVC框架中的Controller控制器功能,需要的朋友可以参考下. Backbone ...

  5. supervisor安装、配置和运行

    supervisor是python写的进程管理工具,supervisor能够批量对进程执行启动,停止,重启等操作,有效提高了运维效率.注意supervisor只能管理前台进程,supervisor会自 ...

  6. bfs和优先队列求数据三角形最大值

    此题用深搜很快就解决,我用宽度搜索和优先队列仅仅是为了练习他们的用法:深搜法在注释内: 1 #include<iostream> #include<cstring> #incl ...

  7. FreeRTOS - 任务使用注意

    如果使用xTaskCreate() 创建任务,任务栈使用的是FreeRTOS heap

  8. Semaphore信号量

    一.前言 互斥锁 同时只允许一个线程更改数据,而Semaphore是同时允许一定数量的线程更改数据 ,比如厕所有3个坑,那最多只允许3个人上厕所,后面的人只能等里面有人出来了才能再进去. 二.sema ...

  9. 【Tools】Windows下Github的配置和使用

    1.在网址:http://windows.github.com/下载git软件,具体的安装步骤可以参见:Windows 系统下Git安装图解 2.同样根据上面的教程生成SSH key: 3.将publ ...

  10. POJ 2823 Sliding Window ST RMQ

    Description An array of size n ≤ 106 is given to you. There is a sliding window of size k which is m ...