扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
在这样一个不断成长的 Java™ 世界中,期望与挑战日复一日的不断增加。每个人都希望站在不断变化的前沿,但是技术文章常常不能为我们提供开发者所需的细节内容。因此,本指南为您详尽展示了如何开发、部署与运行随需应变的 Java 2™ Platform Enterprise Edition™(J2EE™)应用程序。在这个过程中,您还会学到如何完成以下相关任务:
我们已设计了一种基于实际生活的场景,这个场景易于理解并且易于关联到技术。它使用随需应变的方式在不同应用程序服务器之间交换信息。虽然有很多方法来编写软件,但是为了交换信息的目的,我们选择了发送消息的方式来加以实现,因为它本身就拥有同步与异步的优势。
在这个实践场景中,分布在不同区域的一家公司需要完成用户实际货物订单的要求。如果某个地点不能完成一个订单,则需要其他地方代替它完成。由于安全原因,不同地点的员工不能查看其他地点的数据库。每一地点的应用程序运行于本地的应用服务器,且仅对本地职员开放。
本场景只包括三个地点,但是您可以把这种设计应用于任何多的地点中。这种设计的美妙之处在于所有地点都可以通过不同项目名称使用相同代码库。
在下面的例子中,公司的三个地点通过 WebSphere Application Server Network Deployment network 的通用总线架构共享数据。图1 使用不同颜色标记沿着信息路由的三个目的地,箭头表示信息流的方向。例如,来自 Region 1 的 Transfer Process bean 发送数据至 DESTINATION1,它在所有地点发送对于 Check Inventory MDB 的请求信息。
图1描述的设计有如下假设:
如果 Region 1 想将一个订单传送给另一地点来执行,它需要发送 Java Message Service 消息至通用总线目的地,此目的地基于 WebSphere Enterprise Service Bus 技术,并运行于应用服务网络。所有监测通用总线目的地的 MDB 会采用 PubSub 技术报警或进行触发。在响应链中每个被触发的 MDB 会触发下一个 MDB。消息使用标准语言,如XML(您可以使用任何形式的语言作为标准,它取决于您的需要)。
我们为每个功能分别创建了一个 topic,一个 destination,以及相应的 MDB:
在本例中,TransferProcessBean 消息使用如下格式(您的消息格式与内容可以不同,这取决于您的业务):
<message> <fromRegion> 01</ fromRegion> <toRegion> ALL</toRegion> <subject> TRANSFER-REQUEST</subject> ….add more tags as per your business needs </message> |
当然,您可以根据您的业务需求增加更多不同的标签。
一旦 CheckInventoryMDB 消息被发送,那么每个监听 DESTINATION1 的地点都会被触发响应。如果一个地点已有足够多的存货来满足用户订单,它会自动保留必需的条目,并发送一个其有足够存货满足此订单的响应。这些响应被发送至DESTINATION2,并且 <toRegion> 标签告知每一个地点的接受者,此消息是否为它们的地点所想要的。消息看起来基本上类似如下:
<message> <fromRegion>02</ fromRegion> <toRegion>01</toRegion> <subject>TRANSFER-RESPONSE</subject> <details>Fill in your info/data whether you can accept or not</detail> </message> |
一旦前一个消息在 DESTINATION2 中被发送,那么CompleteRRTransferMDB指令就会在每个地点中被触发。只有处于请求地点的 MDB 处理这个消息,因为它是基于 Region 标签值的。如果有多个地点可以满足此订单,那么请求地点的 MDB 只选择一个,并且相应地发送一个消息至 DESTINATION3。
紧接着, 监听 DESTINATION3 的CompleteARTransferMDB被触发。它在存货存在的新地点中,根据其订单创建逻辑完成订单的创建。现在,订单传输完成了。
在此设计中存在一些很关键的考虑事项:
现在您已经理解了基本设计,您可以开始关注如何在 IDE 和应用服务器上使用它了。为了证明的需要,本例子使用 IBM Rational Application Developer® 作为 IDE,IBM WebSphere®Application Server Version 6.1 Unit Test Environment 作为应用程序服务器。 在您成功测试之后,您要使用 IBM WebSphere® Application Server Network Deployment V6.1 作为应用程序服务网络。两者之间的区别是 WebSphere Application Server Unit Test Environment 只能运行一个应用程序服务器,而 WebSphere Application Server Network Deployment 可运行支持多地点的多个应用程序服务器。您应能够在其他 IDE 和支持相似技术的应用程序服务器中实现相同的结果。
WebSphere Application Server V6.1 拥有基本消息功能。 当您完成测试准备部署到生产环境时,一般的您会使用 JMS 产品作为生产环境,如 WebSphere MQ。
开始时创建一个会话 bean 和三个 MDB。
为创建会话 bean:
TransferProcessBean的会话bean。
您可以用来进行此项工作的方法之一是publishMessage1
。它被编码以发送主题消息。您可以在看到writeYourLogicInThisMethod1
的地方增加您的逻辑。 public void publishMessage1() { TopicConnectionFactory topicConnectionFactory = null; TopicConnection topicConnection = null; Topic topic = null; TopicPublisher topicPublisher = null; TopicSession topicSession = null; String connectionFactoryName = "java:comp/env/TCF1IdeRef"; String topicName = "java:comp/env/Topic1IdeRef"; //Add your try, catch blocks Context ctx = new InitialContext(); topicConnectionFactory = (TopicConnectionFactory) ctx .lookup(connectionFactoryName); topicConnection = topicConnectionFactory.createTopicConnection(); boolean transacted = false; topicSession = topicConnection.createTopicSession(transacted, TopicSession.AUTO_ACKNOWLEDGE); topic = (Topic) ctx.lookup(topicName); topicPublisher = topicSession.createPublisher(topic); Message myOutgoingMessage1 = null; //Add your logic in writeYourLogicInThisMethod1 String myOutgoingTmpMessage1 = writeYourLogicInThisMethod1(); myOutgoingMessage1 = topicSession.createTextMessage(myOutgoingTmpMessage1.trim()); //Publish the Topic topicPublisher.publish(myOutgoingMessage1); topicPublisher.close(); topicSession.close(); topicConnection.close(); } |
接着,创建三个 MDB:
当您创建每个 MDB 时,选择:
当触发 MDB 时,被激活的方法是 onMessage。在writeYourLogicInThisMethod2
中根据您的需要为每个 MDB 增加您的逻辑 。以下是 onMessage 方法的内容:
public void onMessage(javax.jms.Message msg) { String myIncomingMessage1; //Add your try, catch blocks. //Similar to Session Bean, make sure to declare JMS related stuffs and Close them once done // Read the incoming Message myIncomingMessage1 = ((TextMessage) msg).getText(); //Add your logic in writeYourLogicInThisMethod2 String myOutgoingMessage2 = writeYourLogicInThisMethod2(myIncomingMessage1); // Publish the Message. Code publishMessage2 similar to Session Bean publishMessage2(myOutgoingMessage2); } |
Java Naming 和 Directory Interface™ (JNDI) 属于 Java™ 平台的一部分。它给基于 Java 技术的应用程序提供一个多重命名与目录服务的统一接口。您需要一些 JNDI 来声明 MDB 监听器,这些是现在您需要做的。
按照如下步骤编辑您的 EJB DD(配置描述符):
jms/AS1
。
jms/Topic1
。
jms/AS2
和 jms/Topic2
。
jms/AS3
和 jms/Topic3
。 这意味着当一个消息在 jms/Topic1 中发送时,CheckInventoryMDB 会自动运行。相同的情况发生在jms/Topic2 与 CompleteRRTransferMDB 、jms/Topic3 与 CompleteARTransferMDB中。
现在您准备为会话 bean 和 MDB 指定消息目的地。
对于会话 bean:
TCF1IdeRef
javax.jms.TopicConnectionFactory
Application
Shareable
Topic1IdeRef
javax.jms.Topic
Application
Shareable
jms/Topic1
更新 JNDI。
jms/TCF01
。 对于 MDB,按照以下步骤替换或修改 TCF1IdeRef
和 Topic1IdeRef
:
TCF2IdeRef
和 Topic2IdeRef
TCF3IdeRef
和 Topic3IdeRef
注意: 记住 CompleteARTransferMDB 不发送任何消息; 它只是简单的监听 DESTINATION3。因此,您不需要为那个 MDB 增加引用。
现在您已经建立起应用核心,您需要有一种机制引发能够触发其他 MDB 的会话 bean。我们有很多方式触发会话 bean。例如,通过 Java 类调用会话 bean,诸如 servlet 或 Faces JSP。假设您创建了包含命令按钮的 Faces JSP 。编辑 Faces JSP, 然后把会话 bean 拖到命令按钮上,这样点击按钮就可以触发会话 bean。
在 WebSphere Application Server Unit Test Engine 的消息引擎中您需要 JMS 引用。Rational Application Developer 是一份免费拷贝。下面是您必须配置的内容:
注意:需要更多资料,请访问 WebSphere Application Server Version 6 Information Center (请看 参考资源 部分)。
启动您的 WebSphere Application Server Unit Test Environment,并进入 Admin Console。按照如下步骤键入 JMS 引用:
CommonBus1
命名的新总线。 Node=pvtndserverNode01, Server=server1
) NodeName
>.<serverName
>-<busName
> (例如: pvtndserverNode01.server1-CommonBus1
)
jms/Topic1 [jms/Topic2, jms/Topic3]
Topic1IdeRef
, 它应与TopicName [Topic2IdeRef, Topic3IdeRef]
的值相同
CommonBus1
DESTINATION1 [DESTINATION2, DESTINATION3]
AS1WASref [AS1WASref, AS3WASref].
jms/AS1 [jms/AS3 , jms/AS3]
Topic
jms/Topic1 [jms/Topic2, jms/Topic3]
CommonBus1
Durable
sn1 [sn2 , sn3]
client1 [client2, client3]
pvtndserverNode01.server1-CommonBus1
现在您的应用程序已经可以运行,它将根据编码逻辑运转。这样就完成了 WebSphere Application Server Unit Test Engine 级别的测试。
下一步需要从 WebSphere Application Server Unit Test Engine 迁移到 WebSphere Application Server Network Deployment 级别,在那里您可以实现多地点。
注意: 为了实现上面的内容,您需要在本地或远程服务器安装 WebSphere Application Server Network Deployment。
<RADinstall-root>\runtimes\base_v6\profiles\<profileName>\bin\addNode <WAS-ND hostname>-includeapps
includeapps
会自动地把所有结点级的应用程序与 JMS 引用移动到 ND。它没有覆盖任何元级消息。因此,您需要在 WebSphere Application Server Network Deployment 管理员控制台上完成"定义应用服务器 JMS 引用"的1至3步内容。
addNode
命令后,您会获得成功升级到下一级的确认消息。
<RADinstall-root>\runtimes\base_v6\profiles\<profileName>\bin\startNode
在完成这个练习之后,您可以运行removeNode
命令重载为先前状态的测试环境。
如何在 Rational Application Developer 中创建 WebSphere Application Server Network Deployment 服务器
现在您已经将 WebSphere Application Server Unit Test Environment 升级为 WebSphere Application Server Network Deployment 级别,您需要从 Rational Application Developer 直接部署应用程序。
回到 Rational Application Developer 会话。
pvtndserverCell01/sureshtWinASNode03/server1
。 在创建应用程序服务器之后,您可以双击 Servers视图中的 entry,会看到配置情况。它与图 2中的屏幕截图相似。
在 WebSphere Application Server Network Deployment 中进行发布与运行
现在您能够从 Rational Application Developer到WebSphere Application Server Network Deployment 发布应用程序了,这与早先 WebSphere Application Server Unit Test Environment 中的做法相似。您还应该能够运行 Faces JSP。最后,确保您看到 MDB 被触发了,并且接着他们有序地触发后面的 MDB。
这将会帮助返回到 图 1,并回顾一下数据流:
您的应用程序已经就绪。
如果您不再需要安装,您可以发出 removeNode
命令从 WebSphere Network Deployment 网络中释放 WebSphere Application Server Unit Test Environment 。有必要的话,可以在 WebSphere Application Server Version 6 Information Center 中查找更多 removeNode
命令的消息。
这样就完成了您的练习。
现在您已经使用 WebSphere Enterprise Service Bus、PubSub MDB 以及 Unit Test Environment 与 Network Deployment 版本的 IBM WebSphere Application Server 开发和测试了一个随需应变的 J2EE 应用程序。您的下一步可以转到生产环节,在那里您可能有一个 JMS 产品,例如 WebSphere MQ (发送消息和队列等待),这使得异步通信成为现实。 Rational Application Developer 把项目工件从一个版本迁移到下一个版本,这样,您从应用程序设计、开发和部署中所花费的时间和工作量的节省中使您和您的团队在未来受益。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者