本节说明Java通过IBM WebSphere MQ连接.Net(调用dll)实现方法及主要代码,如下:
1. 下载安装IBM WebSphere MQ(本例使用的是v7.0三个月试用版)。
2. 打开WebSphere MQ资源管理器,新建队列管理器(如名为MQSI_SAMPLE_QM),侦听端口号:1415,其
它默认;在刚建的队列管理器MQSI_SAMPLE_QM下新建本地队列(如名为LQ),其它默认;在队列管理器
MQSI_SAMPLE_QM下的“高级”-“通道”中新建服务器连接通道(如名为TestChannel),其它默认(如果
要传输大数据,需修改通道的最大消息长度,修改步骤:在IBM WebSphere MQ资源管理器左侧窗口部分依
次点击“队列管理器”-通道所在的队列管理器名MQSI_SAMPLE_QM-高级-通道,在右侧显示的通道列表中
双击要修改的通道所在行以打开通道属性对话框,在“扩展”中修改最大消息长度)。
3. 新建C#应用程序,将WebSphere MQ安装目录下的bin/amqmdnet.dll添加引用到项目中。
C#关键代码如下:
注意:MQ需引用包 IBM.WMQ;
using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using System.IO;
using IBM.WMQ;
namespace TestWebSphere
{
public class TestMqClass
{
public void sendMessageByMQ()
{
string qManager = "MQSI_SAMPLE_QM"; //队列管理器名
string qName = "LQ";//队列名
MQEnvironment.Hostname = "127.0.0.1"; //所在IP
MQEnvironment.Channel = "TestChannel"; //通道名
MQEnvironment.Port = 1415; //侦听端口号
try
{
MQQueueManager qm = new MQQueueManager(qManager);
int openOptions = MQC.MQOO_OUTPUT | MQC.MQOO_FAIL_IF_QUIESCING;
MQQueue testQueue = qm.AccessQueue(qName, openOptions);
//发送部分
MQMessage message = new MQMessage();
//队列管理器自动实现的消息分片
message.MessageFlags = MQC.MQMF_SEGMENTATION_ALLOWED;
// message.WriteUTF("这个是从.Net发的消息");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10; i++)
{
sb.Append(i + ",");
sb.Append("aa" + i + ",");
sb.Append("bb" + i + ",");
}
message.Write(System.Text.Encoding.ASCII.GetBytes(sb.ToString()));
MQPutMessageOptions pmo = new MQPutMessageOptions();
testQueue.Put(message, pmo);
testQueue.Close();
qm.Disconnect();
}
catch (Exception e)
{
Console.WriteLine(e.StackTrace);
}
}
}
}
main方法中:
TestMqClass test = new TestMqClass();
test.sendMessageByMQ();
System.Console.WriteLine("传输完成");
//System.Console.Read();
4. 新建project,添加WebSphere MQ jar包(位于WebSphere MQ安装目录下java/lib文件夹中,根据不同
需要添加的包也不同);
本例添加的包有:com.ibm.mq.jar、com.ibm.mq.jmqi.jar、com.ibm.mq.commonservices.jar、
com.ibm.mq.header.jar、com.ibm.mq.pcf.jar。
java关键代码如下:
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 TestMQ {
public static void main(String[] args) {
TestMQ test = new TestMQ();
test.test();
}
public void test(){
String qManager = "MQSI_SAMPLE_QM"; //QueueManager name
String qName = "LQ";//Queue Name
try {
//configure connection parameters
MQEnvironment.hostname="127.0.0.1";//MQ Server name or IP
MQEnvironment.port=1415;//listenr port
MQEnvironment.channel="TestChannel";//Server-Connection Channel Name
MQEnvironment.CCSID =1381; //似乎是Windows下需用1381,记不太清了
MQQueueManager qMgr = new MQQueueManager(qManager);
int openOptions = MQC.MQOO_INPUT_SHARED | MQC.MQOO_FAIL_IF_QUIESCING;
MQQueue queue = qMgr.accessQueue(qName, openOptions);
//接收部分
MQMessage rcvMessage = new MQMessage();
MQGetMessageOptions gmo = new MQGetMessageOptions();
//分片消息接收时指定
gmo.options = MQC.MQGMO_COMPLETE_MSG;
queue.get(rcvMessage, gmo);
// String msgText = rcvMessage.readUTF();
// System.out.println("The UTF message is: " + msgText);
byte[] b = new byte[rcvMessage.getMessageLength()];
rcvMessage.readFully(b);
String str = new String(b);
List<User> users = new ArrayList<User>(); //user类只有三个属性,从循环
中可以看出有哪些
String[] array = str.split(",");
for (int i = 0; i < array.length; i+=3) {
if(array[i].length() > 0){
User user = new User();
user.setUserId(Integer.parseInt(array[i]));
user.setUserName(array[i + 1]);
user.setPassword(array[i + 2]);
users.add(user);
}
}
System.out.println(users.size());
queue.close();
qMgr.disconnect();
} catch (MQException ex) {
ex.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
5. 运行C#程序发送消息到通道中;
6. 运行java程序接收消息并在控制台输出。