本文转载自:http://harper.ycool.com/post.1021639.html
本文涉及的背景知识如下:
1. JNDI (Java Naming and Directory Service )
2. JMS (Reference: Java Message Service O’Reilly, Jan 2001 First Ed.)
3. EJB (Reference: Mastering Enterprise JavaBean, O’Reilly & Associates, 2001 )
本文只涉及EJB中的Message-Driven Bean
4. OC4J (Oracle Container For J2EE, Oracle公司的J2EE Application Server)
Part I Setting up OC4J JMS Service
下面是一个示例:
<?xml version="1.0" standalone='yes'?> <jms-server port="9127"> <topic name="Demo Topic" location="jms/demoTopic"> <queue-connection-factory location="jms/JeraMSQueueConnectionFactory"/> |
其中queue和topic tag声明了可以使用的javax.jms.Queue和javax.jms.Topic,queue-connection-factory和topic-connection-factory则声明了可供使用的javax.jms.QueueConnectionFactory和javax.jms.TopicConnectionFactory.主要需要配置的就是这几个tag. 其中location的属性最为重要,它指明了该对象的JNDI Name.
改动完毕后,重启OC4J,便可以用JNDI服务找到这些对象并使用它们.JMS Service配置完成。可以在AS中运行下述代码以验证服务是否成功启动。(如果在运行过程中没有出现Exception,一般可以确定配置成功)
Context jndiContext = new InitialContext();
QueueConnectionFactory qcf = (QueueConnectionFactory)
jndiContext.lookup("jms/JeraMSQueueConnectionFactory");
QueueConnection connect = qcf.createQueueConnection();
Queue q = (Queue)jndiContext.lookup("jms/JeraMSQueue");
QueueSession session = connect.createQueueSession(false,Session.AUTO_ACKNOWLEDGE);
QueueSender sender = session.createSender(q);
connect.start();
sender.send(session.createTextMessage("This is a message"));
connect.close(); |
Part II Configuring Message-Driven Bean
<message-driven >
<description><![CDATA[<!-- begin-user-doc --> You can insert your documentation for '<em><b>MessageServiceBean</b></em>'.]]></description>
<ejb-name>MessageServiceBean</ejb-name>
<ejb-class>org.harper.frm.core.ejb.msg.MessageServiceBean</ejb-class>
<transaction-type>Container</transaction-type>
<acknowledge-mode>Auto-acknowledge</acknowledge-mode>
<message-driven-destination>
<destination-type>javax.jms.Queue</destination-type>
</message-driven-destination>
</message-driven> |
<!-- Message Driven Beans -->
<message-driven-deployment name="MessageServiceBean"
destination-location="jms/JeraMSQueue"
connection-factory-location="jms/JeraMSQueueConnectionFactory">
</message-driven-deployment> |
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws Exception { doService(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws Exception { doService(request, response); } protected void doService(HttpServletRequest request, HttpServletResponse response) throws Exception { Context jndiContext = new InitialContext(); QueueConnectionFactory qcf = (QueueConnectionFactory) jndiContext.lookup("jms/JeraMSQueueConnectionFactory"); QueueConnection connect = qcf.createQueueConnection(); Queue q = (Queue)jndiContext.lookup("jms/JeraMSQueue"); QueueSession session = connect.createQueueSession(false,Session.AUTO_ACKNOWLEDGE); QueueSender sender = session.createSender(q); connect.start(); sender.send(session.createTextMessage("This is a message")); connect.close(); } |
Message-Driven Bean端onMessage函数如下
public void onMessage(javax.jms.Message message) { // begin-user-code System.out.println("Message Driven Bean got message " + message); // TODO: do business logic here // end-user-code } |
执行后输出结果如下:
“Message Driven Bean got message TextMessage[ID:Oc4jJMS.Message.jiangha.71dc3d:1082ce8377e:-8000.8]”
证明配置成功完成。
这里的name属性与上面ejb-jar.xml中的ejb-name属性是对应的。 destination-location和connection-factory-location分别指定了MDB读取Message使用的消息队列和创建连接使用的Factory.这里的location必须是在jms.xml中声明过的连接。
至此配置完成,下面要做的是测试工作。
Part III Test
测试环境由两部分组成:负责发送消息的Servlet和后台处理消息的Message-Driven Bean.
Servlet端代码如下:
这个deployment-descriptor中,需要修改的部分主要有<transaction-type>(可选项为Container和Bean)和<destination-type>(可选项为Queue和Topic),根据MDB具体选择。
如果读者对EJB比较熟悉,可能会注意到:与SessionBean或EntityBean不同的是,Message-Driven Bean的deployment-descriptor中没有包含JNDI location的信息。这是由MDB与其他两种EJB不同的工作方式决定的。在被创建后,MDB会使用指定的ConnectionFactory创建与JMS Service的连接,随后在指定的消息队列中监听消息,并根据收到的消息决定自己的行为。应用程序只能通过这个消息队列与MDB交互,所以MDB并不需要一个JNDI location.
2. 对orion-ejb-jar.xml的配置
这个文件是OC4J系列Server专用的deployment-descriptor文件。如果使用的AS是JBOSS,则要配置jboss.xml,其他类似。
下面是一个示例:
--本段假设读者已经具有EJB的相关背景知识(包括deployment descriptor等),因此不再对一些常识进行说明。
1. 对ejb-jar.xml的配置
JMS Service的运行需要一台JMS Server的支持。目前主流J2EE AS的开发商都在自己的产品中集成了JMS Server的实现,只需要正确的配置,启用JMS服务就可以了。本文中使用的JMS Server是OC4J JMS。
OC4J JMS的配置文件是$ORACLE_HOME/config/jms.xml,在$ORACLE_HOME/config/server.xml中使用”<jms-config path="./jms.xml"/>” tag指明。
Jms.xml的DTD文件是http://xmlns.oracle.com/ias/dtds/jms-server-9_04.dtd