(j2ee)消息驱动bean

消息驱动bean的主要用于接受和处理异步消息,这些信息可能来自一个外部的系统或者同一个应用中的其它组件,之所以称它们为异步,那时因为这些消息可以在任何时候到达,而不同于一般的远程方法调用的结果,是立马直接得到的。同UI的事件处理工作方式类似,消息驱动bean用于监听发送给它的异步消息。值得注意的是,与远程调用方法不同,异步消息的发送者不会停下来去等待对方的响应。

消息驱动bean是J2EE中的一个标准服务(工具),全称是Java Message Service API,简称为JMS。Java Message Service API是一个Java API,位于javax.jms包中,它为所有需要消息系统服务的应用提供了一个接口。消息系统能够异步的发送和接受消息,这些消息可以是文本、对象或者其它的一些类型。这与远程过程调用(RPC)模型是相反的,在远程过程调用中,组件之间的交互都是同步发生的。任何一个符合JMS API规范的消息系统的实现都可以称做是一个JMS提供者(JMS Provider)。在J2EE SDK中自带有这个的一个JMS Provider,书中的例子也是使用的这个JMS Provider,各个供应商也有自己的商业实现用于在企业级应用中使用消费服务。书中给出的JMS例子的上下文可以用下图来表示:

在上图中,TimeIt是一个会话bean,它的主要作用就是向MessageWriter这个消息驱动bean发送异步消息,TimeIt和MessageWriter这两个企业bean可以称之为JMS Clients,因为它们都是底层消息系统的客户端。消息系统通过提供一个目的地(destination)存放消息直至这些消息被发送至接收方(recipient)来实现异步通信。上图中间的LogWriterQueue就是一个这样的目的地,它保存了所有来自TimeIt会话bean的消息,这些消息都将发往MessageWriter消息驱动bean。在JMS中有两种类型的目的地(destination):

● 队列(Queue),用于保存从一个JMS客户端发往另一个JMS客户端的消息,这种消息模型被称为点对点(point-to-point);

● 主题(Topic),用于保存从许多潜在的JMS客户端发往多个潜在的JMS客户端的消息,这种消息模型被称为发布/订阅(publish/subscribe)模式;

书中的例子所使用是的Queue类型的目的地。在上图中还有两个“角色”:JMS消息制造者和JMS消息消费者,它们是JMS提供者里面代表JMS客户端去发送和接收消息的类。当我们使用消息驱动bean时,不必自己去创建一个JMS消息消费者,因为EJB容器会替我们做这些事情,但是JMS消息制造者就需要我们自己去创建了,我们需要创建一个JMS消息制造者向目的地(可能是Queue也可能是Topic,书中例子是Queue,即上图中的LogWriterQueue)发送消息。为了实现这个功能,我们需要两个管理对象(administered object),它们通常是由JMS提供者所带的管理工具所管理的,这两个管理对象分别是:

●     连接工厂(connection factory),用于创建一个到JMS提供者的连接

●     目的地(destination),可以是javax.jsm.Queue和javax.jsm.Topic类型

一个典型的发送消息的过程如下所示:

//第一步,得到连接工厂,书中例子因为使用的Queue类型目的地,所示这里使用的

QueueConnectionFactory,其中XXXXX是部署时所设置的jndi名

InitialContext jndiContext = new InitialContext();

QueueConnectionFactory queueConnectionFactory =

(QueueConnectionFactory) jndiContext.lookup(“XXXX”)

//第二步,得到目的地,书中例子使用的Queue,XXXXX也是部署时设置的JNDI名

Queue queue = (Queue) jndiContext.lookup("XXXXX");

//第三步,从连接工厂中获得一个连接

queueConnection =queueConnectionFactory.createQueueConnection();

//第四步,创建一个会话

QueueSession queueSession =

queueConnection.createQueueSession(false,

Session.AUTO_ACKNOWLEDGE);

//第五步,为当前会话创建一个发往Queue的发送者

QueueSender queueSender = queueSession.createSender(queue);

//第六步,创建一个消息

TextMessage message = queueSession.createTextMessage();

SimpleDateFormat sdf =new SimpleDateFormat("yyyy.MM.dd ‘at‘ HH:mm:ss.SSS");

message.setText("log entry, the time is: " + sdf.format(new Date()));

//第七步,发送消息

queueSender.send(message);

//第八步,关闭连接

queueConnection.close();

在消息驱动bean中处理收到异步消息后所执行的动作,一个消息驱动bean必须继承两个接口,它们是:

●     MessageDirvenBean:包含了消息驱动bean的生命周期方法

●     MessageListener:包含onMessage()方法,当有一条消息到达消息驱动bean时这个方法会被调用。

时间: 2024-08-05 09:33:03

(j2ee)消息驱动bean的相关文章

消息驱动Bean

消息驱动Bean.消息驱动Bean允许J2EE应用程序异步的接收Java消息服务(JMS)的消息.消息驱动Bean包含处理接受到的消息的事务逻辑,主要作用是处理消息.它与其他Bean(实体Bean和会话Bean)的区别主要在于以下几点: a) 消息驱动Bean没有任何接口,客户程序不是通过接口来访问消息驱动Bean的,它处理的消息可以来自任何消息客户程序. b) 消息驱动Bean类似于无状态会话Bean,是没有状态的,它的实例不保持特定客户程序的会话状态. c) 消息驱动Bean不需要返回任何数

EJB_开发消息驱动bean

开发消息驱动bean Java消息服务(Java MessageService) Java 消息服务(Java Message Service,简称 JMS)是用于访问企业消息系统的开发商中立的API.企业消息系统可以协助应用软件通过网络进行消息交互. JMS的编程过程很简单,概括为:应用程序A发送一条消息到消息服务器的某个目地(Destination),然后消息服务器把消息转发给应用程序B.因为应用程序A和应用程序B没有直接的代码关连,所以两者实现了解偶. JMS中的消息 消息传递系统的中心就

消息驱动bean(MDB)实例

到目前为止前面介绍的有关JavaEE的东西都是同步的,也就是说调用者调用某个方法,那么这个方法必须立即执行并返回执行结果.用官方一些的语言来说就是"客户端通过业务接口调用一个方法,在将控制权返回给客户端之前,服务器完成该方法调用".对于我们接触到的大多数操作而言这是最自然也是最容易实现的方法.然而,有些情况下客户端并不需要等待服务器响应,而只需要告诉服务器应该做什么就可以了,在完成"告知"任务之后客户端能够继续工作,而服务器则默默的在一旁处理客户端的请求(通常会是很

Intellij IDEA 创建消息驱动Bean - 接收JMS消息

除了同步方式的调用之外,有时还需要异步调用,用来处理不需要即时处理的信息,例如短信.邮件等,这需要使用EJB中的独特组件——消息驱动Bean(Message-Driven Bean,MDB),它提供了Java消息服务JMS(Java Messaging Service)的处理能力,由消息驱动Bean来处理JMS消息.JMS的消息由客户端程序产生,并被发布到服务器的消息队列,消息驱动Bean随之检索消息并执行其内容.这种事件或者数据的通信就称为异步形式,客户端或者服务端Bean都无须依赖对方的直接

EJB3.0 EJB开发消息驱动bean

(7)EJB3.0 EJB开发消息驱动bean JMS 一: Java消息服务(Java Message Service) 二:jms中的消息 消息传递系统的中心就是消息.一条 Message 由三个部分组成:             头(header),属性(property)和主体(body). 消息有下面几种类型,他们都是派生自 Message 接口.           StreamMessage:一种主体中包含 Java 基元值流的消息.其填充和读取均按顺序进行.          

EJB_消息驱动发展bean

消息驱动发展bean Java信息服务(Java MessageService) Java 信息服务(Java Message Service,简称 JMS)是用于訪问企业消息系统的开发商中立的API. 企业消息系统能够协助应用软件通过网络进行消息交互. JMS的编程过程非常easy,概括为:应用程序A发送一条消息到消息server的某个目地(Destination),然后消息server把消息转发给应用程序B. 由于应用程序A和应用程序B没有直接的代码关连,所以两者实现了解偶. JMS中的消息

消息驱动EJB(一)JMS与EJB

本文 主要从两方面进行讲述: 1.为什么使用MDB 2.使用MDB的设计原则 先来看一下消息之间是如何通信的? 应用的一个组件将JMS消息发送指定消息目的,应用的另一个组件从消息目的读取消息并解析出消息的内容.这样就实现了两个组件之间的通信. 1.发送消息的一方,称为消息生产者 2.接收消息的一方,称为消息消费者 消息生产者和消息消费者无须直接耦合,甚至不需要知道对方的存在,这就是JMS规范所实现的效果. (一)JMS和EJB 1.消息生产者 要实现的功能比较单一,只要获取与消息目的的JMS会话

SpringCloud学习之Stream消息驱动【默认通道】(十)

在实际开发过程中,服务与服务之间通信经常会使用到消息中间件,而以往使用了中间件比如RabbitMQ,那么该中间件和系统的耦合性就会非常高,如果我们要替换为Kafka那么变动会比较大,这时我们可以使用SpringCloudStream来整合我们的消息中间件,来降低系统和中间件的耦合性. 一.消息中间的几大应用场景 1.异步处理 比如用户在电商网站下单,下单完成后会给用户推送短信或邮件,发短信和邮件的过程就可以异步完成.因为下单付款是核心业务,发邮件和短信并不属于核心功能,并且可能耗时较长,所以针对

初解,Scala语言中基于Actor的并发编程的机制,并展示了在Spark中基于Scala语言的Actor而产生的消息驱动框架Akka的使用,

Scala深入浅出实战中级--进阶经典(第66讲:Scala并发编程实战初体验及其在Spark源码中应用解析)内容介绍和视频链接 2015-07-24 DT大数据梦工厂 从明天起,做一个勤奋的人 看视频.下视频,分享视频 DT大数据梦工厂-Scala深入浅出实战中级--进阶经典:第66讲:Scala并发编程实战初体验及其在Spark源码中的应用解析 本期视频通过代码实战详解了Java语言基于加锁的并发编程模型的弊端以及Scala语言中基于Actor的并发编程的机制,并展示了在Spark中基于Sc