`
xfjt297857539
  • 浏览: 153193 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

深入掌握JMS(四):实战Topic//消息头(zhuan)

    博客分类:
  • java
 
阅读更多
与Queue不同的是,Topic实现的是发布/订阅模型,在下面的例子中,启动2个消费者共同监听一个Topic,然后循环给这个Topic中发送多个消息。

import javax.jms.Connection;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQTopic;

public class TopicTest {

    public static void main(String[] args) throws Exception {
        ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("vm://localhost");

        Connection connection = factory.createConnection();
        connection.start();

        //创建一个Topic
        Topic topic= new ActiveMQTopic("testTopic");
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

        //注册消费者1
        MessageConsumer comsumer1 = session.createConsumer(topic);
        comsumer1.setMessageListener(new MessageListener(){
            public void onMessage(Message m) {
                try {
                    System.out.println("Consumer1 get " + ((TextMessage)m).getText());
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        });

        //注册消费者2
        MessageConsumer comsumer2 = session.createConsumer(topic);
        comsumer2.setMessageListener(new MessageListener(){
            public void onMessage(Message m) {
                try {
                    System.out.println("Consumer2 get " + ((TextMessage)m).getText());
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }

        });

        //创建一个生产者,然后发送多个消息。
        MessageProducer producer = session.createProducer(topic);
        for(int i=0; i<10; i++){
            producer.send(session.createTextMessage("Message:" + i));
        }
    }

}


运行后得到下面的输出结果:
Consumer1 get Message:0
Consumer2 get Message:0
Consumer1 get Message:1
Consumer2 get Message:1
Consumer1 get Message:2
Consumer2 get Message:2
Consumer1 get Message:3
Consumer2 get Message:3
Consumer1 get Message:4
Consumer2 get Message:4
Consumer1 get Message:5
Consumer2 get Message:5
Consumer1 get Message:6
Consumer2 get Message:6
Consumer1 get Message:7
Consumer2 get Message:7
Consumer1 get Message:8
Consumer2 get Message:8
Consumer1 get Message:9
Consumer2 get Message:9
说明每一个消息都会被所有的消费者消费。

----------------------------------------------------------------------------------
一个消息对象分为三部分:消息头(Headers),属性(Properties)和消息体(Payload)。对于StreamMessage和MapMessage,消息本身就有特定的结构,而对于TextMessage,ObjectMessage和BytesMessage是无结构的。一个消息可以包含一些重要的数据或者仅仅是一个事件的通知。
消息的Headers部分通常包含一些消息的描述信息,它们都是标准的描述信息。包含下面一些值:
  JMSDestination
消息的目的地,Topic或者是Queue。
  JMSDeliveryMode
消息的发送模式:persistent或nonpersistent。前者表示消息在被消费之前,如果JMS提供者DOWN了,重新启动后消息仍然存在。后者在这种情况下表示消息会被丢失。可以通过下面的方式设置:
Producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
JMSTimestamp
当调用send()方法的时候,JMSTimestamp会被自动设置为当前事件。可以通过下面方式得到这个值:
long timestamp = message.getJMSTimestamp();
  JMSExpiration
表示一个消息的有效期。只有在这个有效期内,消息消费者才可以消费这个消息。默认值为0,表示消息永不过期。可以通过下面的方式设置:
producer.setTimeToLive(3600000); //有效期1小时 (1000毫秒 * 60秒 * 60分)
  JMSPriority
消息的优先级。0-4为正常的优先级,5-9为高优先级。可以通过下面方式设置:
producer.setPriority(9);
  JMSMessageID
一个字符串用来唯一标示一个消息。
  JMSReplyTo
有时消息生产者希望消费者回复一个消息,JMSReplyTo为一个Destination,表示需要回复的目的地。当然消费者可以不理会它。
  JMSCorrelationID
通常用来关联多个Message。例如需要回复一个消息,可以把JMSCorrelationID设置为所收到的消息的JMSMessageID。
  JMSType
表示消息体的结构,和JMS提供者有关。
  JMSRedelivered
如果这个值为true,表示消息是被重新发送了。因为有时消费者没有确认他已经收到消息或者JMS提供者不确定消费者是否已经收到。
除了Header,消息发送者可以添加一些属性(Properties)。这些属性可以是应用自定义的属性,JMS定义的属性和JMS提供者定义的属性。我们通常只适用自定义的属性。
后面会讲到这些Header和属性的用法。
分享到:
评论

相关推荐

    英语学习网址(很多哦)

    - **goo 学网** (http://www.gooedu.cn/Article/en/zhuan4zhuan8/zhidao/) - **东方教育在线** (http://www.neworiental.org/) - **新东方英语 4+1 教程** (http://jxue.com/zt/05zt/zxyy/) - **新概念英语** ...

    英语免费资源(网站)资料.pdf

    20. **goo学网** (http://www.gooedu.cn/Article/en/zhuan4zhuan8/zhidao/):包含英语专业四级、八级的指导和资源。 此外,还有**东方教育在线** (www.neworiental.org/) 和 **新东方英语** 提供的4+1教程以及新...

    在外企工作三年的我 给大家一些英语学习的建议和忠告 附送下载资料无数

    20. **[国教在线](http://www.gooedu.cn/Article/en/zhuan4zhuan8/zhidao/goo)**:英语专四专八考试辅导。 以上网站涵盖了英语学习的各个方面,从基础词汇到高级语法,从口语练习到专业英语,应有尽有。建议大家...

    英语免费资源(网站).pdf

    20. **goo学网 (http://www.gooedu.cn/Article/en/zhuan4zhuan8/zhidao/)**:涵盖英语专业四级、八级的学习资料。 21. **东方教育在线 (http://www.neworiental.org/)**:新东方旗下的学习网站,提供英语教学课程。...

    Word排版应用神童教程

    小编语:随着计算机设备的不断普及,越来越多的办公自动化设备进入了...本文转自“赛迪网”-“电脑应用”-“办公自动化”专区:http://www0.ccidnet.com/school/zhuan/word.htm 在此向原作者表示敬意。 修订人:Abc5186

    域名判断后跳转

    在IT领域,特别是网站开发与维护中,域名判断后跳转是一种常见的技术手段,用于根据访问者所使用的不同域名,将他们导向至特定的页面或目录。...掌握这些技术,对于网站开发人员来说是十分必要的。

    echart 3D环形图 动画效果

    ECharts是一款由百度开源的,基于JavaScript的数据可视化库,它提供了丰富的图表类型,精美的图表效果,便捷...通过熟练掌握ECharts的API和配置项,我们可以创造出更多富有创意的图表,提升数据展示的质量和用户体验。

    网赚整站程序

    先打开conn.asp,把里面的"www.dd2d.cn/zhuan"改成你的网址 2.打开admin/conn.asp,把里面的"www.dd2d.cn/zhuan"改成你的网址 3.打开datebase/#33SSYY.MDB,打开里面的config,把里面的"www.dd2d.cn/zhuan"改成...

    编码器计数

    bai_zhuan=(int)zhuan/100; shi_zhuan=(int)zhuan0/10; ge_zhuan=(int)zhuan; write_data(table[bai_fen]); write_data(table[shi_fen]); write_data(table[ge_fen]); write_data(table[12]); write...

    gssdgv-zhuan-ke-master_java_

    《蚂蚁集团开源的Java研发框架——gssdgv-zhuan-ke-master_java_详解》 在现代软件开发中,高效、稳定且易维护的框架是项目成功的关键因素之一。蚂蚁集团作为全球知名的金融科技公司,其开源的Java研发框架——...

    zhuan_java_untilgw8_android_

    标题 "zhuan_java_untilgw8_android_" 暗示了这是一个关于使用Java语言在UntilGW8平台上开发Android游戏的项目,特别是一款简单的打砖块游戏。在这个项目中,我们可以深入学习到Java编程语言、Android应用开发的基础...

    PHOTOSHOP网站

    10. **CCIDNet.com/School/Zhuan/Photoshop6.htm** - **特色**: 特别针对Photoshop 6版本进行深入讲解。 - **适合人群**: 使用Photoshop 6版本的用户。 11. **Mamingzhe.Myrice.com** (Photoshop 6教学网站) - *...

    zhuan 2.zip

    在这个名为"zhuan 2.zip"的压缩包中,包含了一个支持移动端的转盘抽奖程序。这个程序的核心是通过JavaScript实现,使得用户可以通过点击来触发抽奖过程,从而增加用户体验的趣味性和参与度。 首先,我们来看“转盘...

    Delphi 将Foxpro表转换为Paradox表.rar

    Delphi 将Foxpro表转换为Paradox表,可能不太常用,不过也算是一个简单的数据库格式转换程序吧,或许对编写数据库开发程序有些许帮助。注:本程序运行后会直接读取DBF文件,若DBF报表文件不存在,程序会弹出错误信息...

    z zhuan sec_EH4_EH4Z文件转SEC文件_

    在IT行业中,转换不同格式的文件是一项常见的任务,特别是在嵌入式系统开发或者软件工程领域。...理解和掌握这种转换技巧对于IT专业人士,尤其是从事嵌入式系统开发的工程师来说,是必备的技能之一。

    zhuan-su-eliang.rar_labview 测_labview 测速_labview测速_labview转速测量_转

    在给定的“zhuan-su-eliang.rar”压缩包中,包含了一个名为“zhuan su eliang.vi”的虚拟仪器(VI),这显然是一款用于转速测量的应用程序。 转速测量是机械工程、汽车工业、电力系统等领域中常见的技术需求。...

    2.6.14 内核移植说明文档(zhuan)

    ### 2.6.14 内核移植与YAFFS文件系统支持详解 #### 一、2.6.14 内核移植步骤 **1.... - **背景**: 如果您使用的是其他人移植好的内核版本,则在开始编译之前应该清除中间文件。这是为了避免因使用的交叉编译工具不同...

    自媒体新媒体软件工具自媒体zhuan钱秘诀资料

    自媒体新媒体软件工具自媒体zhuan钱秘诀资料

    Map_out.rar_Map o_mapgis_mapgis noteo_mapgis zhuan jpg_out

    "Map o_mapgis_mapgis noteo_mapgis zhuan jpg_out"这部分可能是描述了这个压缩包的主要功能或者过程,即MapGIS的二次开发功能,用于将MapGIS的地图数据转换成JPG格式的光栅图像。"o_mapgis_mapgis noteo_mapgis...

    电力电子技术(王兆安)第五版课后习题解答

    本书全面系统地介绍了电力电子技术的基本原理、电路结构、工作特性及其应用等内容,并且配有丰富的例题和习题,旨在帮助读者深入理解电力电子技术的核心概念和技术要点。 ### 三、课后习题解答的重要性 课后习题是...

Global site tag (gtag.js) - Google Analytics