前提:客户端是Windows XP,通过JMS编程实现MQ,MQ服务器端已配置
一、MQ客户端配置
- 安装MQ客户端:IBM MQSeries Client
- 设置环境变量配置环境变量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>