Topic消息

非持久的 Topic消息示例
对于非持久的 Topic消息的发送
       基本跟前而发送队列信息是一样的,以是把创建 Destination的地方,由创
建队列替换成创建 Topic,例如:
Destination destination =session createTopic( "mytopic");
对于非持久的 Topic消息的接收
1:必须要接收方在线,然后客户端再发送信息,接收方才能接收到消息
2:同样把创建 Destination的地方,由创建队列替换成创建 Topic,例如:
Destination destination session. createTopic("mytopic");
3:由于不知道客户端发送多少信息,因此改成 while循环的方式了,例如:
Message message consumer. receive():
   while (message!=null){
                  TextMessage txtMsg =(TextMessage)message;
                  System.out.printIn("收到消息:”+ txtMsg. getText());
                  message= consumer. receive(1000L);

}

生产者

package test.mq.topic;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage; import org.apache.activemq.ActiveMQConnectionFactory; public class Sender {
public static void main(String[] args) throws JMSException { ConnectionFactory ConnectionFactory=new ActiveMQConnectionFactory(
"tcp://localhost:61616"
); Connection connection=ConnectionFactory.createConnection();
connection.start(); Session session=connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE); Destination destination=session.createTopic("mytopic"); MessageProducer messageProducer=session.createProducer(destination); for(int i=1;i<=5;i++){
TextMessage textMessage=session.createTextMessage();
textMessage.setText("我是TOM ID为"+i);
messageProducer.send(textMessage);
System.out.println("生产者:"+textMessage.getText()); }
session.commit();
session.close();
connection.close();
}
}

控制台信息

消费者

package test.mq.topic;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage; import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.broker.ConsumerBrokerExchange; public class Receiver { public static void main(String[] args) throws Exception {
ConnectionFactory ConnectionFactory=new ActiveMQConnectionFactory(
"tcp://localhost:61616"
); Connection connection=ConnectionFactory.createConnection();
connection.start();
Session session=connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE); Destination destination=session.createTopic("mytopic");
MessageConsumer messageConsumer=session.createConsumer(destination);
Message msg= messageConsumer.receive(); while(msg!=null){
TextMessage msgs=(TextMessage) msg;
System.out.println("接受信息----》"+msgs.getText());
msg= messageConsumer.receive(1000L);
}
session.commit();
session.close();
connection.close();
}
}

控制台信息

对于持久的 Topic消息的发送
 

ConnectionFactory ConnectionFactory=new ActiveMQConnectionFactory("tcp://localhost:61616");
       Connection connection=ConnectionFactory.createConnection();
       Session session=connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
       Destination destination=session.createTopic("mytopic2");
       MessageProducer Producer=session.createProducer(destination);
       Producer.setDeliveryMode(DeliveryMode.PERSISTENT);
      connection.start();
      for(int i=1;i<=5;i++){
              TextMessage textMessage=session.createTextMessage();
              textMessage.setText("我是tom ID为"+i);
              messageProducer.send(textMessage);
              System.out.println("生产者:"+textMessage.getText());
        }
       session.commit();
       session.close();
      connection.close();

1:要用持久化订阅,发送消息者要用 DeliveryMode, PERSISTENT模式发现,在连接之前设定
2:一定要设置完成后,再 start这个 connection

对于持久的 Topic消息的接收

ConnectionFactory ConnectionFactory=new ActiveMQConnectionFactory("tcp://localhost:61616");
           Connection connection=ConnectionFactory.createConnection();
           connection.setClientID("cc1");
           Session session=connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
           Topic destination=session.createTopic("mytopic2");
           TopicSubscriber ts=session.createDurableSubscriber(destination, "T1");
            connection.start();
            Message msg= ts.receive();

while(msg!=null){
                         TextMessage msgs=(TextMessage) msg;
                          System.out.println("接受信息----》"+msgs.getText());
                           msg= ts.receive(1000L);
             }
            session.commit();
            session.close();
            connection.close();

1:需要在连接上设置消费者id,用来识别消费者
2:需要创建 TopicSubscriber来订阅
3:要设置好了过后再 start这个 connection
4:一定要先运行一次,等于向消息服务中间件注册这个消费者,然后再运行客户端发送信息,这个时候,
无论消费者是否在线,都会接收到,不在线的话,下次连接的时候,会把没有收过的消息都接收下来。

生产者

package test.mq.topic1;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage; import org.apache.activemq.ActiveMQConnectionFactory; public class Sender {
public static void main(String[] args) throws JMSException {
ConnectionFactory ConnectionFactory=new ActiveMQConnectionFactory(
"tcp://localhost:61616"
);
Connection connection=ConnectionFactory.createConnection();
Session session=connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
Destination destination=session.createTopic("mytopic2");
MessageProducer messageProducer=session.createProducer(destination);
messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT);
connection.start();
for(int i=1;i<=5;i++){
TextMessage textMessage=session.createTextMessage();
textMessage.setText("我是tom ID为"+i);
messageProducer.send(textMessage);
System.out.println("生产者:"+textMessage.getText());
}
session.commit();
session.close();
connection.close();
}
}

消费者

package test.mq.topic1;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.TopicSubscriber; import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.broker.ConsumerBrokerExchange; public class Receiver { public static void main(String[] args) throws Exception {
ConnectionFactory ConnectionFactory=new ActiveMQConnectionFactory(
"tcp://localhost:61616"
); Connection connection=ConnectionFactory.createConnection();
connection.setClientID("cc1");
Session session=connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
Topic destination=session.createTopic("mytopic2");
TopicSubscriber ts=session.createDurableSubscriber(destination, "T1");
connection.start();
Message msg= ts.receive();
while(msg!=null){
TextMessage msgs=(TextMessage) msg;
System.out.println("接受信息----》"+msgs.getText());
msg= ts.receive(1000L);
}
session.commit();
session.close();
connection.close();
}
}

控制台

总结:

关于持久化和非持久化消息
持久化消息
这是 Active的默认传送模式,此模式保证这些消息只被传送一次和成功使用一
次。对于这些消息,可靠性是优先考虑的因素。可靠性的另一个重要方面是确保持久性消
息传送至目标后,消息服务在向消费者传送它们之前不会丢失这些消息
这意味着在持久性消息传送至目标时,消息服务将其放入持久性数据存储。如果消
息服务由于某种原因导致失败,它可以恢复此消息并将此消息传送至相应的消费者。虽然
这样增加了消息传送的开销,但却增加了可靠性。
非持久化消息
保证这些消息最多被传送一次。对于这些消息,可靠性并非主要的考虑因素。此模
式并不要求持久性的数据存储,也不保证消息服务由于某种原因导致失败后消息不会丢
失。有两种方法指定传送模式:
1.使用 set DeliveryMode方法,这样所有的消息都采用此传送模式:如:
roducer set DeliveryMode( DeliveryMode NON PERSISTENT)
2.使用send方法为每一条消息设置传送模式

分布式-信息方式-JMS Topic示例的更多相关文章

  1. 分布式-信息方式-JMS Queue示例

    代码 package test.mq.helloword; import javax.jms.Connection; import javax.jms.ConnectionFactory; impor ...

  2. 分布式-信息方式- JMS基本概念

                                              JMS基本概念 ■JMs是什么          JMS Java Messag/ Servite,Java消息服务 ...

  3. 分布式-信息方式-JMS大纲

     一.简介 JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息, ...

  4. 分布式-信息方式-JMS可靠性机制

                        JMS的可靠性机制1.消息接收确认        JMS消息只有在被确认之后,才认为已经被成功地消费了.消息的成功消费通常包含三个阶段:客户接收消息.客户处理消 ...

  5. 分布式-信息方式-JMS信息结构

    JMS的消息结构JMS消息由以下几部分组成:消息头,属性和消息体消息头包含消息的识别信息和路由信息,消息头包含一些标准的属性如下:1: JMSDestination:由send方法设置2: JMSDe ...

  6. 分布式-信息方式-ActiveMQ示例

    实战 代码如下: 信息生产者 package test.mq.helloword; import javax.jms.Connection; import javax.jms.ConnectionFa ...

  7. 分布式-信息方式-ActiveMQ的Destination高级特性3

    虚拟destination用来创建逻辑destination,客户端可以通过它来生产和消费消息,它会把消息映射到物理destination. ActiveMQ支持2种方式: 1:虚拟主题(Virtua ...

  8. 分布式-信息方式-ActiveMQ的消息存储持久化

    ActiveMQ的消息存储持久化■概述ActiveMQ不仅支持 persistent和 non-persistent两种方式,还支持消息的恢复( recovery)方式PTPQueue的存储是很简单的 ...

  9. 分布式-信息方式-ActiveMQ的Destination高级特性2

    使用filtered destinations,在xml配置如下: <destinationInterceptors> <virtualDestinationInterceptor& ...

随机推荐

  1. Java后端技术面试汇总(第一套)

    面试汇总,整理一波,doc文档可点击[此处下载] 1.基础篇 1.1.Java基础 • 面向对象的特征:继承.封装和多态• final, finally, finalize 的区别• Exceptio ...

  2. 第六篇 ajax

    加载异步数据 6-1 加载异步数据 XMLHttpRequest--传统的JavaScript方法实现Ajax功能 6-1-a <!DOCTYPE html PUBLIC "-//W3 ...

  3. PHP扩展开发01:第一个扩展

    我们先假设业务场景,是需要有这么一个扩展,提供一个叫ccvita_string的函数,他的主要作用是返回一段字符.(这个业务场景实在太假,大家就这么看看吧)对应的PHP代码可能是这样: functio ...

  4. 无障碍开发(三)之ARIA aria-***属性值

    aria-***属性值

  5. 移动端H5开发自适应技巧

    移动端H5开发,必要要做到自适应各种分辨率的手机,下面由我为大家大致说一下,需要3步走 第一:head标签中添加: <meta name="viewport" content ...

  6. oracle 12C的新特性-CDB和PDB

    1.前言 CDB与PDB是Oracle 12C引入的新特性,在ORACLE 12C数据库引入的多租用户环境(Multitenant Environment)中,允许一个数据库容器(CDB)承载多个可插 ...

  7. IT技术网站博客推荐

    CSDN 全球最大中文IT社区,为IT专业技术人员提供最全面的信息传播和服务平台. 51CTO 技术成就梦想 - 中国领先的IT技术网站 itEye Java编程 Spring框架 Ajax技术 ag ...

  8. 工具安装——linux下安装JDK1.8

    1.查看Linux环境自带JDK 使用命令:# rpm -qa|grep gcj 显示内容其中包含相应信息# java-x.x.x-gcj-compat-x.x.x.x-xxjpp# java-x.x ...

  9. Zookeeper启动失败,报错 can not open chanel to 2

    zookeeper 3.4.8 安装在 7 台不同的虚拟机上,配置文件如下: tickTime= initLimit= syncLimit= dataDir=/var/zookeeper client ...

  10. 韦东山嵌入式Linux学习笔记07--Nandflash

    常用的flash有两种, Norflash和Nandflash, 前几年市场上的产品比较常见的方案时Norflash和Nandflash搭配使用, 因为norflash比较昂贵,相同的容量norfla ...