Windows下MQ客户端配置与JMS编程

前提:客户端是Windows XP,通过JMS编程实现MQ,MQ服务器端已配置

一、MQ客户端配置

  1. 安装MQ客户端:IBM MQSeries Client
  2. 设置环境变量配置环境变量MQSERVER作为客户端连接通道的定义,以连接到其他组的队列管理器

=> SET MQSERVER=MQM /TCP/localhost(5002)

MQM是服务器的队列管理器,localhost是服务器端主机名,5002是实际的监听器端口

二、配置JNDI

用 JMS 实现消息的发送和接收时,经常会用到JNDI。因为JNDI 这种方式比较灵活,对于编程也比较简单。

在安装了MQSeries Client for Java 之后,在\java\bin 目录下找到JMSAdmin.config 文件。该文件主要用来说明Context 的存储方式及存储地址,对应于文件中的两个参数INITIAL_CONTEXT_FACTORY 和PROVIDER_URL。典型的JMSAdmin.config 文件内容如下:

#INITIAL_CONTEXT_FACTORY=com.sun.jndi.ldap.LdapCtxFactory

INITIAL_CONTEXT_FACTORY=com.sun.jndi.fscontext.RefFSContextFactory

#INITIAL_CONTEXT_FACTORY=com.ibm.ejs.ns.jndi.CNInitialContextFactory

#

#PROVIDER_URL=ldap://polaris/o=ibm,c=us

PROVIDER_URL=file:/d:/temp

#PROVIDER_URL=iiop://localhost/

#

SECURITY_AUTHENTICATION=none

INITIAL_CONTEXT_FACTORY 表示JMSAdmin Tool 使用的服务提供商。当前有三种受支持的值。com.sun.jndi.ldap.LdapCtxFactory 用于LDAP,如果使用它就必须安装一个LDAP 服务器。com.sun.jndi.fscontext.RefFSContextFactory 用于文件系统上下文,它只需要使用者提供存放上下文的文件路径。com.ibm.ejs.ns.jndi.CNInitialContextFactory 是专门为

websphere 提供的,它需要和websphere 的CosNaming 资源库一起使用。

PROVIDER_URL 表示会话初始上下文的URL,由JMSAdmin tool 实现的所有JNDI 操作的根。它和INITIAL_CONTEXT_FACTORY 一一对应。需建立PROVIDER_URL文件夹,启动JMSAdmin 控制台后,会生成.bindings文件。

ldap://hostname/contextname 用于LDAP file:[drive:]/pathname 用于文件系统上下文iiop://hostname[:port]/[?TargetContext=ctx] 用于访问websphere CosNaming 名称空间。

最后还有一个参数SECURITY_AUTHENTICATION,用于说明JNDI 是否把安全性凭证传递给了您使用的服务供应商。只有当使用了LDAP 服务供应商时,才使用此参数。此参数有三个值,none(匿名认证)、simple(简单认证)和CRAM-MD5 认证机制。如果没有提供有效值,缺省值为none。

确认配置文件之后,可以在\java\bin 目录下启动JMSAdmin 控制台。也可以在任何目录下用下面的命令来启动控制台:

JMSAdmin –cfg MQ_JAVA_INSTALL_PATH\java\bin\JMSAdmin.config

其中 MQ_JAVA_INSTALL_PATH 为MQSeries Client for Java 安装的根目录。

若启动失败,则好好检查一下您的环境变量是否设置正确。

启动成功后,会进入 JMSAdmin 控制台,显示“欢迎使用管理工具的命令行界面 InitCtx>”。

为了用JMS编程,需定义以下对象:MQQueueConnectionFactory、MQQueue

首先需要知道服务器端的配置,包括:IP, QL, MQM, PORT, CHANNEL, CCSID

 

定义一MQQueueConnectionFactory,连接主机10.10.10.18,端口1414

DEFINE QCF(EXAMPLEQCF)+  //自己定义的QCF名称

DESC(Example Queue Connection Factory)+   //自己定义的描述信息

TRAN(CLIENT)+          //说明是客户端,照抄

HOST(10.10.10.18)+

QMGR(QM_EXAMPLE)+    //服务器端的队列管理器

CHAN(S_EXAMPLE)+      //服务器端的通道名

PORT(1414)+              

CCSID(1381)

 

定义一MQQueue

DEFINE Q(EXAMPLEQL)+   //自己定义的QL名

DESC(Local queue)+         //自己定义的描述信息

QMGR(QM_EXAMPLE)+    //服务器端的队列管理器

QUEUE(Q_EXAMPLE)+     //服务器端的队列名

CCSID(1381)

 

三、用JMS 实现MQ编程

上面我们说明了怎样用JMSAdmin Tool 定义MQ对象的上下文。我们的最终目的是要用JMS 来实现MQ编程,以实现在程序中对MQ队列进行收、发消息。所以,下面我们将重点讨论一下 MQ的JMS 实现。

当我们想发送一条消息到MQ的队列中,再从该队列中取回消息时,我们编程时主要有四个步骤。首先我们要初始化在程序中要用到的对象,然后才可以发送消息到队列中去,再就是收取消息了,最后要清除那些永久对象。这些都和普通的JMS 程序相当。

要把com.ibm.mq.jar、com.ibm.mqjms.jar 、com.ibm.mqbind.jar、jms.jar、jndi.jar、fscontext.jar 和providerutil.jar 加入到lib中。

程序的源代码如下:

import java.util.Hashtable;

import javax.jms.*;

import javax.naming.*;

import javax.naming.directory.*;

 

public class sample {

protected QueueConnectionFactory factory=null;

protected QueueConnection connection;

protected QueueSession queueSession;

protected TextMessage outMessage;

protected QueueSender queueSender;

protected QueueReceiver queueReceiver;

public static final String qcfLookup="EXAMPLEQCF";

public static final String qLookup="EXAMPLEQL";

public static final String icf ="com.sun.jndi.fscontext.RefFSContextFactory";

public String url ="file:/d:/temp";

 

public void sampleInit() throws Exception {

Hashtable environment = new Hashtable();

environment.put(Context.INITIAL_CONTEXT_FACTORY, icf);

environment.put(Context.PROVIDER_URL, url);

environment.put(Context.REFERRAL, "throw");

Context ctx=new InitialDirContext(environment);

factory = (QueueConnectionFactory)ctx.lookup(qcfLookup);

Queue q1=null;

q1=(Queue)ctx.lookup(qLookup);

connection = factory.createQueueConnection();

queueSession = connection.createQueueSession(false,

Session.AUTO_ACKNOWLEDGE);

queueSender = queueSession.createSender(q1);

queueSender.setDeliveryMode(DeliveryMode.NON_PERSISTENT);

outMessage = queueSession.createTextMessage();

queueReceiver = queueSession.createReceiver(q1);

connection.start();

}

 

public void sendMessageOut(String message) throws JMSException {

outMessage.setText(message);

queueSender.send(outMessage);

}

 

public String receiveMessage() throws Exception{

return ((TextMessage)queueReceiver.receive()).getText();

}

 

public void sampleClose() throws JMSException {

queueSession.close();

connection.close();

}

 

public static void main(String[] args){

String rec;

sample sp = new sample();

try {

sp.sampleInit();

sp.sendMessageOut("Hello World!");

java.lang.Thread.sleep(4000);

rec=sp.receiveMessage();

System.out.println("Receive text is : "+rec);

sp.sampleClose();

}catch(Exception e) {

e.printStackTrace();

}

}

}

 

也可以使用配置文件读取initContextFactory、provider_url、queueConnectionFactory和queue,需指明配置文件地址,如下:

<?xml version="1.0" encoding="GB2312"?>

<!-- SMS system configurations -->

<SMSConfig>

       <JMS>           <initContextFactory>com.sun.jndi.fscontext.RefFSContextFactory</initContextFactory>

              <provider_url>file:/d:/temp</provider_url>

              <queueConnectionFactory>MESSQCF</queueConnectionFactory>  //自己定义的QCF

              <queueSender>MESSQL</queueSender> //自己定义的QL

              <queueReceiver>MESSQL</queueReceiver>

       </JMS>

       <!-- SMS Running Control 1 to run ,0 to stop -->

       <SYSControl>1</SYSControl>

</SMSConfig>

转载于:https://www.cnblogs.com/YvNin/archive/2010/11/19/YvNin.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值