`
lijhxuexi
  • 浏览: 2041 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

使用 WebSphere Studio Application Developer 5.0 创建和测试消息驱动 Bean

阅读更多
来自:http://www.ibm.com/developerworks/cn/websphere/techjournal/0211_barcia/barcia.html

WebSphere Studio Application Developer 5.0 支持消息驱动 bean(message-driven bean,MDB)。有了 MDB,EJB 容器就能够异步地接收消息 ? 客户机组件可以向 EJB 容器发送消息,而不必等待应答。然后,消息传递系统(比如 IBM WebSphere MQ)可以把更新应用到 EJB 系统中,并与其他资源(例如,一个数据库)一起参与分布式事务。不存在 MDB 或 EJB 时,这种情况的编码工作必须编写先浏览队列、然后启动事务的逻辑。
? Copyright International Business Machines Corporation 2002. All rights reserved.


引言

IBM WebSphere Studio Application Developer 5.0(以下称为 Application Developer)支持包含 EJB 2.0 的新 J2EE 1.3 规范。有了 EJB 2.0,您就可以创建消息驱动 bean(message-driven bean,MDB),这种 bean 使得 EJB 容器能够异步地接收消息。客户机组件可以向 EJB 容器发送消息,而不必等待应答。能够向 EJB 容器发送消息(与纯 Java 对象相比)会使应用程序的效率更高;EJB 容器在接收到一条消息时可以发出分布式事务。然后,消息传递系统,比如 IBM WebSphere MQ(以下称为 MQ)可以把更新应用到 EJB 系统中,并与其他资源(例如,一个数据库)一起参与分布式事务。不存在 MDB 或 EJB 时,这种情况的编码工作必须先编写浏览队列、然后启动事务的逻辑。

Application Developer 5.0 提供了 WebSphere Application Server 5.0(以下称为 Application Server)测试环境,它完全遵循 J2EE 1.3。Application Server 5.0 的其中一个新功能部件是内建的 JMS 服务器。现在,对于自助应用程序,Application Server 不再需要依赖外部 JMS 提供程序,比如 WebSphere MQ。但您仍然可以配置 Application Server 5.0 让 MQ 作为企业级集成的 JMS 提供程序。

WebSphere JMS(内建的 JMS 服务器)是用与 MQ 所用的相同技术构建的。由于 MDB 是按标准编码的,所以您可以把提供程序从 WebSphere JMS 更改为 WebSphere MQ 而不必更改任何代码。嵌入的 JMS 服务器实际上并不是 WebSphere MQ,理解这一点非常重要;它仍旧是内建在 WebSphere Application Server 5.0 中的 JMS 服务器。WebSphere JMS 没有任何与 MQ 安装进行通信的通道或特别的 hook。您需要编写 JMS API 与 WebSphere Application Server 内部的队列或主题进行通信。要与 WebSphere MQ 进行通信,您必须安装它作为 WebSphere Application Server 的 JMS 提供程序。

本文将演示如何使用 WebSphere Studio Application Developer 5.0 for Windows? 构建和测试 MDB。在这篇教程中,您将创建一个简单的 JMS 客户机把消息写到一个队列中,并创建 MDB 来接收消息并将它显示到控制台。

在继续学习本教程之前,建议您熟悉一下 JMS。关于参考资料,请参考下面的 相关信息部分。






回页首




构建消息驱动 Bean

在这一节,您将创建 MDB 和一个 servlet,该 servlet 稍后将发送消息:

创建 J2EE 项目:EAR、EJB 和 J2EE Web 项目
使用 Application Developer 向导创建 MDB
向 MDB 添加代码以显示 JMS 消息
创建一个简单的 JMS servlet 来测试 MDB
如果您想跳过整个这一节,则只需 下载下面提供的 ZIP 文件即可,这个文件包含已经创建好的 EAR 文件 MDBTest.ear 。然后,在 Application Developer 中通过选择 File =>Import =>EAR File导入 EAR。完成这项工作后,跳到 配置并测试消息驱动 Bean 这一节。

第 1 步:创建 J2EE 项目:EAR、EJB 和 J2EE Web 项目

启动 Application Developer,然后确保处于 J2EE 透视图(参见图 1)中。如果 J2EE 不是上面列出的选择之一,请选择 Other =>J2EE。


图 1.


要创建项目,请选择 File =>New =>Enterprise Application Project。接着选择 Create J2EE 1.3 Enterprise Application project,如下面的图 2 所示。单击 Next。


图 2.


在 Enterprise application project name 域中输入 MDBTest 。取消对 Web module 复选框的选择。当然,您可能有一个不同的工作区目录。参见图 3:


图 3.


单击 Finish。

第 2 步:使用 Application Developer 向导创建消息驱动 Bean

现在,您将创建 MDB。在 J2EE Hierarchy 视图中,选择 EJB Modules => MDBTestEJB 项目(参见图 4)。


图 4.


右键单击 EJB Project,然后选择 New =>Enterprise Bean。Select 对话框打开。在 EJB project 域中,确保选择了 MDBTestEJB 项目(参见图 5)。


图 5.


单击 Next。Create a 2.0 Enterprise Bean 对话框打开:

选择 Message-driven bean作为您的选择。
在 Bean name 域中,输入 MyMDB 。
在 Default package 域中,输入 com.ibm.mymdb 。

图 6.


单击 Next。Enterprise Bean Details 对话框打开。选择 Bean 作为事务类型(Transaction type)。在 Destination Type 域中,输入 Queue 。让 Message selector 和 ListenerPort name 域仍保持空白。(关于侦听器端口的更多详细信息,请参考 启用 WebSphere Application Server 5.0 Administrative Console 并创建侦听器端口这一节。)屏幕现在应该类似图 7:


图 7.


单击 Finish。

第 3 步:向消息驱动 bean 添加代码以显示 JMS 消息

现在,您将添加代码以打印出 MDB 接收的文本消息。(同样,如果不想输入代码的话,您可以 下载本文提供的 EAR 文件。)在 J2EE Hierarchy 视图中,选择 MDBTestEJB => MyMDBean,如图 8 所示:


图 8.


双击该文件以启动 Java Editor。在这个类中,特别标注了两个方法,setMessageDrivenContext 和 onMessage。

清单 1 中的 setMessageDrivenContext 方法是一个回调方法,容器使用它来建立消息上下文。然后 MDB 使用消息上下文与容器通信。您可以使用消息上下文告诉容器回滚一个因消息的到达而被启动的事务。这样将把消息回滚到目的地。您还可以使用这个方法执行初始化例程,比如查找其他类型或 EJB。在这个特殊的样本中,您将不使用消息上下文或事务语义。

清单 1.

/**
* setMessageDrivenContext
*/
public void setMessageDrivenContext(javax.ejb.MessageDrivenContext ctx)
{
   fMessageDrivenCtx = ctx;
}


现在,请向 onMessage 方法添加代码以便与消息接口(Message Interface)进行交互。消息接口是用于所有 JMS 消息类型的接口,例如,TextMessage、BytesMessage 和 StreamMessage。在这个样本中,只是把消息打印到控制台。请参阅清单 2 的代码:

清单 2.

/**
* onMessage
*/
public void onMessage(javax.jms.Message msg)
{
   javax.jms.TextMessage txtMsg = (javax.jms.TextMessage)MSG;
   try
   {
      System.out.println("INSIDE MESSAGE DRIVEN BEAN: MESSAGE -> "
         + txtMsg.getText());
   }
   catch (JMSException e)
   {
      e.printStackTrace(System.out);
   }



您只需把消息接口强制转型为 TextMessage 并以文本格式打印出来即可。发生错误时,会有一个 JMSException 被捕获。在这种情况下,假设客户机只向这个 MDB 发送文本消息。您可以编写代码以在处理消息之前检查实际的消息类型。接收到 XML 格式的消息是很常见的。

MDB 还定义了标准的 ejbCreate 和 ejbRemove 回调方法。与其他类型的 EJB 不同,客户机并不通过与客户机 EJB API 进行交互来控制 MDB 的生命周期。客户机使用 JMS API 把消息写到队列(或主题)。对于 WebSphere Application Server 5.0 的内部 JMS 服务器来说,JMS 是唯一可用的 API;但是,如果插入了一个外部 JMS 提供程序(比如 WebSphere MQ),那您就可以使用消息传递系统支持的其他消息传递 API。这样将提供强大的旧系统集成功能,在这种集成中,旧系统启动与 WebSphere Application Server 的通信。

保存文件并关闭它。

第 4 步:创建一个简单的 JMS servlet 来测试消息驱动 Bean

现在,请创建一个简单的 JMS servlet 把消息放到队列中以供 MDB 使用。出于本教程的目的,我们只是使用这个 servlet 测试 MDB;并不把它当作最佳实践解决方案。请记住,千万不要直接把 servlet 写到 JMS API 中。它应该把这项任务委托给另一个对象,比如 Business Delegate。而且,servlet 应该把推信息这个任务委托给浏览器,方法是把信息转发给 JSP 或者把 XML 推给 XSLT 处理器。

切换到 J2EE Navigator 视图,展开 Web Modules,然后选择 MDBTestWeb 项目下的 Java Source 文件夹(参见图 9)。


图 9.


右键单击,然后从下拉菜单选择 New =>Servlet。New Servlet 对话框打开:

在 Java package 域中,输入 com.ibm.mymdb.servlet 。
在 Class Name 域中,输入 JMSTestServlet 。
选择 Public作为 Modifier。
其余各项接受缺省值,然后单击 Next。

图 10.


在下一个页面中,确保 doGet() 是被选中的唯一一个存根,然后其余各项接受缺省值(参见图 11):


图 11.


现在,请把 JMS 客户机代码添加到类的 doGet 方法中。servlet 代码作为单独的文件被提供,也就是下面的 下载 ZIP 文件中的 Listing3.txt 。(同样,您还可以通过将 EAR 项目导入到您的工作区中来使用本文提供的 MDBTest.ear 文件。)

代码是简单易懂的 JMS。首先,请为 JNDI Naming Service 创建一个 InitiatContext。接下来,请使用命名上下文(naming context)查找 QueueConnection Factory 和 Queue。请使用 java:comp 前缀;这样客户机就能够使用可以映射为实际名的本地名了,这种实际名把 ConnectionFactory 和 Queue 绑定到命名服务(Naming Service)。(稍后您将在本教程中对此进行配置。)代码的其余部分包括:

根据我们的 ConnectionFactory 创建一个 QueueConnection
根据我们的连接创建一个 QueueSession
根据我们的 QueueSession 创建一个 QueueSender
根据我们的 QueueSession 创建一个 TextMessage
将命令行参数连到一条消息中
在对象 TextMessage 中展示文本
发送消息对象
清除所使用的对象的任何一部分
再一次,使用这些代码来测试 MDB。真实的 JMS 应用程序要求设计时要仔细,并且会使用更有意义的消息格式(例如,XML 或 COBOL Copybook)。保存并关闭文件。






回页首




配置并测试消息驱动 Bean

在这一节中,您将通过完成下列操作来配置并测试 MDB:

创建一个 WebSphere Application Server 5.0 服务器和服务器配置
使用服务器配置编辑器(Server Configuration Editor)激活并配置嵌入的 JMS 服务器
把 J2EE 客户机中的本地 JNDI 名映射为服务器内的实际 JNDI 名
启用 Application Server 5.0 Administrative Console 并创建一个侦听器端口
把 JMS 侦听器端口绑定到 MDB
部署 J2EE 应用程序,启动应用程序服务器,然后测试 MDB
第 1 步:创建一个 WebSphere Application Server 5.0 服务器和服务器配置

首先创建 WebSphere 5.0 测试环境(WebSphere 5.0 Test Environment)。对于任何一个给定的企业项目来说,这通常都是一个一次性任务。单击打开的透视图按钮(参见上面的图 1),然后选择 Other =>Server。

接下来,从菜单栏选择 File =>New =>Server => Server Configuration。Create a New Server and Server Configuration 对话框打开:

在 Server name 域中,输入 WAS5 。
在 Folder 域中,输入 Servers 。
在 Server type 域中选择 WebSphere version 5.0 => Test Environment (Beta)。
尽管 Application Developer 5.0 是一个生产版,但用来测试 J2EE 1.3 应用程序的 WebSphere Application Server 5.0 服务器仍是基于 Application Server 5.0 的 beta 版。由于开发过程通常是在部署过程之前,所以现在您可以启动 J2EE 1.3 项目。

对话框应该类似图 12:


图 12.


单击 Finish。如果出现提示询问您是否创建一个新的 Servers 文件夹,请单击 Yes。

第 2 步:使用服务器配置编辑器激活并配置嵌入的 JMS 服务器

接着,使用服务器配置编辑器激活 JMS 服务器。在 Server Configuration 视图中,展开 Server Configurations树,然后双击 WAS5。这样会启动服务器配置编辑器。

接下来,转到 JMS 选项卡视图去配置嵌入的 JMS 服务器并定义 Connection Factory 和 Queue。Application Developer 包含让您与嵌入的 JMS 服务器进行交互的选项卡视图。如果您正在使用的是外部 JMS 提供程序,那么您需要使用 WebSphere Administrative Console 对此进行配置。

您会注意到您可以在多个地方定义 JMS 对象。这显示了您的对象的可用作用域。请注意下面三个术语以及它们的定义:

服务器(受管进程)
个别服务器或进程,比如应用程序服务器(Application Server)或 JMS 服务器
节点
由一组运行在一台机器上的受管进程组成
单元
节点的聚集
您可以以上面三种级别之一配置 JNDI 对象。这样会创建一个作用域,它确定某些定义在哪里可用。对于本教程,请使用节点。

向下滚动到 Node Settings 部分,然后单击 Add(在 WASQueueConnectionFactory 部分旁边)。


图 13.


Add WASQueueConnectionFactory 对话框打开。请完成下面的操作:

在 Name 域中,输入 MyMDBConnectionFactory 。
在 JNDI Name 域中,输入 jms/MyMDBConnectionFactory 。
在 Node 域中,选择 localhost。
在 Server Name 域中,选择 server1。
其余各项接受缺省值。

图 14.


单击 OK。在 Node Settings 部分,向下滚动到 JMS Destinations 下的 WASQueue Entries 部分,然后单击 Add。


图 15.


Add WASQueue 对话框打开。请完成下面的操作:

在 Name 域中,输入 MyMDBQueue 。
在 JNDI Name 域中,输入 jms/MyMDBQueue 。
其余各项接受缺省值(参见图 16):


图 16.


单击 OK。

现在,把 Queue 添加到 JMS Server 中,然后激活 JMS Server。向下滚动到 Server Settings 部分。在 JMS Server Properties 下单击 Add(在 Queue Names 域的旁边),然后添加您刚刚定义的 Queue。然后,将初始状态更改为 START。参见图 17:


图 17.


保存服务器配置,然后关闭窗口。

第 3 步:把 J2EE Web 模块中的本地 JNDI 名映射为服务器内的实际 JNDI 名

在客户机应用程序(请参阅 下载 ZIP 文件中的代码片段清单 3)中,JMS 应用程序使用本地 JNDI 名(而不是实际名)查找 Connection Factory 和 Queue。这使得客户机应用程序可以在开发时与实际的服务器定义分离,然后在部署时再绑定它们。例如,在开发过程中,实际的 JMS 名可能是 jms/development/Queue ,然后,在生产过程中可能是 jms/production/Queue 。在部署时绑定本地名使得您不必更改代码就可以更改目的地。

现在,请把本地引用名映射为实际的 JNDI 名。切换回 J2EE 透视图并转到 J2EE Hierarchy 视图。展开 Web Modules,然后双击 MDBTestWeb来启动 Web 部署描述符编辑器(Web Deployment Descriptor Editor)。切换到 References 视图,然后选择 Resource 选项卡(参见图 18)。


图 18.


在 References Resource 视图中,单击 Add,然后完成下列操作:

在 Name 域中,输入 jms/MyConnectionFactoryRef 。
在 Type 域中,输入 javax.jms.QueueConnectionFactory 。
在 Authentication 域中,选择 Application。
在 JNDI Name 域中,输入 jms/MyMDBConnectionFactory 。

图 19.


现在,重复上面为 Queue 执行的相同步骤。在 References Resource 选项卡视图中,完成下列操作:

在 Name 域中,输入 jms/MyQueueRef 。
在 Type 域中,输入 javax.jms.Queue 。
在 Authentication 域中,选择 Application。
在 JNDI Name 域中,输入 jms/MyMDBQueue 。
现在,对话框应该类似图 20:


图 20.


保存文件。

第 4 步:启用 WebSphere Application Server 5.0 Administrative Console 并创建一个侦听器端口

使用上面的配置,现在 JMS 客户机有了足够的信息,知道要把 JMS 消息发送到何处。但这时 MDB 仍不知道要使用哪个 Connection Factory 和 Queue。WebSphere Application Server 使用侦听器端口来配置 MDB。

侦听器端口简化了您管理连接工厂(connection factory)、目的地和已部署的 MDB 之间的关联这种工作。这使得与端口连接在一起的已部署 MDB 能够从目的地检索消息。一旦配置了 JMS 资源,您就可以通过指定侦听器端口来部署 MDB。反过来说,侦听器端口与连接工厂和目的地也是关联在一起的。

Application Developer 5.0 中的服务器配置编辑器没有定义侦听器端口的地方。但 Application Developer 允许您启动 WebSphere Application Server 5.0 Administrative Console。为此,您需要启用 Administrative Console。可以通过启动服务器配置编辑器并启用 Configuration 选项卡视图中的 Administrative Console 来启用 Administrative Console(参见图 21):


图 21.


保存配置,然后关闭该编辑器。

要创建侦听器端口,您首先需要启动服务器,然后再打开 Administrative Console。在 Server 视图中,选择 WAS5 服务器(参见图 22):


图 22.


右键单击 WAS5,然后单击 Start。切换到控制台视图,并等待 Server1 Open for e-business 消息。

服务器启动后,请转回 Servers 视图,再次右键单击 WAS5,这次选择 Run administrative client。这样将启动 Administrative Console(参见图 23):


图 23.


输入任何用户标识(例如,您用来登录机器的用户标识)。

现在,创建侦听器端口。请完成下面的操作:

在左窗格中,选择 Servers => Application Servers。在主窗口中,单击 server1(参见图 24):


图 24.


在下一个页面中,向下滚动到 Additional Properties 部分,然后单击 Message Listener Service 链接(参见图 25)。


图 25.


在下一个页面上,向下滚动到 Additional Properties 部分,然后单击 Listener Ports 链接(参见图 26)。


图 26.


Listener Ports 页面打开。现在,创建一个新的侦听器端口,请单击 New(参见图 27)。


图 27.


在 General Properties 部分,请完成下列操作:

在 Name 域中,输入 MyMDBListenerPort 。
在 Initial State 域中,选择 Started。
在 Connection factory JNDI name 域中,输入 jms/MyMDBConnectionFactory 。
在 Destination JNDI 域中,输入 jms/MyMDBQueue 。
其余各项接受缺省值。

图 28.


单击 OK。现在,您已经创建了一个侦听器端口。请单击页面顶部的 Save链接保存配置(参见图 29)。现在,Save 页面打开。单击 Save 以保存配置(参见图 30)。


图 29.


图 30.


保存后,您将被转到 Administrative Console 主页。单击 Logout 以退出(参见图 31)。关闭浏览器。


图 31.


第 5 步:把 JMS 侦听器端口(JMS Listener Port)绑定到消息驱动 Bean

现在,您将配置带侦听器端口 的 MDB。您可以使用 EJB 部署描述符编辑器(EJB Deployment Descriptor Editor)很容易地完成这种配置。请双击 J2EE Hierarchy 视图中的 EJB Project 来启动 EJB 部署描述符编辑器。请切换到 Beans 选项卡视图,然后在左窗格的 Beans 列表中选择 MyMDB。在 ListenerPort name 域中,输入您刚刚创建的侦听器端口: MyMDBListenerPort 。保存,然后关闭 EJB 描述符编辑器(EJB Descriptor Editor)。


图 32.


第 6 步:部署 J2EE 应用程序,启动应用程序服务器,然后测试消息驱动 Bean

现在,您可以测试 MDB 了,但首先需要把 MDB 添加到服务器。请注意,您并不需要为 MDB 生成 EJB 代理和存根代码,因为客户机直接与 JMS API 交互。在 Server 透视图中,转到 Server Configuration 视图。展开 Server Configurations树,然后右键单击 WAS5(参见图 33):


图 33.


从下拉菜单选择 Add Project =>MDBTest。这样将把 EAR 文件添加到配置中。现在,请回到 J2EE 透视图中,转到 J2EE Navigator 视图,展开 MDBTestWeb,定位 JMSTestServlet.java,然后右键单击(参见图 34):


图 34.


从下拉菜单选择 Run on Server。现在,Server Selection 对话框打开。请确保选择了 Use an existing server,然后单击 Finish(参见图 35)。


图 35.


这将自动启动服务器,然后该服务器将调用 JMSTestServlet。现在,浏览器将显示 servlet 写 JMS 消息所采取的步骤(参见图 36)。


图 36.


在控制台中,验证 MDB 接收到了消息并打印到了屏幕。控制台中应该会显示下面的消息:

INSIDE MESSAGE DRIVEN BEAN: MESSAGE -> Default Message
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics