首页 > 其他分享 >JMS规范与ActiveMQ简记

JMS规范与ActiveMQ简记

时间:2023-09-14 14:35:34浏览次数:39  
标签:publisher JMS 发送 简记 session 消息 message ActiveMQ


前一段时间公司的产品中使用了ActiveMQ作为消息通知的工具,也简要记录了一些概念,整理后与大家分享一下(部分内容摘自网络,详见参考资料一栏)。

 


一、ActiveMQ是一个JMS规范的一个实现。


在JMS中间主要定义了2种消息模式Point-to-Point (点对点)和Publich/Subscribe Model(发布/订阅者)。


其中在Publich/Subscribe模式下又有Nondurable subscription(非持久化订阅)和durable subscription(持久化订阅)2种消息处理方式。


1、Queue(队列):


(1)一条消息仅能被一个消费者收到,如果在message发送的时候没有可用的消费者,它将被保存一直到能处理该message的消费者,如果一个消费者收到消息后却不响应它,这条消息将被转到另一个消费者那里。一个队列有很多消费者,并且可用的消费者可以负载均衡。


(2)点对点模型中,每个消息都有一个发送者和一个接收者,消息中介(broker)收到发送者的消息,会



将消息放入队列中,而接收者请求并接收队列中的一条消息后,这条消息就会从队列中删除。消息队 列中的每条消息只能投递给一个接收者,但并不意味着只能使用一个接收者从队列中取消息,根据业 务需要,可以使用多个接收者同时从队列中请求消息,分担处理压力。但是需要注意的是,单个接收 者收到的消息是按照发送顺序的,多个接收者因为多线程的关系,并不能保证收到的消息一定是原序 的。


2、Topic(主题):


(1)Topic通过publish和subscribe实现.


一条消息被publish,他将发布到一个主题上,可以有多个订阅者去访问该消息.消息将一直维持在主题中,直到该主题的所有订阅者都取走消息的一个副本.也可以设置消息的耐久性(消息在主题中停留的时间).



JMS1.1


1.StreamMessage :消息体是 Java 流,写入和读出都是顺序的.

2.MapMessage :消息体包含 key-value 对, key 为 String , value 为基本类型,可以通过迭代器访问.

3.TextMessage :消息体是 String.

4.ObjectMessage :消息体是可序列化的 Java 对象.


5.BytesMessage :消息体是字节数组可以通过 message.clearBody() 来清除消息体;但在消费端,消息体是只读的,针对消息的写操作都会抛出 MessageNotWritableException 异常 .



三、 消息发送的目的地:JMSDestination


消息发送的目的地(队列或主题);创建消息时可以设置 JMSDestination ,但是在发送完成时其值会更新为发送方所指定的 JMSDestination ,也就是说发送前该字段会被忽略;当消息被消费时,该字段的值与在它被发送时被设置的值是相同的 .



四、 消息的传输模式:JMSDeliveryMode


分为两种:

DeliveryMode.PERSISTENT :保证消息仅传一次, JMS Provider 服务停止后消息不会丢失;

DeliveryMode.NON_PERSISTENT :消息最多传一次,消息会因 JMS Provider 停止后丢失;

同 JMSDestination 一样,在发送前设置的会被忽略.

在 JMS Provider 重启后, NON_PERSISTENT 消息丢失了,而 PERSISTENT 消息能正常被消费者消费。



JMSReplyTo


JMSDestination


发送端:


Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 创建目的地
Destination destination = session.createQueue("JMS.DEMO");
Destination destination2 = session.createQueue("JMS.DEMO3");
// 创建生产者
MessageProducer publisher = session.createProducer(destination);
// 设置传输模式
publisher.setDeliveryMode(DeliveryMode.PERSISTENT);
// 创建消息
TextMessage message = session.createTextMessage("Test Message");
message.setJMSReplyTo(destination2);
// 发送消息
publisher.send(message);


 接收端 (可以根据情况决定是否需要回复):


public void onMessage(Message message) {
    try {
        System.out.println("Receive message: " + message);
        if (message.getJMSReplyTo() != null) {
            session.createProducer(message.getJMSReplyTo()).send(session.createTextMessage("This is a reply to"
                                                                                       + message.getJMSReplyTo()));
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}


 


JMSExpiration


消息的过期时间,其值为当前时间加上存活时间(毫秒);当存活时间设置为 0 时,该字段的值也被设置为 0 ,表示永不过期;消费端在一般情况下都不会接收到过期的消息,但 JMS Provider 并不保证这一点;


Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 创建目的地
Destination destination = session.createQueue("JMS.DEMO");
// 创建生产者
MessageProducer publisher = session.createProducer(destination);
// 设置传输模式
publisher.setDeliveryMode(DeliveryMode.PERSISTENT);
// 创建消息
TextMessage message = session.createTextMessage("Test Message");
// 发送消息
publisher.setTimeToLive(5000);
publisher.send(message);


不断更新中...



附参考资料:


http://www.blogjava.net/caojianhua/archive/2012/07/26/384095.html  JMS 规范

标签:publisher,JMS,发送,简记,session,消息,message,ActiveMQ
From: https://blog.51cto.com/u_6978506/7470111

相关文章

  • JMS Header
    一个消息对象分为三部分:消息头(Headers),属性(Properties)和消息体(Payload)。对于StreamMessage和MapMessage,消息本身就有特定的结构,而对于TextMessage,ObjectMessage和BytesMessage是无结构的。一个消息可以包含一些重要的数据或者仅仅是一个事件的通知。消息的Headers部分通常包......
  • JMS connection pools and sessions pools in WebSphere Application Server
    转载:[url]http://www-01.ibm.com/support/docview.wss?uid=swg21168924QuestionFrequentlyAskedQuestionsconcerningconnectionpoolsandsessionspoolsinIBM®WebSphere®ApplicationServer.AnswerQ:WebSphereMQQueueConnectionFactoriesinWebSphere......
  • 【ActiveMQ】Failed to start Apache ActiveMQ (localhost, ID_XXX)
    问题描述使用"bin\win64\activemq.bat"启动apache-activemq-5.18.2出错。jvm1|ERROR|FailedtostartApacheActiveMQ(localhost,ID:)jvm1|java.io.IOException:TransportConnectorcouldnotberegisteredinJMX:java.io.IOException:Failedtobin......
  • 群晖(Synology)NAS 后台安装 Docker 后配置 Activemq Artemis
    因最近需要在本地调试消息策略。如果搞个服务器装就太辛苦了,所以就想到了NAS,我们的NAS上已经装了Docker,我们直接运行一个ActivemqArtemis的镜像不就好了。下载镜像在进入NAS的容器管理后,访问Registry。然后输入activeMq进行查找。  选择已经找到的镜像,然后......
  • 应该下那个 ActiveMQ
    最近在搞ActiveMQ的时候,发现有2个ActiveMQ可以下载。应该下那个呢?  JMS即JavaMessageService,是JavaEE的消息服务接口。JMS主要有两个版本:1.1和2.0。2.0和1.1相比,主要是简化了收发消息的代码。所谓消息服务,就是两个进程之间,通过消息服务器传递消息。实际上Ac......
  • iic和spi简记
    IIC通信协议两线式串行总线,多用于主控制器和从器件间的主从通信,在小数据量场合使用,有传输距离短,任意时刻只能有一个主机等特性。  SDA(Serialdata)数据线,D代表Data也就是数据,SendData也就是用来传输数据的SCL(Serialclockline)时钟线,C代表Clock也就是时钟也就是......
  • dockerfile搭建activemq5.16.5
    dockerfile搭建activemq5.16.5搭建环境最小化的centos7.5家目录下完成如下操作环境构建脚本#!/bin/bash#authorbygwl###2023-02-10docker安装配置yuminstallwgetntpdatetelnetvimnet-toolsbash-completiongccgcc-c++make-ysed-i.bak's/SELINUX=enfor......
  • linux安装ActiveMQ,并配置开机自启--九五小庞
    1.解压activemq压缩包,重命名文件夹#cd/usr/local#tar-zxvfapache-activemq-5.11.1-bin.tar.gz#mvapache-activemq-5.11.1activemq2.防火墙开启activemq端口8161(管理平台端口)和61616(通讯端口)#vi/etc/sysconfig/iptables-AINPUT-mstate--stateNEW-mtcp-ptcp--......
  • GIT简记
    GIT简记gitinitgitremoteaddoriginhttp://xxx.com/xxx.gitgitpulloriginmastergitstatusgitadd.gitcommit-m'修改日志'gitpushoriginmaster 2023年08月17日更新:#要提交到多个git仓库,可以先添加:gitremoteaddorigin_aliyunhttp.......#提交......
  • C++ 中的 map, unordered_map, cc_hash_table, gp_hash_table 简记
    做题时,常常会用到查重操作,可以使用STL中的map与unordered_map,也可以使用“平板电视”中的cc_hash_table和gp_hash_table实现。\(\texttt{map}\)map的内部实现是红黑树,插入、查找元素的时间复杂度都是\(O(\logn)\)。map<int,bool>m;intn;cin>>n;for(inti=1;......