BEA Weblogic上使用JMS初步

4 篇文章 0 订阅
2 篇文章 0 订阅

 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值