`

java消息机制

 
阅读更多

java消息机制

1、问: 什么是 Java 消息服务?
答: Java 消息服务(Java Message Service,JMS) API 是一个用于访问企业消息传递系统的 API。是 Java 2 Platform, Enterprise(J2EE)的一部分。

2、目前流行的消息传送产品有哪些?
答:目前流行的有ActiveMQ、IBM WebSphere MQ、SonicMQ等

3、什么时候可以用到java消息机制?
答:(1)异构系统集成,整合现有资源,提高资源的利用率
       (2)异步请求处理,减轻或消除系统瓶颈,提高用户生产率和系统的整体可伸缩性
       (3)组件解偶,增加系统的灵活性

4、消息传送的两种模型
发布/订阅模型
客户端发送消息到一个名为主题(topic)的虚拟通道中,每个订阅该主题的消费者都会接收到每条消息的一个副本。
点对点模型
客户端通过队列(queue)这个虚拟通道来同步和异步发送、接收消息,发送到队列的消息只能被一个接收者所接收,即使有多个消费者时也只能有一个消费者处理消息

5、JMS包含哪些接口?
JMS API可以分为3个主要部分:公共API、点对点API和发布/订阅API。在JMS1.1中,公共API可被用于向一个队列或一个主题发送消息,或从其中接收消息。点对点API专门用于使用队列的消息传送,而发布/订阅API则专门用于使用主题的消息传送。
在JMS公共API内部,和发送和接收JMS消息有关的JMS API接口主要有7个:
l          ConnectionFactory
l          Destination
l          Connection
l          Session
l          Message
l          MessageProducer
l          MessageConsumer
在这些公共接口中,ConnectionFactory和Destination必须使用JNDI(遵照JMS规范要求)从提供者处获得。其他接口则可以通过工厂方法在不同的API接口中创建。举例来说,一旦有了一个ConnectionFactory,就可以创建一个 Connection。一旦有了一个Connection,就可以创建一个Session。而一旦有了一个Session,就可以创建一个 Message、MessageProducer和MessageConsumer。这7个主要的JMS公共API接口之间的关系如图1-5所示。
在JMS中,是Session对象保存着用于消息传送的事务性工作单元(transactional unit),而不是Connection对象。这和JDBC不同,JDBC中是Connection对象保存事务性工作单元。这就意味着在使用JMS时,一个应用程序通常只会有一个Connection对象,但是它可以有一个Session对象池。
另外,还有和异常处理、消息优先级及消息持久性有关的其他接口




6、java消息分为哪些部分?
消息头、消息属性、消息自身

7、消息过滤
消息订阅者需要对消息进行过滤,否则订阅者就会接受到主题或队列的每一条消息,浪费了不必要的资源(CPU、内存等),而使用消息过滤技术,能让订阅者只接受它需要的消息。(消息过滤对于队列消费尤其重要,因为一个队列消费者消费消息后其他消费者就不再可用,此时如果不对消息进行过滤处理,这条消息就很可能被浪费掉)。
消息选择器使用消息属性和消息头作为条件表达式的传送载体(消息体不能作为消息选择器的参考对象)。
消息选择器由标识符、常量和比较运算符组成:
例:
     创建一个消息如下:
        TextMessage textMessage = Session.createTextMessage();
         textMessage.setText(“mytestMsg”);
         textMessage.setStringProperty(“city”,”hangzhou”);
         textMessage.setStringProperty(“company”,”mycompany”);
         这条消息中设置的消息属性名“city”和“company”代表消息选择器的标识符,”hangzhou”和”mycompany”代表常量

          在消费端创建一个选择器:
          String selector = “city = 'hangzhou' AND company='mycompany'”;
          QueueReceiver qReceiver = qSession.createReceiver(testQ,selector);
          其中“=”和“AND”为比较运算符,其他常用比较运算符还有:
          算数比较运算符(=、>、<、<=、<>等)
          like运算符、BETWEEN运算符、IN运算符、IS NULL运算符等
          

8 、消息过滤

消息订阅者需要对消息进行过滤,否则订阅者就会接受到主题或队列的每一条消息,浪费了不必要的资源( CPU、内存等),而使用消息过滤技术,能让订阅者只接受它需要的消息。(消息过滤对于队列消费尤其重要,因为一个队列消费者消费消息后其他消费者就不再可用,此时如果不对消息进行过滤处理,这条消息就很可能被浪费掉)。

消息选择器使用消息属性和消息头作为条件表达式的传送载体(消息体不能作为消息选择器的参考对象)。

消息选择器由标识符、常量和比较运算符组成:

例:

     创建一个消息如下:

        TextMessage textMessage = Session.createTextMessage();

         textMessage.setText(“mytestMsg”);

          textMessage.setStringProperty(“city”,”hangzhou”);

         textMessage.setStringProperty(“company”,”alibaba”);

         这条消息中设置的消息属性名 “city” 和 “company” 代表消息选择器的标识符, ”hangzhou” 和 ”alibaba”代表常量

 

          在消费端创建一个选择器:

          String selector = “city = 'hangzhou' AND company='alibaba' ”;

          QueueReceiver qReceiver = qSession.createReceiver(testQ,selector);

          其中 “=” 和 “AND” 为比较运算符,其他常用比较运算符还有:

          算数比较运算符( = 、 > 、 < 、 <= 、 <> 等)

          like 运算符、 BETWEEN 运算符、 IN 运算符、 IS NULL 运算符等

         

 

 

9 、消息传送的可靠性

在消息的传送过程中由于网络、软硬件故障等都会导致消息的发送失败, jms 为保证消息的传送定义了 3 条法则:

( 1 )消息自主性,消息是自包含的自主性实体,当发送端发出这条消息后这条消息就不再受发送端的限制,它可以在多个进程间被多次发送。

( 2 )存储转发,当消息被标记位持久性消息时,就由 jms 提供者利用  保存并转发  机制,将消息保存在可信的介质上,防止发生故障时仍然可以正常恢复

( 3 )消息确认机制,服务器确认已经从发送端收到了消息,消费者则从确认从服务器接收了消息,对消息传送过程的监控,保证了消息的可靠传送。 消息确认的 3 种模式:

1 、 AUTO_ACKNOWLEDGE 
从消息生产者角度:发送消息后就开始阻塞,直到从消息服务器收到回复,期间如发生异常则认为消息未被传送   

从消息服务器角度:非持久消息在接受到消息后通知生产者,并将消息存入内存,持久性消息在接受道消息后先存入磁盘,然后通知生产者   

从消费者角度:接受到消息后就向服务器发送确认信息,如果服务器没有收到确认,会重新发送   

2 、 CLIENT_ACKNOWLEDGE 
消费者可在处理完业务逻辑后在代码重显示调用 message.acknowledge() 通知 jms 提供者已成功接收道消息   
3 、 DUPS_ACKNOWLEDGE 
可将一条消息向同一目的地发送两次以上  

 

 

这里介绍两个概念:

( 1 )持久化消息:消息持久化就是在发送者将消息发送出去后,消息中心首先将消息存储到本地数据文件、内存数据库或者远程数据库等,然后试图将消息发送给接收 者,发送成功则将消息从存储中删除,失败则继续尝试。消息中心启动以后首先要检查制定的存储位置,如果有未发送成功的消息,则需要把消息发送出去。通过在消息头设置来实现:如

MessageProducer producer = session.createProducer(destination);

producer.setDeliveryMode(DeliveryMode.PERSISTENT);

(2) 持久订阅者和非持久订阅者:非持久订阅者是指某个订阅者由于某种原因停止运行,那么在停止运行期间发布到该订阅者所订阅主题的消息就会无法获得,持久订阅者则刚好相反,持久订阅者会接收发送到订阅主题的所有消息,无论订阅者是否正常运行,电子邮件就是类似的一个例子。

持久化消息和持久订阅者在服务器和消费者端之间的消息传送保证机制比较类似,但在有一种情况下他们还是存在区别的,对持久订阅者来说,当消息服务器向发送者发送确认消息之后,并为当前未运行的持久订阅者将消息保存到介质之间如果发送故障,该消息就会丢失,而持久化消息则是先保存消息道介质,然后才向发送者发送确认消息,所以不存在这个问题,因此严格来说持久化消息的可靠性会更高。

10 、事务性消息

jms 事务性保证了一组发送的消息或接收的消息要么全部成功要么全部失败,概念上和我们在java 中使用的jta 相似,但jms 事务是由jms 提供者来管理的,而不是jta 。

使用方法如下:

   // 此处用true ,表示使用事务性消息

Session session =connection.createSession(true, Session.AUTO_ACKNOWLEDGE);

// 用来发送的3 个消息

MessageProducer sender = session.createProducer(“queue/testQueue”);

try{

    TextMessage message1 = session.createTextMessage(“ 要发送的消息1”);

      sender.send(message);

    TextMessage message2 = session.createTextMessage(“ 要发送的消息2”);

      sender.send(message);

    TextMessage message3 = session.createTextMessage(“ 要发送的消息3”);

      sender.send(message);

        session.commit();

    }catch(Exception e){

        try{

          session.rollback();

       }catch(JMSException e){

       }

    }

分享到:
评论

相关推荐

    Java 消息机制讲解非常详细

    Java 消息机制,讲解非常详细,另外附带讲了ActiveMQ的原理 不可多得的文档

    基于Java的对象模型消息机制实现.pdf

    3. 本文利用Java的接口、继承及多态机制,借鉴文献的回调函数思路,通过封装实现了Java消息机制。 4. 该机制使软件开发人员能够直观地使用Java语言标准语法实现面向对象模型,与采用try-catch结构实现事件驱动程序...

    Java消息服务的消息中间件的研究与设计

    ### Java消息服务的消息中间件的研究与设计 #### 一、引言 随着分布式计算环境的日益普及和技术的进步,异构系统间的通信问题逐渐成为关注焦点。消息中间件作为一种解决这一问题的有效手段,其重要性日益凸显。...

    基于Java的对象模型消息机制实现

    ### 基于Java的对象模型消息机制实现 #### 摘要 Java作为一种广泛应用的面向对象编程语言,虽然强大且灵活,但在标准中并未直接提供消息机制的支持。这导致了在面向对象建模中实现消息机制较为不便。本文介绍了一...

    Java的安全机制研究与分析

    2. **JCE**:JCE是Java中加密算法的扩展库,包含了对称加密、非对称加密、消息摘要和随机数生成等多种加密技术的支持。通过JCE,开发者可以轻松地在应用中加入高级加密功能,保护数据的安全。 3. **JSSE**:JSSE为...

    Java事件机制例子

    Java事件机制基于观察者模式,其中事件源(如按钮)会发布事件,而事件监听器则订阅这些事件并执行相应的操作。 事件、事件监听器和事件源是Java事件处理的三个核心概念。事件是用户或系统发生的某种情况,如鼠标...

    msmq.rar_java msmq_java 消息队列_java消息队列_msmq_消息队列

    本文将深入探讨Java如何与MSMQ进行交互,以及创建消息队列的详细步骤。 首先,我们需要理解消息队列的基本概念。消息队列是一种中间件,它允许应用程序之间通过发送和接收消息进行通信,而无需直接调用对方。消息...

    java事件处理机制Demo

    Java事件处理机制是Java编程中一个重要的组成部分,它主要用于实现用户界面(UI)与应用程序逻辑之间的交互。在Java中,事件处理主要涉及到事件源、事件和事件监听器。本示例"java事件处理机制Demo"将深入探讨Java的...

    java中的事件机制

    在非GUI应用中,事件机制常用于发布/订阅模型,例如发布系统状态改变或任务完成等消息。Java.util.concurrent包中的`ConcurrentLinkedQueue`、`BlockingQueue`等数据结构可以作为事件队列,线程间通过这些队列进行...

    Java消息服务 pdf

    Java消息服务(Java Message Service,JMS)是Java平台中用于企业级应用集成(Enterprise Integration Patterns,EIP)的一种标准API,它定义了应用程序如何创建、发送、接收和读取消息的标准接口。JMS允许分布式...

    java 消息服务(第二版)源码

    Java消息服务(JMS,Java Message Service)是Java平台中用于创建、发送、接收和读取消息的标准API。...通过阅读《Java消息服务(第二版)》并实践书中提供的源码,开发者将能更全面地掌握这一强大的通信机制。

    java-Push开源实时消息推送系统

    Java-Push开源实时消息推送系统是一种基于Java技术构建的、专为实现高效、稳定、实时的消息推送服务而设计的解决方案。在当今互联网应用中,实时消息推送已经成为提高用户体验和互动性的重要工具,尤其是在社交网络...

    消息总线java实现

    为了构建一个简单的Java消息总线,我们需要以下几个关键组件: 1. **消息接口**:定义消息的通用结构,包括消息头(用于标识和路由)和消息体(实际数据)。例如,可以创建一个`Message`接口,包含`getHeader()`和`...

    java消息服务

    本书深入浅出地讲解了jms1.1规范的底层技术、java类和接口、编程模型及其不同实现等java消息服务(jms)和消息传送机制关键技术。通过对支持点对点和发布/订阅“消息传送”的标准api的完全解读及具体实例,介绍了...

    java 缓存机制

    为了兼顾两者,开发者可能会在Java后端生成JSON格式的消息,以供前端JavaScript使用,同时保持CSS和JavaScript的灵活性。 综上所述,Java缓存机制涉及到声明式缓存的使用、缓存抽象的理解以及Web开发中的会话管理、...

    Java消息队列的简单实现代码

    Java消息队列的简单实现代码 Java 消息队列是一种异步处理机制,主要目的是减少请求响应时间和解耦。消息队列的应用场景非常广泛,例如在用户注册时,服务端收到用户的注册请求后,可以将其他操作放入消息队列中,...

    Java消息中间件面试题

    本文总结了Java消息中间件面试题中的知识点,涵盖了RabbitMQ和Kafka两种常见的Java消息中间件,涉及到消息不丢失机制、重复消费问题解决方案、死信交换机、延迟队列、消息堆积解决方案、高可用机制等方面。

    Java消息队列常见面试题2022

    Java消息队列(Java Message Queue, 简称JMQ)是现代软件开发中的关键组件,尤其在微服务架构中,其重要性不言而喻。面试中,掌握消息队列的基本概念、工作原理和常见问题,对于求职者来说至关重要。以下是一些面试...

Global site tag (gtag.js) - Google Analytics