有些情况下,客户希望集成外部MOM来存储消息,比如MQSeries, ActivemQ5.2。集成外部MOM时,Weblogic可以通过几种不同的方式实现,Foreign JMS Server、Foreign JNDI Provider、Message Bridge。Foreign JMS Server和Foreign JNDI Provider工作方式类似,只做JNDI转发,客户端最终会和外部MOM上的destination直接通信。而对于Message Bridge,需要通过在Weblogic配置本地destination,客户端发送、接收消息的时候,连接的本地destination,然后由Weblogic实现本地destination和外部MOM上的destination的通信。而对于外部jndi,我们又有两种方式,可以使用apache的ActiveMQInitialContextFactory(基于jndi.properties),也可以使用sun的RefFSContextFactory(基于文件)。
本文通过实例step-by-step介绍如何通过Foreign JMS Server、Foreign JNDI Provider 将Weblogic92和ActiveMQ5.2集成起来。
1:下载并安装ActiveMQ5.2
下载链接为http://activemq.apache.org/activemq-520-release.html,我们可以下载bin格式的,解压后可以直接启动。
2:启动ActiveMQ5.2,配置destination
执行$ACTIVEMQ_HOME\bin下的activemq.cmd或.sh。ActiveMQ启动后,我们可以访问admin console(http://localhost:8161/admin/)并创建destination。进入console后,点击Queues,然后点击create,创建我们自己的destination。我创建的queue叫做fjin.Queue_2,我们后面将使用这个queue,如下,
3:生成jndi.properties
这个文件对于thin client来说是必须的,而对于weblogic我们不需要这个文件,我们只要在配置Foreign JMS Server、Foreign JNDI Provider 的时候,直接在jndi properties中输入name/value对就可以了。
java.naming.factory.initial = org.apache.activemq.jndi.ActiveMQInitialContextFactory
java.naming.provider.url = tcp://localhost:61616
connectionFactoryNames = fjin.JMSConnectionFactory
queue.fjin.Queue_2 = fjin.Queue_2
这里fjin.JMSConnectionFactory是客户端在lookup时需要用的(如果客户端是weblogic,那么他将作为remote jndi name,而最终客户端程序使用的是weblogic中定义的local jndi name),而queue.fjin.Queue_2中queue是指定destination类型,我们在做lookup时,需要去掉queue.,对于=后面fjin.Queue_2, 则是指我们在ActiveMQ中配置的物理queue。Thin client使用这个文件的时候,需要将他放在classpath下(将该文件所在的目录加入classpath即可)。
4:生成RefFSContextFactory所需要的文件
如果使用RefFSContextFactory作为jndi provider context factory,我们要生成对应的文件。文件的生成可以通过下面的程序实现(类似于MQSeries的JMSAdmin),用于物理queue和jndi name的绑定. 使用RefFSContextFactory 时需要fscontext.jar,这个jar不是jdk标准包中的内容,可以从如下http://java.sun.com/products/jndi/downloads/index.html下载。
运行这个程序前,我们要在e:/tmp下创建一个activemq_fs_jndi目录,程序执行后,该目录下会生成一个.bindings文件,这个文件将来用于RefFSContextFactory做本地解析。其实fs.Queue_2, fs.JMSConnectionFactory是我们将来foreigh jms server/foreign jndi provider中使用的remote jndi name。
5:设置Weblogic classpath
因为我们将使用ActiveMQInitialContextFactory、RefFSContextFactory两种方式,因此我们需要将对应的jar包放入classpath中(startWeblogic.cmd/sh),如下:
6:配置Foreign JMS Server、Foreign JNDI Provider
前面我们说过,集成可以通过Foreign JMS Server、Foreign JNDI Provider,而这两种方式其实都是基于jndi的,而jndi可以用两种方式,组合起来的话,会有四种方式。这里不作一一罗列,以如下两种方式作为实例,
Foreign JMS Server + ActiveMQInitialContextFactory
Foreign JNDI Provider + RefFSContextFactory
6.1:Foreign JMS Server + ActiveMQInitialContextFactory
6.1.1:首先我们在weblogic中配置一个foreign jms server,如下:
这里jndi properties和我们在jndi.properties文件中的内容一样,只是少了initial context factory和provider url的指定。注意:queue.fjin.Queue_2中queue指定的是destination类型,而fjin.Queue_2指的是将来客户端要lookup的jndi name。其格式为:
queue.jndiName = physical queu name
topic.jndiName = physical topic name
connectionFactoryNames = jndiName1,jndiName2,...
6.1.2:配置foreign jms server中的destination和connection factory
这里remote jndi name指我们在jndi properties中设定的destination和connection factoy的jndi name,而local jndi name将被用于客户端lookup。
6.1.3:客户端测试程序
配置完成后,我们可以通过客户端程序进行消息发送测试,如下:
2 String cfName = " jms.JMSConnectionFactory " ;
3 String destName = " jms.Queue_2 " ;
4 Properties pro = new Properties();
5 pro.put(Context.INITIAL_CONTEXT_FACTORY,
6 " weblogic.jndi.WLInitialContextFactory " );
6.2: Foreign JNDI Provider + RefFSContextFactory
6.2.1: 配置一个foreign jndi provider,如下:
6.2.2:配置jndi links
我们需要配置两个jndi links,一个是destination,一个是connection factory。其中,remote jndi name需要和我们在FSJNDI生成的.binding中的名字一致,比如fs.Queue_2。
6.2.3:配置完成后,我们可以通过客户端程序进行消息发送测试,如下:
2 String cfName = " wlsfs.JMSConnectionFactory " ;
3 String destName = " wlsfs.Queue_2 " ;
4 Properties pro = new Properties();
5 pro.put(Context.INITIAL_CONTEXT_FACTORY,
6 " weblogic.jndi.WLInitialContextFactory " );
7:thin client测试
对于不通过weblogic,直接用jndi连接activeMQ的客户端,我们需要jndi.properties文件,并这个文件要放入该client执行时的classpath中。假如jndi.properties中设定如下:
java.naming.factory.initial = org.apache.activemq.jndi.ActiveMQInitialContextFactory
java.naming.provider.url = tcp://localhost:61616
connectionFactoryNames = fjin.JMSConnectionFactory
queue.fjin.Queue_2 = physical.Queue_2
对于上面的jndi properties文件,我们在写客户端时,需要lookup的jndi name为: fjin.Queue_2, fjin.JMSConnectionFactory,如下:
2 String cfName = " fjin.JMSConnectionFactory " ;
3 String destName = " fjin.Queue_2 " ;
4 Properties pro = new Properties();
5 pro.put(Context.INITIAL_CONTEXT_FACTORY,
6 " org.apache.activemq.jndi.ActiveMQInitialContextFactory " );