http://activemq.apache.org/virtual-destinations.html

普通的 topic 是发布/订阅模式:消息会被广播发送给所有的订阅者,订阅者拿到的是全部消息,如下图:

而 virtual topic,在消息的传递过程中,多加了一个队列节点,如下图:

全量的消息先发送到队列,然后再分发给消费者。这么做有什么好处呢?

假定consumer1和consumer2分别是2个进程,2个进程共同处理消息,这算不算负载均衡呢?

其次,如果consumer1挂掉了,队列的消息还能发送给consumer2,这是不是failover呢?

示例代码:

producer

public static void main(String[] args) throws JMSException {
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
Connection connection = factory.createConnection();
connection.start();
Session session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE); // 创建virtual topic,前缀必须是"VirtualTopic.",当然这是可配置的
Topic topic = session.createTopic("VirtualTopic.bank");
MessageProducer producer = session.createProducer(topic);
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); for (int i = 0; i < 1; i++) {
TextMessage message = session.createTextMessage();
message.setText("hello zhang");
// 发布主题消息
producer.send(message);
System.out.println("Sent message: " + message.getText());
} session.close();
connection.close();
}

consumer

public static void main(String[] args) throws JMSException {
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
ActiveMQConnection connection = (ActiveMQConnection) factory.createConnection();
connection.start(); Session session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
// 根据 virtual topic 创建队列。格式为 "Consumer.*.VirtualTopic.>"
Queue queueA = session.createQueue("Consumer.A.VirtualTopic.bank");
Queue queueB = session.createQueue("Consumer.B.VirtualTopic.bank"); // 队列A创建订阅
MessageConsumer consumerA1 = session.createConsumer(queueA);
consumerA1.setMessageListener(new MessageListener() {
public void onMessage(Message message) {
TextMessage tm = (TextMessage) message;
System.out.println("A1: " + tm);
}
});
MessageConsumer consumerA2 = session.createConsumer(queueA);
consumerA2.setMessageListener(new MessageListener() {
public void onMessage(Message message) {
TextMessage tm = (TextMessage) message;
System.out.println("A2: " + tm);
}
}); // 队列B创建订阅
MessageConsumer consumerB1 = session.createConsumer(queueB);
consumerB1.setMessageListener(new MessageListener() {
public void onMessage(Message message) {
TextMessage tm = (TextMessage) message;
System.out.println("B1: " + tm);
}
});
MessageConsumer consumerB2 = session.createConsumer(queueB);
consumerB2.setMessageListener(new MessageListener() {
public void onMessage(Message message) {
TextMessage tm = (TextMessage) message;
System.out.println("B2: " + tm);
}
}); // session.close();
// connection.close();
}

上面只是demo,正常情况下,consumer应该在单独的进程中。

图解ActiveMQ virtual topic的更多相关文章

  1. ActiveMQ之topic主题模式

    开发环境我们使用的是ActiveMQ 5.11.1 Release的Windows版,官网最新版是ActiveMQ 5.12.0 Release,大家可以自行下载,下载地址.需要注意的是,开发时候,要 ...

  2. 基于ActiveMQ的Topic的数据同步——消费者持久化

    前面一章中介绍了activemq的初步实现:基于ActiveMQ的Topic的数据同步——初步实现 下面来解决持久化订阅的问题: (1)使用queue,即队列时,每个消息只有一个消费者,所以,持久化很 ...

  3. JMS学习七(ActiveMQ之Topic的持久订阅)

    非持久化订阅持续到它们订阅对象的生命周期.这意味着,客户端只能在订阅者活动时看到相关主题发布的消息.如果订阅者不活动,它会错过相关主题的消息.如果花费较大的开销,订阅者可以被定义为durable(持久 ...

  4. spring +ActiveMQ 实战 topic selecter指定接收

    spring +ActiveMQ 实战 topic selecter指定接收 queue:点对点模式,一个消息只能由一个消费者接受 topic:一对多,发布/订阅模式,需要消费者都在线(可能会导致信息 ...

  5. SPRING 集成 activemq 的 topic 模式

    概要 activemq 支持两种模式: 1.队列模式 2. 发布订阅者模式,topic有一个主题可以有多个订阅者.这种情况可以将一个消息,分发到多个消费者. 比如我有这样一个案例,用户需要同步,而且需 ...

  6. ActiveMQ之Topic

    与Queue不同,Topic实现的是发布/订阅模型,在下面的例子中,启动两个消费者共同监听一个Topic,然后循环给这个Topic发送多个消息. 例子: public class TopicTest ...

  7. 基于ActiveMQ的Topic的数据同步——初步实现

    一.背景介绍 公司自成立以来,一直以做项目为主,算是经累经验吧,自去年以来,我们部门准备将以前的项目做成产品,大概细分了几个小的产品,部们下面又分了几个团队,分别负责产品的研发,而我们属于平台团队,负 ...

  8. ActiveMQ Queue vs Topic vs VirtualTopic

    之前写过一篇文章讨论VirtualTopic,但觉得不够透彻,这里再根据实验结果进行一次横向对比破除模糊和选择困难症. 文章中核心对比要素是:消息副本和负载均衡 Queue的特点和优势 ActiveM ...

  9. activemq用户手册

    1 JMS 在介绍ActiveMQ之前,首先简要介绍一下JMS规范. 1.1 JMS的基本构件 1.1.1 连接工厂 连接工厂是客户用来创建连接的对象,例如ActiveMQ提供的ActiveMQCon ...

随机推荐

  1. ASP.NET开发总结

    ASP.NET的界面可以是.aspx,会对应有一个.aspx.cs的逻辑处理文件,.aspx的所有控件对应着变量,变量名就是控件的ID. 为了代码编写方便起见,一般将数据库表的新增字段,放在最后. 日 ...

  2. toggle 1.9 以后就被删除了

    toggle 1.9 以后就被删除了, 1.8.x  以前可用. $(function(){ $(".p_title").toggle( function(){ $(this).n ...

  3. _itemmod_day_limit

    控制玩家每天获得的物品上限 表说明 `comment` 备注 `entry` 物品 `limitCount`获取上限

  4. 使用CSS渐变

    转载自:https://developer.mozilla.org/zh-CN/docs/Web/Guide/CSS/Using_CSS_gradients CSS 渐变 是在 CSS3 Image ...

  5. Centos7下安装memcached

    1. which memcached //如果已经安装,会有“/usr/bin/memcached”类似的输出 memcached -h //memcache帮助列表 php -m | grep me ...

  6. pymouse 点击指定坐标点

    from pymouse import PyMouse mouse = PyMouse() mouse.click(,)

  7. ORA-00604的解决方法

    分类: Oracle 从错误的角度可以推出:应该是表空间不足   根据查看表空间的使用情况: select b.file_name 物理文件名, b.tablespace_name 表空间, b.by ...

  8. 学习笔记42—Win7下安装Linux双系统

    1.下载Linux镜像:http://mirrors.163.com/ubuntu-releases/18.04.1/ 方法一: 1.用软通牒软件将Linux的镜像写入空的优盘中, 具体如下: 1) ...

  9. java高并发解决方案

    高并发的解决方法有两种: 1.使用缓存 2.使用生成静态页面: (代码质量,不要性能低下的sql和代码.有的一条sql搞定的事,有人用了多个循环才能搞定.取决于程序员的经验!(还有就是从最基础的地方优 ...

  10. Pychram - 使用介绍

    Pychram - 使用介绍 PyCharm中Directory与Python package的区别 对于Python而言,有一点是要认识明确的,python作为一个相对而言轻量级的,易用的脚本语言( ...