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可靠性机制的更多相关文章

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

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

  2. 分布式-信息方式-JMS Topic示例

                                                      Topic消息 非持久的 Topic消息示例对于非持久的 Topic消息的发送       基本跟前 ...

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

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

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

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

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

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

  6. 分布式-信息方式-ActiveMQ的集群

    ActiveMQ的集群Queue consumer clusters              ActiveMQ支持 Consumer对消息高可靠性的负载平衡消费,如果一个 Consumer死掉,该消 ...

  7. 分布式-信息方式-ActiveMQ的Message dispatch高级特性之(指针) Message cursors

    Message dispatch高级特性之 Message cursors概述            ActiveMQ发送持久消息的典型处现方式是:当消息的消费者准备就绪时,消息发送系统把存储的 消息 ...

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

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

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

    ActiveMQ的Destination高级特性 Destination高级特性----->Composite Destinations 组合队列Composite Destinations : ...

随机推荐

  1. redis 学习(16)-- redis 持久化

    redis 持久化 什么是持久化 redis 将所有数据保持在内存中,对数据的更新将异步地保存在磁盘中 持久化的方式 1. 快照 快照是某时某刻对数据的完整备份. 在: MySQL Dump Redi ...

  2. 二叉树的C++实现

    这是去年的内容,之前放在github的一个被遗忘的reporsity里面,今天看到了就拿出来 #include<iostream> #include<string> using ...

  3. Spring的基本应用(1):依赖以及控制反转

    在说到这里的时候,首先要说下程序的耦合和解耦,以便对上节做一个解释. 一.程序的耦合和解耦 1.程序的耦合性(Copling) (1)程序的耦合性,也叫做耦合度,是对模块之间关联程度的度量,耦合性的强 ...

  4. JS中的事件传播流程

    JS中的事件传播流程 1,Javascript与HTML之间的交互是通过事件实现的. 事件,就是文档或浏览器窗口中发生的一些特定的交互瞬间. 可以使用侦听器来预定事件,以便事件发生时执行相应代码. 2 ...

  5. Echarts常见问题汇总

    关于echarts使用的常见问题总结  来源:李文杨 关于echarts使用的问题总结1.legend图例不显示的问题:在legend中的data为一个数组项,数组项通常为一个字符串,每一项需要对应一 ...

  6. PyTorch安装问题解决

    现在caffe2被合并到了PyTorch中 git clone https://github.com/pytorch/pytorch pip install -r requirements.txtsu ...

  7. 12、rpm

    1.什么是rpm 由红帽开发用于软件包的安装 升级 卸载 查询 2.rpm包是什么样? 组成部分是什么样的? zip-3.0-11.el7.x86_64.rpm #el7 zip-3.0-1. el6 ...

  8. QString与QByteArray互相转换的方法

    本文转载自http://blog.csdn.net/daa20/article/details/51674753 // QString转QByteArray方法 //Qt5.3.2 QString s ...

  9. emwin之窗口ID的唯一性

    @2019-04-30 [小记] emwin窗口ID是唯一的 emwin多次创建同一窗口,则窗口句柄不同,多次删除窗口采取LIFO机制,即最新创建的窗口被首先删除 获取多次创建同一窗口的ID,准确位置 ...

  10. plsql执行sql

    第一步找执行的命令:: plsql ::::::::::File----->>>>Change Windows to ------->>>Command Wi ...