posts - 42,comments - 83,trackbacks - 0

        有些情况下,客户希望集成外部MOM来存储消息,比如MQSeries, ActivemQ5.2。集成外部MOM时,Weblogic可以通过几种不同的方式实现,Foreign JMS ServerForeign JNDI ProviderMessage BridgeForeign JMS ServerForeign JNDI Provider工作方式类似,只做JNDI转发,客户端最终会和外部MOM上的destination直接通信。而对于Message Bridge,需要通过在Weblogic配置本地destination,客户端发送、接收消息的时候,连接的本地destination,然后由Weblogic实现本地destination和外部MOM上的destination的通信。而对于外部jndi,我们又有两种方式,可以使用apacheActiveMQInitialContextFactory(基于jndi.properties)也可以使用sunRefFSContextFactory(基于文件)

    本文通过实例step-by-step介绍如何通过Foreign JMS ServerForeign JNDI Provider Weblogic92ActiveMQ5.2集成起来。

1:下载并安装ActiveMQ5.2
   
下载链接为http://activemq.apache.org/activemq-520-release.html,我们可以下载bin格式的,解压后可以直接启动。

2:启动ActiveMQ5.2,配置destination
   
执行$ACTIVEMQ_HOME\bin下的activemq.cmd.shActiveMQ启动后,我们可以访问admin console(http://localhost:8161/admin/)并创建destination。进入console后,点击Queues,然后点击create,创建我们自己的destination。我创建的queue叫做fjin.Queue_2,我们后面将使用这个queue,如下,



3:生成jndi.properties
   
这个文件对于thin client来说是必须的,而对于weblogic我们不需要这个文件,我们只要在配置Foreign JMS ServerForeign 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_2queue是指定destination类型,我们在做lookup时,需要去掉queue.,对于=后面fjin.Queue_2, 则是指我们在ActiveMQ中配置的物理queueThin client使用这个文件的时候,需要将他放在classpath(将该文件所在的目录加入classpath即可)

4:生成RefFSContextFactory所需要的文件
   
如果使用RefFSContextFactory作为jndi provider context factory,我们要生成对应的文件。文件的生成可以通过下面的程序实现(类似于MQSeriesJMSAdmin),用于物理queuejndi 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
   
因为我们将使用ActiveMQInitialContextFactoryRefFSContextFactory两种方式,因此我们需要将对应的jar包放入classpath(startWeblogic.cmd/sh),如下:

6:配置Foreign JMS ServerForeign JNDI Provider
   
前面我们说过,集成可以通过Foreign JMS ServerForeign JNDI Provider,而这两种方式其实都是基于jndi的,而jndi可以用两种方式,组合起来的话,会有四种方式。这里不作一一罗列,以如下两种方式作为实例,
    Foreign JMS Server + ActiveMQInitialContextFactory
    Foreign JNDI Provider + RefFSContextFactory

6.1Foreign JMS Server + ActiveMQInitialContextFactory
   
6.1.1:首先我们在weblogic中配置一个foreign jms server,如下:


    这里jndi properties和我们在jndi.properties文件中的内容一样,只是少了initial context factoryprovider url的指定。注意:queue.fjin.Queue_2queue指定的是destination类型,而fjin.Queue_2指的是将来客户端要lookupjndi name。其格式为:
    queue.jndiName = physical queu name
   
topic.jndiName = physical topic name
   
connectionFactoryNames = jndiName1,jndiName2,...

    6.1.2:配置foreign jms server中的destinationconnection factory


    这里remote jndi name指我们在jndi properties中设定的destinationconnection factoyjndi name,而local jndi name将被用于客户端lookup

    6.1.3:客户端测试程序
   
配置完成后,我们可以通过客户端程序进行消息发送测试,如下:

1             String providerUrl="t3://localhost:7008";
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
配置完成后,我们可以通过客户端程序进行消息发送测试,如下
:

1             String providerUrl="t3://localhost:7008";
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文件,我们在写客户端时,需要lookupjndi name: fjin.Queue_2, fjin.JMSConnectionFactory,如下:

1             String providerUrl="tcp://localhost:61616";
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");
posted on 2009-07-10 15:07 走走停停又三年 阅读(2129) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: