`
menjoy
  • 浏览: 422917 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

一个JMS应用实例

    博客分类:
  • Java
阅读更多
一个JMS应用实例(代码来自试验项目)

功能描述

顾客在一个电子商务网站如果决定购买某一商品,则进入"展示购物篮商品"页面(ShowQuoteServlet.java),点击"Submit Order"按钮下订单,此项操作将调用

(下订单)

CartBean.java(购物篮对象)的purchase()方法,在该方法中将实例化一个订单对象(Order),产生一个Order ID,然后将Order ID通过sendMessage()方法(亦即MessageSender.java类的同名方法)作为一条"消息"发送给JMS服务器,然后,由"订单处理"(OrderProcessorBean.java)消息驱动Bean进行接受,处理完转帐等事宜后,将该订单的标志字段设为"approved",从而完成一次交易。顾客将看到如下的成功信息:

(购买成功)


代 码

1、"展示购物篮商品"页面(ShowQuoteServlet.java)

… …
/*
*如果顾客点击"Submit Order"按钮
*/
if (request.getParameter("Order") != null) {
/*
* 将购物篮转化为订单,完成付款功能(应用JMS)
*/
String orderId = cart.purchase();
/*
* 将orderID放入 request中以便JSP 能够得到
*/
request.setAttribute("orderID", orderId );
/*
* 清除购物篮,以便顾客能购继续购物
*/
cart.clear();
/*
* 转向成功页
*/
this.getServletContext().getRequestDispatcher("/receipt.jsp").forward(request, response);
return;
}
… …

2、CartBean.java(购物篮对象)的purchase()方法和sendMessage()方法

… …
/**
* 购买购物篮中的商品。
购物篮对象将在数据库里创建一个
* 订单。
*
* @返回 Order ID
*/
public String purchase() {
try {
/*
* 锁定 order home 对象
*/
OrderHome home=getOrderHome();
/*
* 创建order
*/
String orderID = makeUniqueID();
Order order=home.create(orderID, owner,"unverified", subTotal,taxes);
/*
* 创建 orderlineitems(订购商品列表)对象
*/
Vector orderItems=addOrderLineItems(order);
/*
* 将orderlineitems存入Order
*/
order.setLineItems(orderItems);
/*
* 发送JMS消息到topic
*/
sendMessage(orderID);
/*
* 返回 order ID
*/
return orderID;
} catch (Exception e) {
throw new EJBException(e);
}
}

/*
*
*发送JMS消息到topic
*@param JMS message, 在这里是 orderId
*/
private void sendMessage(String message) throws Exception{
try{
MessageSender sender=new MessageSender();
sender.sendMessage(message);
}catch(Exception ex){
throw ex;
}
}
… …

3、MessageSender.java类

package examples;
import java.io.*;
import java.util.*;
import javax.transaction.*;
import javax.naming.*;
import javax.jms.*;
/*
*
* 这个类发送JMS Text message 到topic
*/
public class MessageSender{
/*
* 定义 JNDI context factory。
*/
public final static String JNDI_FACTORY="WebLogic.jndi.WLInitialContextFactory";
/*
* 定义 JMS connection factory JNDI 名。
*/
public final static String JMS_FACTORY="jasmine.examples.jms.TopicConnectionFactory";
/*
* 定义JMS topic JNDI 名。
*/
public final static String TOPIC="jasmine.examples.jms.orderProcess";
/*
* 定义Server URL
*/
public final static String URL="t3://localhost:7001";
/*
* 定义JMS connection factory
*/
protected TopicConnectionFactory tconFactory;
/*
* 定义JMS topic connection
*/
protected TopicConnection tcon;
/*
* 定义 JMS topic session
*/
protected TopicSession tsession;
/*
* 定义 JMS topic publisher
*/
protected TopicPublisher tpublisher;
/*
* 定义 JMS topic
*/
protected Topic topic;
/*
* 定义 JMS TextMessage
*/
protected TextMessage msg;
/*
*
* 为发送messages 到一个JMS Topic
* 创建所有必要的对象。
*
* @param ctx JNDI initial context
* @param topicName name of topic
* @exception NamingExcpetion if problem occurred with the JNDI context interface
* @exception JMSException if JMS fails to initialize due to internal error
*
*/
public void init(Context ctx, String topicName)
throws NamingException, JMSException{
/*
* 锁定 Topic connection factory JNDI
*/
tconFactory = (TopicConnectionFactory) ctx.lookup(JMS_FACTORY);
/*
* 创建一个 topic connection factory
*/
tcon = tconFactory.createTopicConnection();
/*
* 创建一个 topic session
*/
tsession = tcon.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
/**
* 锁定Topic JNDI
*/
topic = (Topic) ctx.lookup(topicName);
/**
* 创建一个 publisher
*/
tpublisher = tsession.createPublisher(topic);
/**
* 创建Textmessage
*/
msg = tsession.createTextMessage();
tcon.start();
}
/**
* 创建所有必要的JMS 对象同时发送一个message 到一个JMS topic.
* @params message message to be sent
* @exception JMSException if JMS fails to send message due to internal error
*
*/
public void sendMessage(String message) throws JMSException {
try{
InitialContext ctx= getInitialContext(URL);
init(ctx,TOPIC);
send(message);
}catch(Exception ex){
throw new JMSException( ex.getMessage());
}finally{
close();
}
}
/**
* 发送一个message 到一个JMS topic。
*
* @params message message to be sent
*/
public void send(String value)
throws JMSException {
msg.setText(value);
tpublisher.publish(msg);
}
/**
* 关闭 JMS 对象。
*
* @exception JMSException if JMS fails to close objects due to internal error
*/
public void close()
throws JMSException {
tpublisher.close();
tsession.close();
tcon.close();
}
/**
* 返回应用服务器初始化环境上下文信息。
*/
protected static InitialContext getInitialContext(String url)
throws NamingException {
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
env.put(Context.PROVIDER_URL, url);
env.put("WebLogic.jndi.createIntermediateContexts", "true");
return new InitialContext(env);
}
/**
* main() 方法。用于测试该类。
*
* @param args WebLogic Server URL
* @exception Exception if operation fails
*/
public static void main(String[] args)
throws Exception{
if (args.length != 1) {
System.out.println("Usage: java examples.jms.topic.TopicSend WebLogicURL");
return;
}
InitialContext ic = getInitialContext(args[0]);
MessageSender sender = new MessageSender();
sender.init(ic, TOPIC);
sender.send("123456");
sender.close();
}
}

4、"订单处理"(OrderProcessorBean.java)消息驱动Bean


package examples;import javax.ejb.*;
import javax.jms.*;
import javax.naming.*;
import javax.rmi.PortableRemoteObject;
/**
* 此消息驱动(message-driven) bean接受JMS messages
* 以便实现购买过程。届时将执行order processing。
*/
public class OrderProcessorBean implements MessageDrivenBean, MessageListener {
protected MessageDrivenContext ctx;
/**
* 这是消息驱动(message-driven)beans 拥有的一个商业方法。
* 在此我们执行真正的order processing
*/

public void onMessage(Message msg) {
TextMessage tm = (TextMessage) msg;
try {
String orderID = tm.getText();
Context ctx = new InitialContext();
OrderHome home = (OrderHome)
PortableRemoteObject.narrow(
ctx.lookup("OrderHome"), OrderHome.class);
Order order = home.findByPrimaryKey(orderID);
/*
* 在此我们可以执行其他的任务:
*
* - 检查用户的信用卡credit并进行划帐操作。
*
* - 检查库存确保商品可卖。
*
* - 检查送货的相关信息。
*
* - 发送email认证信息
*
* 在此例中,我们将仅仅把 order的 status 改变为
* "approved".
*/
order.setStatus("approved");
}
catch (Exception e) {
e.printStackTrace();
throw new EJBException(e);
}
}
/**
* 使该bean 实例与一个特别的context发生联系。
* 我们可以在此 Context 中查询到环境信息。
*/
public void setMessageDrivenContext(MessageDrivenContext ctx) {
this.ctx = ctx;
}
/**
* 在生命周期的初始服务器container将调用此方法。
* 我们将做一些初始化工作。
*/
public void ejbCreate() {
System.err.println("ejbCreate()");
}
/**
* 服务器container调用此方法清除Bean。
*/
public void ejbRemove() {
System.err.println("ejbRemove()");
}
}

5、"订单处理"(OrderProcessorBean.java)消息驱动Bean的配置文件代码
① ejb-jar.xml
<ejb-jar></ejb-jar><enterprise-beans></enterprise-beans>
… …
<message-driven></message-driven>
<ejb-name></ejb-name>OrderProcessor
<ejb-class></ejb-class>examples.OrderProcessorBean
<transaction-type> </transaction-type> Container
<message-driven-destination></message-driven-destination>
<destination-type></destination-type>javax.jms.Topic

… …
… …

② WebLogic-ejb-jar.xml
<weblogic-ejb-jar></weblogic-ejb-jar>… …
<weblogic-enterprise-bean></weblogic-enterprise-bean><ejb-name></ejb-name>OrderProcessor
<message-driven-descriptor></message-driven-descriptor> <pool></pool> <max-beans-in-free-pool></max-beans-in-free-pool>100 <initial-beans-in-free-pool></initial-beans-in-free-pool>10
<destination-jndi-name></destination-jndi-name>jasmine.examples.jms.orderProcess

<jndi-name></jndi-name>OrderProcessorBean

… …



 

分享到:
评论

相关推荐

    JBOSS建立JMS应用实例

    【JBOSST建立JMS应用实例】 JBOSST(Java Business Open Source Solutions)是一个开源的企业级应用服务器,它提供了全面的中间件服务,包括对Java消息服务(JMS)的支持。JMS是一种标准,用于在分布式环境中传递...

    JMS完全实例(八个实例)

    通过这八个实例的学习,你将能够全面掌握JMS的核心特性和使用方式,理解其在实际项目中的应用,提升你在企业级应用开发中的消息处理能力。同时,结合Spring框架的使用,能让你更好地在实际工作中利用JMS实现高效、...

    activeMQ-JMS实例

    总结来说,"activeMQ-JMS实例"是一个基于Spring MVC的示例,它演示了如何使用Spring的JMS支持与ActiveMQ结合,实现消息的发送和接收。这个实例对于学习和理解JMS以及如何在实际项目中应用它是很有帮助的。通过这个...

    一个jms activemq Topic 消息实例

    一个jms activemq Topic 消息实例 关于jms JMS 是接口,相当于jdbc ,要真正使用它需要某些厂商进行实现 ,即jms provider 常见的jms provider 有 ActiveMQ JBoss 社区所研发的 HornetQ (在jboss6 中默认即可以...

    JMS经典实例 基于weblogic

    例如,一个繁忙的Web应用可以使用JMS队列来缓存用户的请求,然后在后台处理这些请求,从而提高系统的响应速度和可扩展性。 总的来说,JMS与WebLogic的结合提供了强大的消息传递能力,使得开发者能够构建健壮、灵活...

    一个简单的JMS客户端应用

    在JMS应用中,必须妥善处理各种可能的异常,例如`JMSException`,并考虑重新发送消息或回滚事务的情况。 总结,一个简单的JMS客户端应用涉及到连接管理、会话创建、消息生产和消费等多个环节,利用JMS提供的API...

    JMS整合Spring实例

    而Spring框架是Java开发中广泛使用的轻量级框架,它提供了一个全面的编程和配置模型,使得开发企业级应用变得更加简单。整合JMS与Spring可以帮助我们构建更高效、可扩展的消息驱动系统。 在Spring框架中,我们可以...

    一个Topic和subscriber的JMS应用

    标题 "一个Topic和subscriber的JMS应用" 描述了一个基于Java消息服务(JMS)的系统,该系统涉及发布/订阅模式,其中Topic是发布者发送消息的地方,而subscriber是接收这些消息的实体。JMS是一种标准接口,允许应用...

    JBOSS建立JMS应用实例(附源码)

    下面我们将深入探讨如何在JBoss中构建JMS应用,并通过实例来了解其工作原理。 1. **JMS基础** - **消息模型**:JMS提供了两种主要的消息模型——点对点(Point-to-Point,P2P)和发布/订阅(Publish/Subscribe,...

    JMS详细实例学习教程

    JMS 客户端可以使用 JDBC 接口,可以将 JDBC 和 JMS 包含在一个事务里。这种包含可以在 EJB 里,也可以直接调用 JTA(Java Transaction API)接口实现。JavaBeans 可以用 JMS Session 发送或接收消息。EJB2.0 规范中...

    ActiveMq-JMS简单实例使用tomcat.doc

    Apache ActiveMQ 是一个流行的开源消息中间件,它实现了Java消息服务(JMS)规范,允许应用程序之间进行异步通信。在本文中,我们将探讨如何在Tomcat服务器上设置和使用ActiveMQ的简单实例。 **一、ActiveMQ的特点...

    javax.jms.jar包与JMS实例代码

    总结起来,`javax.jms.jar` 包提供了Java开发人员与JMS兼容的消息中间件进行通信的工具,而`demo` 文件中的实例代码展示了如何在实际应用中使用这些工具。通过学习和实践这些示例,你可以更好地理解和掌握Java消息...

    JMS信息传输实例代码

    前面多次提到 JMS 提供者,因为 JMS 给我们提供的只是一系列接口,当我们使用一个 JMS 的时候,还是需要一个第三方的提供者,它的作用就是真正管理这些 Connection、Session、Topic 和 Queue 等。 JMS 入门的知识点...

    Java-JMS实例

    WebLogic Server 是Oracle公司的一个Java EE应用服务器,它遵循JMS规范并提供了强大的消息服务功能。WebLogic JMS Server 的主要组件包括: 1. **WebLogic JMS servers**:这些服务器处理消息的发送和接收。 2. **...

    Flex + BlazeDS + Java + JMS 通信实例(附源码)

    综上所述,这个实例是一个典型的富互联网应用(RIA)开发案例,展示了Flex、BlazeDS、Java和JMS在实时通信中的应用,对于理解和掌握相关技术具有很高的实践价值。通过学习和实践这个实例,开发者可以更好地理解如何...

    ActiveMq-JMS简单实例

    这通常涉及修改Tomcat的server.xml文件,添加一个Context元素来指向ActiveMQ的web应用目录。 在"ActiveMq-JMS简单实例使用tomcat.doc"中,可能详细介绍了如何配置Tomcat和ActiveMQ,包括启动和停止ActiveMQ服务的...

    java-jms小例子

    总结,"java-jms小例子"是一个基础教程,帮助开发者理解如何在Java应用程序中使用JMS进行异步通信。通过创建消息生产者和消费者,设置消息队列或主题,以及发送和接收不同类型的JMS消息,开发者能够掌握JMS的核心...

    jms入门实例

    1. **消息生产者**: 在JMS中,一个应用程序可以作为一个消息生产者,通过调用`createMessage()`方法创建消息对象,然后使用`send()`方法将消息发送到消息代理。消息可以是文本、二进制或其他复杂的数据结构,封装在`...

    JMS消息队列机制及案例

    每个消息仅被一个消费者接收,确保消息的顺序传递和至少一次传递(可能因重复消费而超过一次)。 5. **主题(Topic)**:主题支持发布/订阅模式,一个消息可以被多个订阅者同时接收,实现广播式通信。 6. **案例...

    JMS实例,整合spring,含jar

    本实例中,"JMS实例,整合spring,含jar"表明这是一个具体的项目示例,展示了如何在Spring框架中配置和使用JMS。这通常涉及到以下步骤: 1. **添加依赖**:首先,你需要在项目的构建文件(如Maven的pom.xml或Gradle的...

Global site tag (gtag.js) - Google Analytics