Linux+上的+WebSphere+MQ+开发详细讲解

  • 格式:doc
  • 大小:125.50 KB
  • 文档页数:15

Linux 上的WebSphere MQ 开发快速入门级别:中级软件架构师, IBM2009 年2 月05 日本文将通过用于向队列发送消息和从队列接收消息的示例应用程序说明如何在Linux 上着手安装和配置WebSphere MQ,以及如何为MQ 环境开发Java 应用程序。

引言本文的目标是让您轻松实现Linux® 上的IBM® WebSphere® MQ 入门。

由于大部分Linux 服务器并没有图形用户界面,因此本文将说明如何使用命令行工具在Linux 上安装和配置WebSphere MQ。

本文将说明如何使用WebSphere MQ Java API 创建两个示例Java™ 应用程序:MQSend(用于向队列发送消息)和MQGet(用于从队列接收消息)。

先决条件∙WebSphere MQ V6 安装包。

∙一台或两台安装了Linux 的计算机。

本文使用两台安装了Suse Linux Enterprise Server V9 的计算机,不过也可以在一台计算机上完成所有工作。

∙Linux 管理技能。

∙Java 开发方面的经验将有所帮助,但并非必须的,因为我们提供了经过预编译的Java 示例应用程序供下载和在命令行使用。

WebSphere MQWebSphere MQ 提供了连接层和应用程序的可靠集成,为SOA 提供了所需的基础。

WebSphere MQ 的主要特色功能包括:有保证的消息交付基于可靠队列的消息传递,可确保消息不会丢失或重复。

基于标准的开发使用Java Message Service (JMS) API 和Message Queue Interface (MQI)。

端到端安全使用安全套接字层(Secure Sockets Layer,SSL)进行身份验证、消息完整性检查和数据加密。

Web 服务支持用于保证Web 服务传输和可靠性的简单对象访问协议(Simple Object AccessProtocol,SOAP)。

异步处理对应用程序进行分离,以支持进行独立于时间的处理。

多平台支持支持80 种以上的配置。

有关WebSphere MQ 的更多信息,请参见本文结尾的参考资料。

安装WebSphere MQ安装WebSphere MQ 的过程非常简单——直接将安装包释放到目录中即可(本文使用root 主目录下的mq_install)。

可以安装RPM 安装包中的所有内容,但本文仅需要这部分东西。

以下是WebSphere MQ V6 中包括的包和目录:IBMJava2-SDK-1.4.2-0.0.i386.rpmMQSeriesClient-6.0.0-0.i386.rpmMQSeriesConfig-6.0.0-0.i386.rpmMQSeriesFTA-6.0.0-0.i386.rpmMQSeriesIES30-6.0.0-0.i386.rpmMQSeriesJava-6.0.0-0.i386.rpmMQSeriesKeyMan-6.0.0-0.i386.rpmMQSeriesMan-6.0.0-0.i386.rpmMQSeriesMsg_Zh_CN-6.0.0-0.i386.rpmMQSeriesMsg_Zh_TW-6.0.0-0.i386.rpmMQSeriesMsg_de-6.0.0-0.i386.rpmMQSeriesMsg_es-6.0.0-0.i386.rpmMQSeriesMsg_fr-6.0.0-0.i386.rpmMQSeriesMsg_it-6.0.0-0.i386.rpmMQSeriesMsg_ja-6.0.0-0.i386.rpmMQSeriesMsg_ko-6.0.0-0.i386.rpmMQSeriesMsg_pt-6.0.0-0.i386.rpmMQSeriesRuntime-6.0.0-0.i386.rpmMQSeriesSDK-6.0.0-0.i386.rpmMQSeriesSamples-6.0.0-0.i386.rpmMQSeriesServer-6.0.0-0.i386.rpmMQSeriesTXClient-6.0.0-0.i386.rpmPreReqsREADMEscopyrightgsk7bas-7.0-3.15.i386.rpmlaplicenses下面是安装步骤:1. 设置Linux 服务器。

本文使用主机名WMQ1和WMQ2。

WMQ1的IP 地址为192.168.28.71,WMQ2的IP 地址为192.168.28.72。

2. 安装WebSphere MQ 前,必须执行./mqlicense.sh,以阅读和接受许可证。

3. 安装所需的MQ 包及WebSphere MQ Java 和IBM Java SDK 包,以便为WebSphere MQ 开发Java 客户机:WebSphere MQ 现在已经完成安装,并有用于进行配置的名为mqm 的用户和组。

缺省情况下,WebSphere MQ 安装在/opt/mqm 中,队列和其他配置信息位于用户mqm 的主目录中。

Java SDK 安装在/opt/IBMJava2-142 中,Java 解释程序位于/opt/IBMJava2-142/bin 中。

下一步是进行配置。

本文为两台计算机使用了具有本地和远程队列的单个队列管理器,用于测试示例应用程序。

配置WebSphere MQ∙创建队列管理器。

∙启动队列管理器。

∙创建队列和通道。

∙启动命令服务器、侦听器和通道。

两台WebSphere MQ 计算机都需要执行这些步骤。

下面的部分将仅说明如何在WMQ1 上进行配置,但在WMQ2 上也需要进行这些步骤。

创建并启动队列管理器使用root 登录到WMQ1,然后键入su - mqm,以更改到用户mqm。

使用以下命令为WMQ1 计算机创建队列管理器:使用以下命令启动队列管理器。

创建队列和通道使用命令行工具配置WebSphere MQ。

以下给出了WMQ1 的配置脚本。

此脚本定义本地队列、远程队列、传输队列、发送方通道和接收方通道。

将以下脚本保存为WMQ1QM.conf:USAGE(XMITQ) +TRIGGER +TRIGTYPE(FIRST) +TRIGDPTH(1) +TRIGDATA('WMQ1QM.WMQ2QM') +INITQ('SYSTEM.CHANNEL.INITQ') +REPLACEDEFINE QREMOTE ('WMQ1OutputQ') + XMITQ('WMQ2QMXmitQ') +RNAME('WMQ2InputQ') +RQMNAME('WMQ2QM') +REPLACEDEFINE CHANNEL ('WMQ1QM.WMQ2QM') CHLTYPE(SDR) +TRPTYPE(TCP) + CONNAME('192.168.28.72(1414)') +XMITQ('WMQ2QMXmitQ') +REPLACEDEFINE CHANNEL ('WMQ2QM.WMQ1QM') CHLTYPE(RCVR) +TRPTYPE(TCP) +REPLACEDEFINE CHANNEL('SYSTEM.ADMIN.SVRCONN') CHLTYPE(SVRCONN) +TRPTYPE(TCP) +DESCR(' ') +HBINT(300) +MAXMSGL(4194304) +MCAUSER('MUSR_MQADMIN') +上面的配置脚本可作为其他WebSphere MQ 安装的模版使用。

只需要更改粗体部分的名称,即可在其他WebSphere MQ 安装中设置队列和通道。

此配置脚本中包含大量条目——有关它们的更多信息,请参见WebSphere MQ 信息中心。

使用以下命令创建队列和通道,以配置WebSphere MQ:runmqsc 命令用于发出WebSphere MQ 命令。

在本例中,这些命令从WMQ1QM.conf 文件读取,而输出被定向到qcreate.log。

打开qcreate.log,验证其中不存在语法错误,全部有效命令均得到了处理。

启动服务需要启动命令服务器、侦听器和通道,然后就可以进行示例应用程序的部署和测试工作了。

验证队列管理器和侦听器在两台计算机上运行,然后启动通道:现在已经安装了WebSphere MQ,并进行了配置,已准备好可以进行测试了。

下面一部分将给出两个基于Java 的应用程序的源代码,分别用于向队列发送消息和从队列接收消息。

示例应用程序用于将消息放入队列中(MQSend) 和从队列获取消息(MQGet) 的示例Java 应用程序可使用前面部分中定义的队列。

这些应用程序支持String 消息,旨在用于测试和作为说明如何从Java 应用程序使用WebSphere MQ 的示例。

可以从脚本使用应用程序,包括各种类型的应用程序。

MQSend 和MQGet 都从MQConnector 类进行扩展,该类可提供WebSphere MQ 连接、初始化WebSphere MQ、打开和关闭队列,向队列发送消息及从队列接收消息。

MQConnectorMQConnector 是用于进行发送和获取操作的超类。

该类处理打开连接和发送及获取消息的工作。

将使用属性文件对其进行配置,需要在属性文件中指定主机地址、队列管理器名称和队列名称:以下是MQConnector 源代码:package mqconn;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.util.Properties;import com.ibm.mq.MQC;import com.ibm.mq.MQEnvironment;import com.ibm.mq.MQException;import com.ibm.mq.MQGetMessageOptions;import com.ibm.mq.MQMessage;import com.ibm.mq.MQPutMessageOptions;import com.ibm.mq.MQQueue;import com.ibm.mq.MQQueueManager;public class MQConnector{protected String qManager = ""; // define name of queue manager protected String qManagerHost = "";protected String queuName = ""; // define name of queueprotected MQQueue mqQueue;protected MQQueueManager qMgr;public static boolean DEBUG = true;public MQConnector(){}public void initMq(){try{FileInputStream fis = new FileInputStream(newFile("mqconnect.properties"));Properties props = new Properties();props.load(fis);fis.close();qManager = props.getProperty("queue.manager");qManagerHost = props.getProperty("queue.manager.host");queuName = props.getProperty("");// Create a connection to the queue managerMQEnvironment.channel = "SYSTEM.DEF.SVRCONN";MQEnvironment.hostname = qManagerHost;debug("Connecting to QueueManager " + qManager + " on " + qManagerHost);qMgr = new MQQueueManager(qManager);}catch (Exception e){e.printStackTrace();}}public void openQueue() throws MQException{// Set up the options on the queue we wish to open...// Note. All WebSphere MQ Options are prefixed with MQC in Java. int openOptions = MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_OUTPUT;// Now specify the queue that we wish to open,// and the open options...debug("Opening queue: " + queuName);try{mqQueue = qMgr.accessQueue(queuName, openOptions);}catch(MQException mqe){//check if MQ reason code 2045//means that opened queu is remote and it can not be opened as //input queue//try to open as output onlyif(mqe.reasonCode==2045){openOptions = MQC.MQOO_OUTPUT;mqQueue = qMgr.accessQueue(queuName, openOptions);}}}public void putMessageToQueue(String msg) throws MQException {try{debug("Sending message: " + msg);MQPutMessageOptions pmo = new MQPutMessageOptions();MQMessage mqMsg = new MQMessage();mqMsg.write(msg.getBytes());// put the message on the queuemqQueue.put(mqMsg, pmo);}catch (IOException e){e.printStackTrace();}}public String getMessageFromQueue() throws MQException{try{MQMessage mqMsg = new MQMessage();MQGetMessageOptions gmo = new MQGetMessageOptions();// Get a message from the queuemqQueue.get(mqMsg,gmo);//Extract the message dataint len=mqMsg.getDataLength();byte[] message = new byte[len];mqMsg.readFully(message,0,len);return new String(message);}catch(MQException mqe){int reason=mqe.reasonCode;if(reason==2033)//no messages{return null;}else{throw mqe;}}catch (IOException e){e.printStackTrace();return null;}}public void closeQueue() throws MQException{debug("Closing queue and disconnecting QueueManager...");// Close the queue...mqQueue.close();// Disconnect from the queue managerqMgr.disconnect();}protected boolean hasArg(String arg, String[] args){for(int i=0;i<args.length;i++){if(args[i].equals(arg)){return true;}}return false;}public void debug(Object msg){if (DEBUG)该类向其他应用程序提供WebSphere MQ 功能。