技术开发 频道

利用WAS CE v2.1 创建基于JMS 的应用(1)

   发布/订阅消息  

发布消息 

为了在用户触发“购买”动作后,向会计及库房传递消息,需要在 ShopWEB 中增加一个 OrderSenderBean。同时,需要对原有 goods.jsp 进行修改,增加链接,用于触发“购买”动作。 

图 2. 添加链接后的 goods.jsp 页面内容 

 

因为 OrderSenderBean 中引用了 JMS 资源,所以还需要在 ShopWEB 的部署文件中,添加对 JMS 资源引用。 

在 web.xml 中添加清单 5 所示代码。 

清单 5. web.xml

<resource-ref>
    <res-ref-name>OrderConnectionFactory</res-ref-name>
    <res-type>javax.jms.TopicConnectionFactory</res-type>
    <res-auth>Container</res-auth>
    <res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
<message-destination-ref>
    <message-destination-ref-name>OrderTopic</message-destination-ref-name>
    <message-destination-type>javax.jms.Topic</message-destination-type>
    <message-destination-usage>Produces</message-destination-usage>
    <message-destination-link>OrderTopic</message-destination-link>
</message-destination-ref>

从代码中可以看出,此处引用的 JMS 资源正是在 jms-resources.xml 中定义的 OrderConnectionFactory 与 OrderTopic。当应用程序部署至 WAS CE 2.1 后,就可以使用这些 JMS 资源。 

在 OrderSenderBean 中,有如下代码片段: 

清单 6. OrderSenderBean.java

public class OrderSenderBean {
    @Resource(name = "OrderConnectionFactory")
    private ConnectionFactory factory;
    @Resource(name = "OrderTopic")
    private Topic orderTopic;
    public String orderGoods() {
     ......
    // sending message to accountant and storage
    Connection connection;
    try {
    connection = factory.createConnection();
    Session sess = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
    TextMessage msg = sess.createTextMessage("<CustomerId=" + 
    customerId + "GoodsId=" + goodsId+">");
    MessageProducer messageProducer = sess.createProducer(orderTopic);
    messageProducer.send(msg);
    System.out.println("OrderSenderBean: Order request sent to accountant and storage");
     } catch (JMSException e) {
     System.out.println("Error " + e);
     e.printStackTrace();
     }
     return "ok";
     }

   OrderSenderBean 使用了 @Resource 来绑定 JMS 资源。此段代码也展示了利用 JMS 队列发送消息的流程。 

创建 MDB(Message Driven Bean) 

Java EE 中的 MDB 可以用于接收 JMS 消息。为此,创建两个 MDB-ShopAccountant 与 ShopStorage,分别表示会计与仓库。参见清单 7 和清单 8。 

清单 7. ShopAccountant 代码片段

@MessageDriven(activationConfig = {
   @ActivationConfigProperty(propertyName = "destinationType",
    propertyValue =  "javax.jms.Topic"),
   @ActivationConfigProperty(propertyName = "destination", 
    propertyValue = "OrderTopic")})
   public class ShopAccountant implements MessageListener { 	
     public void onMessage(Message message) {
     TextMessage textMessage = (TextMessage) message;
     try {
       System.out.println("ShopAccountant: Order Received \n" + 
       textMessage.getText());
       //do accountant work
        ......
        } catch (JMSException e) {
        e.printStackTrace();
        }
      }
    }

 

0
相关文章