基于消息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
  • 1357

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

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

EJB与JavaBean的区别

什么是EJB: EJB是sun的服务器端组件模型,最大的用处是部署分布式应用程序当然,还有许多方式可以实现分布式应用,类似微软的.net技术。凭借java跨平台的优势,用EJB技术部署的分布式系统可...
  • cs_fei
  • cs_fei
  • 2013年08月07日 23:25
  • 3405

关于EJB异步调用遇到的问题解决

近日看到ejb异步调用相关文章,突然有兴趣试下,做个示例程序都是磕磕绊绊的,所幸最后都解决了,在这里记录下遇到的问题和解决版本,希望对大家有所帮助。 异步ejb? Asynchronous Ses...
  • yuanxiaojiao0012
  • yuanxiaojiao0012
  • 2017年01月09日 15:59
  • 360

POJO JAVABEAN EJB的区别和联系

POJO 和JavaBean是我们常见的两个关键字,一般容易混淆,POJO全称是Plain Ordinary Java Object / Pure Old Java Object,中文可以翻译成:普通...
  • caomiao2006
  • caomiao2006
  • 2014年02月24日 15:19
  • 4079

有状态EJB和无状态EJB的区别

前边的文章中,简单的介绍了ejb的三种bean,我们这片文章通过实例来看一下有状态的会话bean和无状态的会话bean的区别。          我们建立一个ejb项目,分别创建两个接口, 两个实现类...
  • zhanghongjie0302
  • zhanghongjie0302
  • 2015年12月16日 22:04
  • 2549

EJB的Remote访问方式和Local访问方式

在EJB编程中可以将EJB发布成远程的访问方式和本地的访问方式,那么什么是本地访问方式,什么又是远程访问方式?准确的来讲,区分本地还是远程关键要看EJB和客户端是否在同一个JVM中。如果我们的ejb和...
  • a1314517love
  • a1314517love
  • 2014年02月22日 08:56
  • 7092

EJB初级篇--EJB组件之实体Bean

上文我们对会话Bean的生命周期和两个子类型(有状态会话Bean和无状态会话Bean)进行了详细解说,本篇博文中我们继续说说EJB组件中的实体Bean。      其实实体Bean就是一个加了注释符(...
  • sunliduan
  • sunliduan
  • 2014年11月29日 15:18
  • 2903

会话EJB系列(六)依赖注入

总结:本文主要讲述了“依赖注入”的由来,同时从两方面进行讲解:资源依赖、EJB依赖 1.早先的‘依赖’可以理解为‘调用关系’,A调用B,则在A中new B。 2.后来,出现了“工厂模式”,使得创建...
  • lantingxv_jing
  • lantingxv_jing
  • 2015年01月25日 14:53
  • 1373

EJB规范的三种Bean

EJB规范中定义了三种Bean,他们分别是会话Bean(Session Bean),实体Bean(Entity Bean),消息驱动Bean(MessageDrive Bean)。这三种Bean各自有...
  • u011225629
  • u011225629
  • 2015年11月16日 18:57
  • 961
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基于消息Bean的EJB异步通信
举报原因:
原因补充:

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