JAVA 远程连接Msmq

时间:2024-03-20 12:56:48

JAVA 远程连接Msmq

踩了不少坑,特此记录一下

最近做了个项目,其中需从一台服务器连接到另一台服务,从上面的msmq中取出数据。百度了一下写法,试过之后发现只能在本地操作,即只能读写本地计算机上的msmq信息,远程到其他机器会报出“远程计算机不可用(MQ_ERROR_REMOTE_MACHINE_NOT_AVAILABLE)”错误,现将解决此错误的方法在此说明。

首先我们需要在目标计算机上安装MSMQ,具体做法不再赘述,直接百度即可。

然后右键我的电脑点击管理,找到消息队列,右键点击属性

JAVA 远程连接Msmq
把所有挑了√的都取消,一个也不用挑。

然后后我们需要在上面创建一个私有队列JAVA 远程连接Msmq
如图建立了一个专用队列test,右键test属性,点击安全
JAVA 远程连接Msmq
为三个用户追加权限,都点完全控制
然后打开注册表,找到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++的大哥可以帮助一下。