基于消息Bean的EJB异步通信

原创 2004年08月01日 16:28:00

基于消息Bean的EJB异步通信
Bromon原创 请尊重版权

  异步通信是一个提升程序执行效率的很重要的手段,而性能问题又是EJB诞生以来一直都很受关注的话题。EJB执行效率不高的原因是客户端需要查询和调用远程接口,而本身在处理数据是很快的,毕竟EJB有比较完善的缓冲机制,几十万的app server也不是白吃内存的。客户端程序如果能够采用异步通信,只负责以消息的形式发送请求和需要处理的数据,不用等待系统查询、调用远程接口,可以节省大量时间,这也是EJB 2.0中引入消息驱动Bean的一个重要原因。J2EE的消息机制允许你以消息的形式传递对象,我们可以利用它实现很多应用。

  在最近正在写的一个考试系统中,系统把学生对每一个题目的回答都实时记录到数据库,这样做会有比较频繁的数据库操作,对性能有比较大的影响,但是可以让学生的每一次答题都得到永久性保存,避免因为意外死机或异常退出造成学生提交的答案丢失。毫无疑问,数据的安全可靠是第一位的,但是上百个学生并发操作,这个负载也是很巨大的。为了在稳定和性能上谋求平衡,我们考虑这样一种模型:

  ◆在服务器端建立一个永久性的队列,该队列可以保证数据安全,即使服务器意外重启,里面的对象也不丢失。并且有一种机制保证队列中的对象只会被处理一次。

  ◆客户端把答案数据封装成javabean,然后提交到这个队列中,提交之后不必等待数据处理完成,直接进行以后的操作,产生新的数据后继续往队列里存放,不必去关心数据什么时候会被处理。

  ◆服务器以FIFO的顺序处理队列中的数据包。

结构大致如下图:

?

  很明显,这里只提供一种单向通信,但是并非被迫,完全可以在建立另外一个队列,存放返回的消息,对应的消息通过消息ID进行关联。以消息bean为核心的java消息服务(JMS)实际上就是这样一个框架。

  首先设计一个操作答案数据表的类:

?

  它包含增加答案的方法和修改已有答案的方法,在实际的项目中,它由一个映射数据表的CMP Entity Bean和一个封装程序逻辑的SessionBean构成,是一个典型的session facade模式。实际的系统大致是这样:

  在一个系统中同时使用CMP和Hibernate来做映射,是一个非常怪异的设计,这样做只是为了使系统更有研究和讨论的价值,实际应用中恐怕我自己也要仔细考虑是否采用BMP代替Hibernate。

  编写消息bean之前,首先定义消息中要传递的是什么对象:

?

下面是消息Bean的代码:

/*
?* 消息bean,处理针对Answer的操作
?* Created on 2004-7-27
?*/
package org.bromon.examer.message;

import javax.ejb.MessageDrivenBean;
import javax.jms.*;
import org.bromon.examer.base.*;
import org.bromon.examer.session.*;

public class AnswerMessageBean implements MessageDrivenBean, MessageListener
{
?private javax.ejb.MessageDrivenContext messageContext = null;
?//定义上下文
?public void setMessageDrivenContext(
??javax.ejb.MessageDrivenContext messageContext)
??throws javax.ejb.EJBException
?{
??this.messageContext = messageContext;
?}

?public void ejbRemove()
?{
??messageContext = null;
?}

?//收到消息后将执行这个方法
?public void onMessage(javax.jms.Message message)
?{
??try
??{
???if(message instanceof ObjectMessage)
???{
????AnswerOperate ap=(AnswerOperate)((ObjectMessage)message).getObject();
????//调用EJB对AnswerOperate对象进行处理
???}
????System.out.printn("消息处理完毕");
??}catch(Exception e)
??{
???System.out.println(e);
??}
?}

}

  消息如何保障安全呢?有两个手段,一是使用消息验证,客户必须提供匹配的帐号密码才能访问消息中的数据。二是对消息中的对象加密,客户必须持有对应的密钥才能获得对象。

EJB 实体bean,会话bean,和消息驱动bean

http://javapub.iteye.com/blog/751459 EJB 3.0规范使开发EJB比过去更容易,可能诱惑你考虑开发第一个EJB。如果真是这种情况,那么祝贺你,你已经...
  • xianymo
  • xianymo
  • 2015-11-26 11:51:00
  • 1494

EJB学习笔记——JMS和消息驱动Bean

JMS和消息驱动Bean1.java消息服务(JMS)编程:应用程序A发送一条消息到消息服务器的某个目的地,然后消息服务器把消息转发给应用程序B,由于JMS允许消息发送方和接收方不同时在线,没有代码关...
  • chjttony
  • chjttony
  • 2010-12-13 11:15:00
  • 6856

EJB_开发消息驱动bean

开发消息驱动bean Java消息服务(Java MessageService)          Java 消息服务(Java Message Service,简称 JMS)是用于访问企业消息系...
  • Jerome_s
  • Jerome_s
  • 2014-07-06 21:38:44
  • 1186

EJB——消息和消息驱动bean(一)

与会话bean直接处理来自于客户端的请求一样,MDB直接处理消息。消息有很多用处,包括系统集成、异步处理和分布式系统。Java EE通过再消息发送者和接收者之间添加可靠的中间者使消息健壮。在Java ...
  • u013031185
  • u013031185
  • 2016-07-17 11:33:40
  • 517

【EJB学习笔记】——JMS和消息驱动Bean

认识消息驱动Bean之前,先了解一下JMS。 JMS  JMS(Java Message Service):java消息服务,客户端与服务端之间可以通过JSM服务进行消息的异步传输(消息的发送和消息的...
  • huyuyang6688
  • huyuyang6688
  • 2016-03-28 15:50:58
  • 777

从头到尾讲解EJB MDB(消息驱动bean)一 ——基本概念

一、概述 消息驱动 bean是一个异步消息消费者。当消息到达消息驱动bean服务的目的地或终端时,容器调用消息驱动bean。消息驱动bean实例是消息驱动 bean类的实例。消息驱动 bean 是为...
  • sundenskyqq
  • sundenskyqq
  • 2012-05-09 16:05:23
  • 1622

JavaEE5学习笔记06-EJB之消息驱动Bean总结

  • 2011年05月24日 15:43
  • 313KB
  • 下载

ejb状态bean和消息bean的源代码

  • 2008年05月01日 14:17
  • 4KB
  • 下载

带你走进EJB--JMS编程模型

在上篇文章中我们已经对JMS的基本模型有了基本的了解.下面内容主要是通过一张图来了解JMS的编程模型,并用一个实例来进行辅助说明. 下面这张图是JMS的编程模型,       ...
  • jnqqls
  • jnqqls
  • 2013-06-30 11:57:26
  • 2970

EJB是基于哪些技术实现的?并说出SessionBean和EntityBean的区别?

 EJB并不是一个产品。它是Java服务器端服务框架的规范,软件厂商根据它来实现EJB服务器。应用程序开发者可以专注于支持应用所需的商业逻辑,而不用担心周围框架的实现问题。 EJB规范详细地解释了一些...
  • zdwzzu2006
  • zdwzzu2006
  • 2010-10-16 18:13:00
  • 5646
收藏助手
不良信息举报
您举报文章:基于消息Bean的EJB异步通信
举报原因:
原因补充:

(最多只允许输入30个字)