• 每章一篇博客带你拿下吉林大学JAVAEE期末(八)


    JMS与消息驱动Bean

    1.MDB简单介绍:

    • Message-driven Bean作为远程方法调用的一种替代方法,在客户端和服务器的直接方法调用之间放置了一个中间层,接收一个或多个客户端的消息,并将消息转发给一个或多个消息的使用者。它基于JMS消息,只能接收客户端发送的JMS消息然后处理。
    • MDB实际上是一个异步的无状态Session Bean,客户端调用MDB后无需等待,立刻返回,MDB将异步处理客户请求。这适合于需要异步处理请求的场合,比如订单处理,这样就能避免客户端长时间的等待一个方法调用直到返回结果。

    2.JMS概述

    • JMS(Java Message Service,Java消息服务)是由Sun公司开发的一组接口和相关规范,这些接口和规范定义了JMS客户端访问消息系统的方法。
    • JMS为Java 程序提供了一种创建发送接收读取消息的通用方法。JMS可以为企业软件模块间提供方便、可靠的异步通信机制。

    1)JMS消息结构

    JMS 消息由以下几部分组成:消息头属性消息体

    消息头:
    • JMSDestination:消息的目的地,Topic或者是Queue。
    • JMSDeliveryMode:消息的发送模式(persistent或nonpersistent)
    • JMSExpiration:表示一个消息的有效期。默认值是0,表示消息永不过期。
    属性:

    消息类型(TextMessage,MapMessage,BytesMessage,StreamMessage,ObjectMessage)

    消息体:

    字节流、输入输出流、可序列化对象等。

    2)JMS消息传递模型

    JMS消息系统支持两种消息传递模型:点对点(PTP)发布/订阅(Pub/Sub)

    • 点对点就是一对一,接收者在成功接收消息之后须向队列应答成功。
    • 发布订阅就是广播,但是你想接收消息就得订阅,订阅分为持久化订阅和非持久化订阅。持久化订阅消息消费者无需处于激活状态,而非持久化订阅必须。

    3)JMS API模型

    在这里插入图片描述

    • 连接工厂

    为客户端创建一个连接的管理对象,由服务器管理员创建,并绑定到JNDI树上。客户端使用JNDI检索ConnectionFactory,然后利用它建立JMS连接

    • JMS连接

    表示一个客户端到消息服务器间的连接通道,所有发送或接受的消息都要经过该通道。

    • JMS会话

    JMS会话标识客户端和消息队列服务器间的一次会话过程

    • JMS消息生产者

    JMS消息生产者通过Session向消息队列发送消息,负责将消息对象转变成消息队列能够处理的格式以及消息对象序列化

    • JMS消息消费者

    JMS消息消费者通过Session从消息队列中获取消息,封装了对消息格式进行恢复的算法,如果消息的类型是一个复杂对象,则在消息获取的同时还需要对对象进行反序列化操作。

    4)JMS消息发送

    编程的步骤(八步):

    • 获得一个JBOSS上下文的引用
    • 通过JNDI查找获得连接工厂
    • 使用连接工厂创建一个连接
    • 使用连接创建一个会话
    • 通过JNDI查找Queue或者Topic
    • 使用会话和目的创建消息生产者
    • 使用会话创建一个需要发送的消息类型的实例
    • 发送消息
      由于JBoss对安全性的限制,为了使用户能够发送消息,必须为用户添加send权限

    5)JMS消息接收

    接收消息可以分为同步异步接收。

    • 同步接收使用MessageConsumer.receive() 方法实现,如果消息可用,JMS服务器将这个消息返回,否则接收者一直等待消息的到来。
    • 异步接收通过向MessageConsumer注册消息监听器对象javax.jms.MessageListener,实现队列中消息的异步接收,消息的处理在onMessage() 方法中实现。
      编程的步骤(七步):
    • 获得一个JBoss上下文的引用;
    • 通过JNDI查找获得连接工厂;
    • 使用连接工厂创建一个连接;
    • 使用连接创建一个会话;
    • 通过JNDI查找Queue或者Topic
    • 使用会话和目的创建消息的消费者;
    • 接收信息

    3.MDB概述

    • 消息驱动Bean是一种通过消息方式为外界提供服务的组件,JMS是MDB支持的一种最基本消息类型,也是Java EE服务器必须提供的消息机制。
    • MDB组件只是提供一种基于消息服务请求模式,和具体业务逻辑无关。MDB从指定消息队列中接收消息,而对消息内容并不知情,当消息到达时,EJB服务器将指定消息发送到特定的MDB组件,消息内容要在MDB的onMessage() 方法中处理。具体的逻辑通常委托给其他EJB组件实现,而MDB只是提供一种基于消息的逻辑调用机制。

    1)消息驱动Bean组成

    • 消息驱动Bean主要用来处理异步消息,客户端向容器发送一个JMS消息之后,不必等待消息驱动Bean处理完毕便可直接返回。消息被发送给由容器管理的JMS消息队列,容器在适当的时候通知消息驱动Bean的方法onMessage() 加以处理。
    • 一个MDB需要使用@MessageDriven标注,并实现javax.jms.MessageListener接口。
    • 当EJB服务器加载MDB组件时,首先检查组件所绑定的消息队列是否存在,如果存在,就将MDB组件和该队列相关联;如果不存在,就首先创建该队列然后再将其与MDB关联。
    • 基于Topic队列的MDB组件开发方法与基于Queue型队列的组件开发方法类似,但是基于Topic型队列的MDB组件需要配置subscriptionDurability属性。该属性值可以是DurableNonDurable,其中NonDurable是默认值,即如果某个时刻EJB服务器失去了和JMS消息服务器的连接,则MDB组件会丢掉该时刻所有的消息;反之,对于Durable型MDB组件,JMS服务会将消息进行保存然后再发给消息接收者,因此消息不会丢失
    • 基于Durable型的MDB组件必须设置clientID,它是设定MDB在消费Topic队列时使用的唯一身份标识,必须在队列服务器范围内唯一。而基于NonDurable类型的MDB可以不配置该属性,且开发方法与前面监听点对点的MDB开发方法相同。
  • 相关阅读:
    跟随光标圆形文本旋转
    知识点6--CMS项目管理员后台
    有哪些你直呼好用的科研效率神器?
    MySQL【多表查询】
    002 IOC和DI使用
    tp3.2和tp5.0的区别
    InnoDB 是如何解决幻读的
    elementPlus el-dialog 自适应
    Flutter 如何启动新的页面时给页面传递参数
    XSS攻击
  • 原文地址:https://blog.csdn.net/stn54999/article/details/126427886