Java消息服务(Java Message Service)规范描述了一个用于J2EE应用程序的标准企业消息传递服务,可以用于在分布式应用程序中的应用程序组件和进程之间路由信息。关于JMS的优点这里就不再赘述了,我们直奔主题看看如何在Weblogic 9.2上搭建一个简单的应用。 首先我们需要手动在Weblogic上创建一个JMS服务器以及相关模块,其方法如下: 1)打开Weblogic之后通过http://127.0.0.1:7001/console进入控制台; 2)点击左侧的Services/Messaging/JMS Servers创建一个新的JMS服务器,名称为MyJMSServer,在创建的过程中我们选择使用持久性存储(Persistent Storage)新建一个文件存储(File Store)。 3)点击左侧的Services/Messaging/创建一个新的模块,名称为MyModule。然后我们点击这个模块为其添加三个不同类型的资源:连接工厂、队列和主题。注意,在创建这三个资源的时候我们需要记住它们的名字,因为在之后的程序中我们需要使用这些资源的名称来进行查询,创建结果如下图所示
至此,Weblogic的配置就完成了。下面我们在MyEclipse中通过三个Java文件来进行测试,这三个文件均来自《J2EE应用BEA Webloigc Server第2版》的示例代码,只是稍微做了些修改而已。 第一个文件为BaseClient.java,放在包myqueue中: package mybaseclient; import java.util.Properties; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.rmi.PortableRemoteObject; public abstract class BaseClient { private Context ctx; private String url = "t3://localhost:7001"; protected Object narrow(Object o, Class c) { return PortableRemoteObject.narrow(o, c); } protected Context getInitialContext() throws NamingException{ if (ctx == null) { try { Properties p = new Properties(); p.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory"); p.put(Context.PROVIDER_URL, url); ctx = new InitialContext(p); } catch (NamingException ne) { System.err.println("** Unable to connect to the server at:"+url); ne.printStackTrace(); throw ne; } } return ctx; } public BaseClient(String [] argv) { if (argv.length > 0) url = argv[0]; } } 第二个文件为MessageProducer.java,即消息的生产者: package myqueue; import mybaseclient.BaseClient; import javax.jms.JMSException; import javax.jms.Queue; import javax.jms.QueueConnection; import javax.jms.QueueConnectionFactory; import javax.jms.QueueSender; import javax.jms.QueueSession; import javax.jms.Session; import javax.jms.TextMessage; import javax.naming.Context; import javax.naming.NamingException; public final class MessageProducer extends BaseClient { private QueueSender sender; private TextMessage msg; public MessageProducer(String [] argv)throws NamingException, JMSException{ super(argv); Context ctx = getInitialContext(); QueueConnectionFactory qConFactory = (QueueConnectionFactory)ctx.lookup("myconnectionfactory"); Queue messageQueue = (Queue) ctx.lookup("myqueue"); QueueConnection qCon = qConFactory.createQueueConnection(); QueueSession session = qCon.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); sender = session.createSender(messageQueue); msg = session.createTextMessage(); } public void runClient()throws JMSException{ msg.setText("Hello"); sender.send(msg); msg.setText("Welcome to JMS"); sender.send(msg); } public static void main(String [] argv) throws Exception{ try { MessageProducer mp = new MessageProducer(argv); mp.runClient(); } catch (NamingException ne) { System.err.println(""); System.err.println("** Please ensure that you have setup the"+ " JMS Server properly. The JMS Server and the appropriate "+ "JMS Destinations must be configured before running the "+ "examples."); System.err.println(""); throw ne; } } } 最后一个文件AsyncMessageConsumer.java,即一个异步的消息消费者: package myqueue; import mybaseclient.BaseClient; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.Queue; import javax.jms.QueueConnection; import javax.jms.QueueConnectionFactory; import javax.jms.QueueReceiver; import javax.jms.QueueSession; import javax.jms.Session; import javax.jms.TextMessage; import javax.naming.Context; import javax.naming.NamingException; public final class AsyncMessageConsumer extends BaseClient implements MessageListener { private int EXPECTED_MESSAGE_COUNT = 2; private int messageCount = 0; private QueueReceiver receiver; private TextMessage msg; public AsyncMessageConsumer(String [] argv) throws JMSException, NamingException { super(argv); Context ctx = getInitialContext(); QueueConnectionFactory qConFactory = (QueueConnectionFactory) ctx.lookup("myconnectionfactory"); Queue messageQueue = (Queue) ctx.lookup("myqueue"); QueueConnection qCon = qConFactory.createQueueConnection(); QueueSession session = qCon.createQueueSession( false, Session.AUTO_ACKNOWLEDGE ); receiver = session.createReceiver(messageQueue); receiver.setMessageListener(this); qCon.start(); } public boolean expectMoreMessages() { return messageCount < EXPECTED_MESSAGE_COUNT; } public void onMessage(Message m) { try { TextMessage msg = (TextMessage) m; System.err.println("Received: "+msg.getText()); } catch (JMSException e) { e.printStackTrace(); } messageCount++; } public static void main(String [] argv) throws Exception { int MAX_TRIES = 10; int tryCount = 0; AsyncMessageConsumer consumer = new AsyncMessageConsumer(argv); while (consumer.expectMoreMessages() && (tryCount < MAX_TRIES)) { try { Thread.sleep(1000); } catch (InterruptedException ignore) {} tryCount++; } } } 注意在程序执行前我们需要在这个工程中添加一个外部库wlclient.jar ,这个jar包在Weblogic的安装目录下可以找到,例如其安装目录为C:\bea,则在路径C:\bea\weblogic92\server\lib下我们就可以找到它了。这个包是需要添加的,否则程序会报错。 现在我们首先运行文件MessageProducer.java生成信息,待其执行完之后,我们运行文件AsyncMessageConsumer.java,因为我们是异步存取信息,所以这时我们就可以得到所生成的消息内容: Received: Hello Received: Welcome to JMS