发布/订阅消息
发布消息
为了在用户触发“购买”动作后,向会计及库房传递消息,需要在 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();
}
}
} |