分布式-信息方式-JMS可靠性机制
JMS的可靠性机制
1.消息接收确认
JMS消息只有在被确认之后,才认为已经被成功地消费了。
消息的成功消费通常包含三个阶段:客户接收消息、客户处理消息和消息被确。
在事务性会话中,当一个事务被提交的时候,确认自动发生。在非事务性会话
中,消息何时被确认取决于创建会话时的应答模式( acknowledgement mode)。该参
数有以下三个可选值:
Session.AUT0 ACKNOWLEDGE:当客户成功的从 receive方法返回的时候,或者从
Messagelistener. onMessage方法成功返回的时候,会话自动确认客户收到的消息。
Session. CLIENT ACKINOWLEDGE:客户通过调用消息的 acknowledge方法确认消
息。需要注意的是,在这种模式中,确诙是在会话层上进行,确认一个被消费的消息
将自动确认所有已被会话消费的消息。例如,如果一个消息消费者消费了10个消
息,然后确认第5个消息,那么所有10个消息都被确认。
session.AUTO_ACKNOWLEDGE
session的提交和不提交现象
package test.mq.helloword; import java.util.Enumeration; 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.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 JMSException {
ConnectionFactory ConnectionFactory=new ActiveMQConnectionFactory(
"tcp://localhost:61616"
);
Connection connection=ConnectionFactory.createConnection();
connection.start();
Enumeration names=connection.getMetaData().getJMSXPropertyNames();
while(names.hasMoreElements()){
String name=(String) names.nextElement();
System.out.println("jmsx name==="+name);
}
Session session=connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
Destination destination=session.createQueue("my_queue");
MessageConsumer Consumer=session.createConsumer(destination);
int i=;
while(i<){ MapMessage msg=(MapMessage) Consumer.receive();
//当session不提交时, 信息会不确认签收,信息就一直可以接受到。
session.commit();
System.out.println("接收信息:"+msg.getString("message"+i)+",property=="+msg.getStringProperty("extra"+i));
i++;
} session.close();
connection.close(); }
}
Session.CLIENT_ACKNOWLEDGE的使用
信息发送者
package test.mq.helloword; import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.MessageProducer;
import javax.jms.Session; import org.apache.activemq.ActiveMQConnectionFactory; public class Sender {
public static void main(String[] args) throws JMSException, InterruptedException {
ConnectionFactory ConnectionFactory=new ActiveMQConnectionFactory(
"tcp://localhost:61616"
);
Connection connection=ConnectionFactory.createConnection();
connection.start(); Session session=connection.createSession(Boolean.TRUE, Session.CLIENT_ACKNOWLEDGE);
Destination destination=session.createQueue("my_queue");
MessageProducer Producer=session.createProducer(destination); for(int i=;i<;i++){
MapMessage Message=session.createMapMessage();
Message.setStringProperty("extra"+i, "okok");
Message.setString("message"+i, "my map---->"+i);
Producer.send(Message);
}
session.commit();
session.close();
connection.close();
}
}
信息消费者
package test.mq.helloword; import java.util.Enumeration; 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.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 JMSException {
ConnectionFactory ConnectionFactory=new ActiveMQConnectionFactory(
"tcp://localhost:61616"
);
Connection connection=ConnectionFactory.createConnection();
connection.start();
Enumeration names=connection.getMetaData().getJMSXPropertyNames();
while(names.hasMoreElements()){
String name=(String) names.nextElement();
System.out.println("jmsx name==="+name);
}
Session session=connection.createSession(Boolean.FALSE, Session.CLIENT_ACKNOWLEDGE);
Destination destination=session.createQueue("my_queue");
MessageConsumer Consumer=session.createConsumer(destination);
int i=;
while(i<){ MapMessage msg=(MapMessage) Consumer.receive();
if(i==){
//当 msg.acknowledge()不提交时, 信息会不确认签收,信息就一直可以接受到。
msg.acknowledge();
}
System.out.println("接收信息:"+msg.getString("message"+i)+",property=="+msg.getStringProperty("extra"+i));
i++;
} session.close();
connection.close(); }
}
消息持久性,JM支持以下两种消息提交模式:
PERSISTENT:指小JMSp1 ovider持久保存消息,以保证消息不会因为JMS
provider的失败而丢失
NON PERS ISTENT:不要求JMSp1 ovider持久保存消息
消息优先级
可以使用消息优先级来指旨小丶 JMS provide首先提交紧总的消息。优先级分
10个级别,从0(最低)到9(最高)。如果不指定优先级,默认级别是1。需要
注意的是,JMSp1 ovide1并不一定保证按照优先级的顺序提交消息
消息过期
可以设置消息在一定时间后过期,默认是水不过期
消息的临时目的地
可以通过会话上的 createTemporaryQueue方法和 create Temporary Topic
方法来创建临时目|的地。它们的存在时简!限于创建它们的连接所保持的时间
只有创建该临时目的地的连接上的消息消赍者才能够从临时目的地中提取消息
JMS的PTP模型
JMS PTF( Point-to- Point)模型定义了客户端如何向队列发送消息,从队列接收
消息,以及浏览队列中的消息。
PTP模型是基于队列的,生产者发消息到队列,消费者从队列接收消息,队
列的存在使得消息的异步传输成为可能。和邮件系统中的邮箱一样,队列可以包
含各种消息,JMP1 ovider提供工具管理队列的创建、删除。
PTP的一些特点
1:如果在 Session关闭时∫,有一些消息凵经被收到,但还没有被签收
( acknoledged),那么,当消费者下次连接到相同的队列时,这些消息还会被再
次接收
2:如果用户在 receive方法中设定了消息选择条件,那么不符合条件的消息会留在
队列中,不会被接收到
3:队列可以长久地保存消息直到消费者收到消息。消费者不需要因为担心消息会丢
失而时刻和队列保持激活的连接状态,允分体现了异步传输模式的优势
JMS的Pub/Sub模型
JMS Pub/Sub模型定义了如何向一个内容节点发布和订阅消息,这些节点被称作 topic
主题可以被认为是消息的传输中介,发布者(pub1 isher)发布消息到主题,订阅者
( subscribe)从主题订阅消息。主题使得消息订阅者和消息发布者保持互相独立,不需要
接触即可保证消息的传送。
Pub/Sub的一些特点
1:消息订阅分为非持久订阅和持久订阅
非持久订阅只有当客户端处于激活状态,也就是和 JMS Provider保持连接状态才能
收到发送到某个主题的消息,而当客户端处于离线状态,这个时间段发到主题的消息将会
丢失,永远不会收到。
持久订阅时,客户端向JMS注册一个识别自已身份的ID,当这个客户端处于离线
时, JMS Provi der会为这个ID保存所有发送到主题的消息,当客户再次连接到]M
Provider时,会根据自己的ID得到所有当自己处于离线时发送到主题的消息
2:如果用户在 receive方法中设定了消息选择条件,那么不符合条件的消息不会被接收
3:非持久订阅状态下,不能恢复或重新派送一个未签收的消息。只有持久订阅才能恢复或重
新派送一个未签收的消息。
4:当所有的消息必须被接收,则用持久订阅。当丢失消息能够被容忍,则用非持久订阅
个JMS应用的基木步骤
JMS开发的基本步骤
1:创建一个 JMS connection factory
2:通过 connection factory米创建 JMS connection
3:启动 JMS connection
1:通过 connection创建 JMS session
5:创建 JMS destination
6:创建JMSp1 oducer,或者创建 JMS message,并设置 destinatio
7:创建 JMS consumer,或者是注册一个 JMS essage listene1
8:发送或者接受 JMS essage(s)
9:关闭所有的JMS资源( connection, session, producer, con sumel等)
分布式-信息方式-JMS可靠性机制的更多相关文章
- 分布式-信息方式- JMS基本概念
JMS基本概念 ■JMs是什么 JMS Java Messag/ Servite,Java消息服务 ...
- 分布式-信息方式-JMS Topic示例
Topic消息 非持久的 Topic消息示例对于非持久的 Topic消息的发送 基本跟前 ...
- 分布式-信息方式-JMS大纲
一.简介 JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息, ...
- 分布式-信息方式-JMS信息结构
JMS的消息结构JMS消息由以下几部分组成:消息头,属性和消息体消息头包含消息的识别信息和路由信息,消息头包含一些标准的属性如下:1: JMSDestination:由send方法设置2: JMSDe ...
- 分布式-信息方式-JMS Queue示例
代码 package test.mq.helloword; import javax.jms.Connection; import javax.jms.ConnectionFactory; impor ...
- 分布式-信息方式-ActiveMQ的集群
ActiveMQ的集群Queue consumer clusters ActiveMQ支持 Consumer对消息高可靠性的负载平衡消费,如果一个 Consumer死掉,该消 ...
- 分布式-信息方式-ActiveMQ的Message dispatch高级特性之(指针) Message cursors
Message dispatch高级特性之 Message cursors概述 ActiveMQ发送持久消息的典型处现方式是:当消息的消费者准备就绪时,消息发送系统把存储的 消息 ...
- 分布式-信息方式-ActiveMQ的Destination高级特性3
虚拟destination用来创建逻辑destination,客户端可以通过它来生产和消费消息,它会把消息映射到物理destination. ActiveMQ支持2种方式: 1:虚拟主题(Virtua ...
- 分布式-信息方式-ActiveMQ的Destination高级特性1
ActiveMQ的Destination高级特性 Destination高级特性----->Composite Destinations 组合队列Composite Destinations : ...
随机推荐
- Filebeat7 Kafka Gunicorn Flask Web应用程序日志采集
本文的内容 如何用filebeat kafka es做一个好用,好管理的日志收集工具 放弃logstash,使用elastic pipeline gunicron日志格式与filebeat/es配置 ...
- [转载]汇编语言assume伪指令的作用
原文:https://blog.csdn.net/u010234808/article/details/38366943 摘出关键部分: 编写程序,是写给编译软件的.由编译软件,编译成机器码,再去控制 ...
- 部署 12306 github 项目
郑重声明, 本文仅用作学习研究使用,请勿用作商业用途,遵守法律!!! 部署环境有些坑,踩一次就够了... 原项目地址 git clone 原项目以及 识别验证码的模型 如果遇到 无法解析的问题 ,则 ...
- GO语言语法入门
引言 Go Go语言是谷歌2009发布的编程语言,它是一种并发的.带垃圾回收的.快速编译的语言. 它结合了解释型语言的游刃有余,动态类型语言的开发效率,以及静态类型的安全性.它也打算成为现代的,支持网 ...
- centos 7 SVN安装脚本搭建主从同步灵活切换
svn 脚本下载 http://opensource.wandisco.com/subversion_installer_1.9.sh 2019-Aug-20 12:20:4810.1Kapplica ...
- Rasa学习记录 01
目录 Rasa的安装和简单的测试 什么是Rasa: 安装Rasa: 测试自带的数据 查看项目里的文件内容 举一反三(自己的第一个机器人) Rasa的安装和简单的测试 怪雨是新手,刚刚接触Rasa,以下 ...
- Rust 基础学习
所有权: 变量具有唯一所有权.如果一个类型拥有 Copy trait,一个旧的变量在将其赋值给其他变量后仍然可用.除此之外,赋值意味着转移所有权.Rust 不允许自身或其任何部分实现了 Drop tr ...
- vs2017新建一个空项目
我们会发现VS2017的控制台程序创建之后会有一些头文件这和之前的VS的版本不一样之前的都可以选择空项目来避免,下面我们就来介绍方法: 首先我们不要创建新的控制台项目,而是创建桌面向导: 然后我们就可 ...
- c++ vector数组的使用
介绍: 首先我们要明白以下几点: 1.vector数组是一个能存放任意数据类型(类,结构,普通变量类型等)的动态数组!,在数据结构中就相当于顺序储存的线性表,寻找元素非常快,但是插入元素的时间却很大( ...
- 借助Charles来测试移动端-上篇
随着现在互联网的兴起,移动端的测试需求越来越多,但是随着用户越来越多,迭代需求越来越频繁,或因为测试环境的接口不稳定,或因为多个业务系统互相关联,导致移动端测试后置,有时候提前介入了,也只能干耗时间, ...