JAVA操作微软消息队列(MSMQ),发送和接收消息(含工程源码和所需文件)

目录

  • 前言
  • 正文
    • MSMQ消息队列安装与管理
    • 创建消息队列
    • 下载msmqJava所需的jar包和dll文件
    • 工程创建、代码编写
      • 项目文件分解
      • 代码详解
    • 调试期间出现的一些异常错误
  • 结尾

前言

本人技术小白一个,前几天因为和第三方公司对接接口(C#),他们提出了腰是要MSMQ消息队列,因为是第一次接触,一开始不知所以然,后来找了很多资料,也在播客上看到了其他博主的文章,尝试写了一下,后来发现有些错误根本没人提或者没人回答,导致我们这些新手无从下手,后来自己硬着头皮上了,现在我把这经验分享一下,希望可以帮到其他有需要的人,这也是我的第一篇博文,文采不好,请多包涵。
系统:win10
IDE:MyEclipse
jdk:1.7

正文

MSMQ消息队列安装与管理

本人使用的是win10

1、安装消息队列
执行用户必须要有本地 Administrators 组中的成员身份,或等效身份。
具体步骤:
开始—》设置(左下角齿轮)—》(搜索)控制面板—》程序—》程序和功能—》打开或关闭Windows功能—》依次展开Microsoft Message Queue (MSMQ) 服务器、Microsoft Message Queue (MSMQ) 服务器核心—》确定
如果系统提示您重新启动计算机,请单击“确定”以完成安装。
2、管理消息队列
开始—》右键—》计算机管理—》服务和应用程序—》消息队列。

创建消息队列

按照以下操作完成创建:

JAVA操作微软消息队列(MSMQ),发送和接收消息(含工程源码和所需文件)_第1张图片
JAVA操作微软消息队列(MSMQ),发送和接收消息(含工程源码和所需文件)_第2张图片
这个是队列的名称,待会代码里需要用到
JAVA操作微软消息队列(MSMQ),发送和接收消息(含工程源码和所需文件)_第3张图片
这个在本机测试的时候可以全部开启权限

JAVA操作微软消息队列(MSMQ),发送和接收消息(含工程源码和所需文件)_第4张图片

下载msmqJava所需的jar包和dll文件

官网下载:下载所需文件-----MsmqJava

CSDN下载:下载所需文件-----内含代码示例、jar、dll

官网下载里面有源码,但是缺少了TransactionType.java文件,可以使用里面的C代码打包成DLL,但是我自己是打不成功,哈哈哈

JAVA操作微软消息队列(MSMQ),发送和接收消息(含工程源码和所需文件)_第5张图片

工程创建、代码编写

创建工程,下面图显示有很多相同的dll和jar包,待会我会解释,请往下看

JAVA操作微软消息队列(MSMQ),发送和接收消息(含工程源码和所需文件)_第6张图片

项目文件分解

1.ionic.Msmq包
这个下面的是jar包里面的源码,其中Queue.java这个类我修改过他初始化的代码,这个是我看到官网论坛下有某位大神提出来的修改意见后进行修改打包出来的jar包,修改了他初始化的代码,请看下图:

JAVA操作微软消息队列(MSMQ),发送和接收消息(含工程源码和所需文件)_第7张图片

2.test包
看到上面的lib文件夹,里面有两个jar包,第一个MsmqJava.jar包是原封不动的源码包,第二个MsmqJavaModify.jar包,这个就是我修改后打包出来的。
3.lib里面的jar包
SimpleSendMSMQ.java 发送消息类
SimpleReceiveMSMQ.java 接收消息类
4.dll文件
可以看到项目根目录有一个MsmqJava.dll和MsmqJava64.dll文件,以及lib文件夹里面也有一个MsmqJava64.dll、MsmqJava32.dll文件,MsmqJava.dll和MsmqJava64.dll这两个都是一样的dll,都是64位的dll,只是名称不同,MsmqJava32.dll这个是32位的dll。
分别解释一下,MsmqJava64.dll文件用于我修改后初始化参数的DLL名称,如果使用原源码里初始化的方法就用MsmqJava.dll文件,可以上面的图片中看出,lib文件夹下面的MsmqJava64.dll,我是为了测试初始化时加载路径才放进去的,待会有截图可看,顺便讲一下System.load和System.loadLibrary的不同:
System.load—参数必须为库文件的绝对路径,可以是任意路径。
System.loadLibrary—参数为库文件名,不包含库文件的扩展名。
System.load(String filename)—JDK API的描述是“从作为动态库的本地文件系统中以指定的文件名加载代码文件。文件名参数必须是完整的路径名。”,因此这个方法的参数必须是要加载的文件的完整路径,带文件后缀名。
System.loadLibrary(String libname)—JDK API的描述是"加载由libname参数指定的系统库,不带后缀名。系统库指的是java.library.path,是映射到本地系统的路径。
简单来说就是System.load放的参数是完整的文件路径,而System.loadLibrary放的参数就是文件名而且是不带后缀的,这个文件可以放在java.library.path的路径,不知道的可以输入下面这段代码查看
    System.out.println(System.getProperty("java.library.path"));

当然,你可以选择将文件放在项目的根目录下,这样也能加载到。

代码详解

  • Queue.java 里面的初始化函数
// --------------------------------------------
   // static initializer
   //这个是源码原有的,他是使用MsmqJava.dll
//    static {
//        System.loadLibrary("MsmqJava");
//        nativeInit();
//    }
//以下的是我修改后的,使用MsmqJava64.dll,这两个 dll其实是一样的 只是名字不一样而已,都是64位的dll
   private static boolean initialised = false ;
   public static void initSystemLibraries(String ... libs) {
   	if(initialised){ return; }
       if(libs.length == 0){
           System.loadLibrary("MsmqJava64");
       } else {
            for(String f : libs){
               System.load(f);
           }
       }
       nativeInit();
       initialised = true;
   }
  • SimpleSendMSMQ.java 发送消息类
package test;

import ionic.Msmq.Message;
import ionic.Msmq.MessageQueueException;
import ionic.Msmq.Queue;

public class SimpleSendMSMQ {
   
   //如使用原源码包,需使用此方法初始化
//	static{
//		System.loadLibrary("MsmqJava64");
//	}

   public static void main(String[] args) {
   	try {
   		//初始化指定目录下的dll
//			Queue.initSystemLibraries("E:\\Workspaces\\TestMSMQ\\lib\\MsmqJava64.dll");
   		//初始化 dll放在项目根目录下,可以使用此函数初始化,可以不含路径
   		Queue.initSystemLibraries();
   		
   		//192.168.1.100为本机的IP地址(经测试不能使用127.0.0.1,不然会报错)
   		//private$\\testmessage是队列名字
   		String fullname="direct=tcp:192.168.1.100\\private$\\testmessage";
   	     
   		Queue queue = new Queue(fullname);
   	     //标题
   	     String label="testSend";
   	     //内容
   	     String body= "Hello, World!";
   	     //这个属性没搞清楚是什么
   	     String correlationId = "123"; 
//		     byte[] correlationId = { 0, 2, 4, 6, 8, 9 };
   	     //创建消息
   	     Message msg = new Message(body, label, correlationId);
//		     System.out.println("发送消息[label={}, body={}]:" + msg.getLabel() + "," + msg.getBodyAsString());
   	     queue.send(msg);
   	 }
   	 catch (MessageQueueException ex1) {
   	     System.out.println("Put failure: " + ex1.toString());
   	     ex1.printStackTrace();
   	 } catch (Exception e) {
   		e.printStackTrace();
   	}
   }
}

JAVA操作微软消息队列(MSMQ),发送和接收消息(含工程源码和所需文件)_第8张图片

SimpleReceiveMSMQ.java 接收消息类

package test;

import ionic.Msmq.Message;
import ionic.Msmq.MessageQueueException;
import ionic.Msmq.Queue;

public class SimpleReceiveMSMQ {
	
	//元原源码包使用此方法初始化
//	static{
//		System.loadLibrary("MsmqJava64");
//	}
	
	public static void main(String[] args) {
		try {
			//初始化指定目录
			Queue.initSystemLibraries("E:\\Workspaces\\TestMSMQ\\lib\\MsmqJava64.dll");
			//初始化 dll放在项目根目录下,可以使用此函数初始化,可以不含路径
//			Queue.initSystemLibraries();
			//发送用的是无参数的,接收用的是有路径参数的,这两个都尝试一下
			
			//192.168.1.100为本机的IP地址(经测试不能使用127.0.0.1,不然会报错)
			//private$\\testmessage是队列名字
			String fullname="direct=tcp:192.168.1.100\\private$\\testmessage";
		     Queue queue= new Queue(fullname);
		     Message message=queue.receive();
		     //这里就是回复的内容
		     System.out.println(message.getBodyAsString());
		 }
		 catch (MessageQueueException ex1) {
		     System.out.println("Put failure: " + ex1.toString());
		     ex1.printStackTrace();
		 } catch (Exception e) {
			e.printStackTrace();
		}
	}
}

JAVA操作微软消息队列(MSMQ),发送和接收消息(含工程源码和所需文件)_第9张图片

以上就是简单的代码,有点乱,自己整理一下就可以了。

调试期间出现的一些异常错误

  • 没有初始化加载dll
    没有初始化加载dll
  • 找不到dll
    JAVA操作微软消息队列(MSMQ),发送和接收消息(含工程源码和所需文件)_第10张图片
  • 接收消息时,没有消息会抛出异常
    JAVA操作微软消息队列(MSMQ),发送和接收消息(含工程源码和所需文件)_第11张图片
  • dll是32位的,系统是64位的
    JAVA操作微软消息队列(MSMQ),发送和接收消息(含工程源码和所需文件)_第12张图片
  • 自己打包出来的dll报错,dll编译有错误
    JAVA操作微软消息队列(MSMQ),发送和接收消息(含工程源码和所需文件)_第13张图片
    多数异常是由于DLL引起的,所以要检查好DLL

结尾

OK就这样大功告成,文中有下载地址,可直接下载项目查看。

你可能感兴趣的:(java后端技术)