JAVA 远程连接Msmq
踩了不少坑,特此记录一下
最近做了个项目,其中需从一台服务器连接到另一台服务,从上面的msmq中取出数据。百度了一下写法,试过之后发现只能在本地操作,即只能读写本地计算机上的msmq信息,远程到其他机器会报出“远程计算机不可用(MQ_ERROR_REMOTE_MACHINE_NOT_AVAILABLE)”错误,现将解决此错误的方法在此说明。
首先我们需要在目标计算机上安装MSMQ,具体做法不再赘述,直接百度即可。
然后右键我的电脑点击管理,找到消息队列,右键点击属性
把所有挑了√的都取消,一个也不用挑。
然后后我们需要在上面创建一个私有队列
如图建立了一个专用队列test,右键test属性,点击安全
为三个用户追加权限,都点完全控制
然后打开注册表,找到MSMQ,在parameters下的security中添加AllowNonauthenticatedRpc和NewRemoteReadServerDenyWorkgroupClient,值都为1
之后我们需要两个组件,MsmqJava.dll,MsmqJava.jar
将MsmqJava.dll放入项目根目录,jar正常引入。
然后废话不多说,直接上代码:
向MSMQ发送信息
public class test {
static {
System.loadLibrary("MsmqJava");
}
public static void main(String[] args) {
try {
// 192.168.1.110为远程计算机的IP地址
// private$\\test是队列名字
String fullname = "DIRECT=tcp:192.168.1.110\\private$\\test";
Queue queue = new Queue(fullname);
// 标题
String label = "testmessage";
// 内容
String body = "this is a test message";
String correlationId = "001";
// 创建消息
Message msg = new Message(body, label, correlationId);
// 发送
queue.send(msg);
queue.close();
} catch (MessageQueueException ex1) {
ex1.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
读取MSMQ中的信息
public class test {
static {
System.loadLibrary("MsmqJava");
}
public static void main(String[] args) {
try {
String fullname = "DIRECT=tcp:192.168.1.110\\private$\\test";
Queue queue = new Queue(fullname);
Message message = queue.peek();//receive()也可以用这个方法读取,读取完此条信息在队列中消失
System.out.println("获取地址192.168.1.110远程MSMQ信息成功,message:"+new String(message.getBody(),"utf-8"));
System.out.println( System.getProperty("java.library.path"));
queue.close();
} catch (MessageQueueException ex1) {
ex1.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
这种方法也有个很大的问题,不能够枚举,每次只能读出一条数据,想尝试一下重构,希望哪位懂C++的大哥可以帮助一下。