`

EJB3.0实现登录注册(二)

    博客分类:
  • Java
阅读更多

9. 编写消息驱动bean

消息驱动bean的主要用于接受和处理异步消息,这些信息可能来自一个外部的系统或者同一个应用中的其它组件,之所以称它们为异步,那时因为这些消息可以在任何时候到达,而不同于一般的远程方法调用的结果,是立马直接得到的。同UI的事件处理工作方式类似,消息驱动bean用于监听发送给它的异步消息。值得注意的是,与远程调用方法不同,异步消息的发送者不会停下来去等待对方的响应。消息驱动beanJ2EE中的一个标准服务(工具),全称是Java Message Service API,简称为JMS。它为所有需要消息系统服务的应用提供了一个接口。消息系统能够异步的发送和接受消息,这些消息可以是文本、对象或者其它的一些类型。这与远程过程调用(RPC)模型是相反的,在远程过程调用中,组件之间的交互都是同步发生的。任何一个符合JMS API规范的消息系统的实现都可以称做是一个JMS提供者(JMS Provider)。在J2EE SDK中自带有这个的一个JMS Provider,各个供应商也有自己的商业实现用于在企业级应用中使用消费服务。消息系统通过提供一个目的地(destination)存放消息直至这些消息被发送至接收方(recipient)来实现异步通信。其中消息目的地主要分为两类:

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

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

其中一个MDB类必须实现MessageListener 接口。当容器检测到bean守候的队列一条消息时,就调用onMessage()方法,将消息作为参数传入。MDB在OnMessage()中决定如何处理该消息。你可以用注释来配置MDB 监听哪一条队列。当MDB 部署时,容器将会用到其中的注释信息。当一个业务执行的时间很长,而执行结果无需实时向用户反馈时,很适合使用消息驱动Bean。

本实验中采用队列的方式来实现消息驱动Bean,可通过Eclipse的创建向导来创建MDB。在Class name中填入消息驱动Bean的名称,选中下方的JMS选项同时在下方的Destination type中选择"Queue",点击下一步,在Transaction type中选择"Container",其余选项均保持默认即可。生成的MDB默认实现了MessageListener接口,只需实现其中的onMessage方法,从队列中获取消息并将消息内容显示到控制台中。

具体代码如下:

@MessageDriven(activationConfig = {

@ActivationConfigProperty(

propertyName = "destinationType",

propertyValue = "javax.jms.Queue"),

@ActivationConfigProperty(

propertyName = "destination"

propertyValue = "queue/ConsumerQueue") })

public class Consumer implements MessageListener {

 

public void onMessage(Message message) {

System.out.println("^^^^^^^^^^^^ Get a message^^^^^^^^^^^^^^");

TextMessage tm = (TextMessage) message;

 

try {

System.out.println("@Message:" +tm.getText());

catch (JMSException e) {

e.printStackTrace();

}

}

 

public static Context getInitialContext()

throws javax.naming.NamingException {

return new InitialContext();

}

 

}

 

上面通过@MessageDriven注释指明这是一个消息驱动Bean,并使用@ActivationConfigProperty注释配置消息的各种属性,其中destinationType属性指定消息的类型,消息有两种类型topicsqueues分别对应于上文描述的主题和队列。destination属性用作指定消息路径,消息驱动Bean在发布时,如果路径不存在,容器会自动创建该路径,当容器关闭时该路径会自动被删除。实验中,当一个消息到达queue/ConsumerQueue队列时,就会触发onMessage方法,消息作为一个参数传入,在onMessage方法里面得到消息体并调用println方法把消息内容打印到控制台上。以上便定义好了消息的接受者,另外还需要定义消息的发布者类,用于向队列中发送消息。代码如下:

public class Producer {

public static void sendMessage(String msg) throws Exception {

Context jndiContext = getInitialContext();

//根据上下文来查找一个连接工厂QueueConnectionFactory 

ConnectionFactory factory = (ConnectionFactory) jndiContext

.lookup("ConnectionFactory");

//查找目的地(Topic/ Queue);

Queue queue = (Queue) 

jndiContext.lookup("queue/ConsumerQueue");

//从连接工厂得到一个连接

Connection connect = factory.createConnection();

/*

 * 通过连接来建立一个会话(Session)

 * 建立不需要事务的并且能自动接收消息收条的会话,

 * 在非事务Session 中,消息传递的方式有三种:

 *  1)Session.AUTO_ACKNOWLEDGE :当客户机调用的receive

 *  方法成功返回,或当MessageListenser 成功处理了消息,

 *  session将会自动接收消息的收条。

 *  2)Session.CLIENT_ACKNOWLEDGE :客户机通过调用消息的

 *  acknowledge方法来接收消息。接收发生在session层。

 *  接收到一个被消费的消息时,将自动接收该session已

 *  经消费的所有消息。例如:如果消息的消费者消费了10

 *  条消息,然后接收15 个被传递的消息,则前面的10 个消

 *  息的收据都会在这15 个消息中被接收。

 *  3)Session.DUPS_ACKNOWLEDGE :指示session缓慢接收消息。

 */

Session session = connect

.createSession(false, Session.AUTO_ACKNOWLEDGE);

//根据会话以及目的地来建立消息制造者

MessageProducer sender = session.createProducer(queue);

TextMessage message = session.createTextMessage();

message.setJMSReplyTo(queue);

message.setText(msg);

System.out.println("Sending message #:"+msg);

sender.send(message);

connect.close();

}

public static Context getInitialContext()

throws javax.naming.NamingException {

return new InitialContext();

}

}

如上文所说如果消息路径不存在,容器会自动创建该路径,当容器关闭时该路径会自动被删除。如果容器没有自动创建该路径也可以通过手动编写配置文件进行配置,配置文件如下:

mymdb-service.xml

编写Web客户端程序

客户端采用Jsp+Servlet实现,严格按照MVC模式进行分层,jsp负责前台界面的显示,在代码编写中使用了JSTL标签库和EL表达式;Servlet负责jsp页面中提交请求的处理,其通过调用EJB项目中的SessionBean来完成具体的业务功能。

部署

分别将EJB项目和web项目部署到jboss服务器中,查找修改部署中的错误,运行程序。

<!--EndFragment-->
分享到:
评论
1 楼 niwei 2009-07-14  
我觉得放到博客更合适。

相关推荐

    ejb3.0写的登陆应用

    在这个“ejb3.0写的登陆应用”中,我们可以深入探讨EJB 3.0在实现登录应用中的关键知识点。 1. **EJB 3.0核心概念**: - **实体Bean(Entity Beans)**:用于持久化业务数据,EJB 3.0引入了注解式JPA(Java ...

    EJB3.0程序设计

    8. **生命周期回调**:EJB3.0允许开发者在Bean的生命周期事件上注册回调方法,如`@PostConstruct`和`@PreDestroy`注解分别用于标记初始化和销毁方法。 9. **分布式特性**:EJB3.0支持跨服务器的透明调用,使得Bean...

    EJB3.0

    例如,可以创建一个`@Stateless`的会话Bean来处理用户登录和注册,一个`@Entity`的bean来表示用户信息,使用JPA进行数据存储。通过`@MessageDriven`Bean,可以实现消息通知系统,当用户有新的消息时,系统可以异步...

    EJB3.0 企业开发

    EJB 3.0的核心理念是提高开发效率和简化企业级应用的复杂性,它通过注解和标准API实现了这一目标。开发者可以专注于业务逻辑,而不是底层基础设施的配置和管理。理解并熟练运用EJB 3.0的各项特性,对于构建健壮、可...

    基于EJB3.0的分布式网上购物系统毕业设计.doc

    - 用户管理:包括用户注册、登录、个人信息管理等功能。 - 商品管理:涉及商品的添加、修改、删除以及分类管理。 - 购物车:实现用户选择商品、修改数量、结算等功能。 - 订单处理:包括订单创建、支付、发货状态...

    jsf +ejb3.0

    4. **依赖注入(Dependency Injection)**: EJB 3.0通过`@EJB`、`@Inject`和`@Resource`注解实现了依赖注入,简化了组件之间的关联。 5. **容器管理(Container-Managed)**: EJB容器负责事务管理、安全性、并发...

    EJB3.0容器模型的WEB服务-WebService

    **EJB 3.0 容器模型与 WebService** Enterprise JavaBeans(EJB)是Java平台上用于构建可扩展、安全且事务处理能力强的企业级应用的框架。在EJB 3.0版本中,引入了许多重要的改进,使得开发更加简化,更接近标准...

    jsp+servlet+EJB3.0网上书店

    总的来说,"jsp+servlet+EJB3.0网上书店"项目展示了如何利用Java Web技术栈实现一个基本的电子商务系统,虽然功能可能不完整,但它为学习者提供了一个了解和实践这些技术的起点。通过深入研究和扩展这个项目,开发者...

    struts2+ejb3.0三个简单实例项目

    EJB3.0(Enterprise JavaBeans)是Java EE平台的一部分,主要用于实现业务逻辑。相比之前的版本,EJB3.0大大降低了开发复杂性,引入了注解驱动的编程模型,使得企业级服务的创建更为简便。在这个项目中,你会看到...

    Myeclipse+JBoss开发的EJB3.0 大型电子商务网站网上书店

    1. 用户模块:使用EJB实现用户注册、登录、个人信息管理等功能,可能涉及到实体Bean(@Entity)来持久化用户数据。 2. 商品模块:展示书籍信息,可能通过EJB提供服务接口,如查询、分类等。 3. 购物车模块:实现商品...

    JBOSS EJB3.0实例教程

    - 在EJB3.0中,可以通过`@Inject`注解实现依赖注入。 **4.8 定时服务(TIMERSERVICE)** - 定时服务允许会话Bean注册定时器。 - 适用于执行定期任务。 **4.9 安全服务(SECURITY SERVICE)** - 安全服务用于实现身份...

    09_传智播客EJB3.0_配置jboss数据源.rar

    本教程“09_传智播客EJB3.0_配置jboss数据源”主要关注如何在JBoss应用服务器中配置数据源,这对于任何处理数据库交互的EJB应用来说都是至关重要的。 首先,让我们深入理解EJB 3.0的关键特性: 1. 注解驱动:EJB ...

    ejb3.0 introduce

    Enterprise JavaBeans(EJB)3.0 是Java 2 Enterprise Edition (J2EE) 平台的一个重要组成部分,它是用于构建可扩展、事务处理、多用户安全的分布式业务应用程序的组件模型。EJB 3.0 版本引入了诸多改进,使其更易于...

    JSP+Servlet+EJB3.0+Oracle10g火车售票系统

    本系统主要实现火车查询售票功能,主要的功能如下: 客户端管理功能: (1)动车基本信息管理模块;...4.本设计采用JSP+Servlet+EJB3.0+Oracle10g工具进行开发,最后通过JDBC进行与数据库的相关的链接。

    SAP JPA 1[1].0, EJB 3.0 and Web Service -Modeling Your First JPA Entity in CE 7.1

    2. **部署 Web 服务**:通过将 EJB 会话 Bean 注册为 Web 服务,使其可以被外部系统调用。 #### 准备、部署和运行应用程序 1. **创建依赖关系**:在 EAR 项目中创建依赖关系,确保它可以访问到所有必需的组件。 2. ...

    EJB WebBookShop

    4. **依赖注入 (Dependency Injection)**:EJB3.0中的依赖注入是通过`@EJB`、`@Inject`或`@Resource`注解实现的,它使得组件之间的关系更加灵活,减少了硬编码的依赖。 5. **JPA (Java Persistence API)**:EJB3.0...

    一个复杂的用EJB3实现的银行系统

    1. **用户管理**:包括用户注册、登录、权限管理等,通常涉及身份验证和授权机制。 2. **账户管理**:处理开户、销户、查询余额、转账等操作,这部分是银行系统的核心功能。 3. **贷款服务**:处理贷款申请、审批...

    ejb3_structs

    2. **简化持久化**:通过JPA(Java Persistence API)和ORM(对象关系映射),EJB3.0使得数据持久化更为简单,例如使用`@Entity`和`@Table`注解定义实体类,`@Id`指定主键,`@GeneratedValue`自动生成主键值。...

Global site tag (gtag.js) - Google Analytics