.NET 使用 WMQ 连接Queue 发送 message 实例

1. 首先得下载客户端,没有客户端无法发送message. 安装好之后长这样 我装的是7.5

安装目录如下 tools/dotnet 目录中有演示的demo 

2.  .Net 连接MQ必须引用bin目录中的  amqmdnet.dll 因为他是创建Queuemanager  的核心库,

项目中引用using IBM.WMQ; 才不会报错. 引用amqmdnet 之后如果连接报错 可能缺少amqmdxcs.dll 则需要添加amqmdxcs.dll 在安装目录/bin64 目录可以找到该文件,我因为安装完就客户端,自动会将MQ所需的环境变量配置好,每次build完成后目录会多出来amqmdxcs.dll 文件,所以不需要再次引入

也可以Nuget安装IbmMqClient 包

3. 下面是演示代码:

using System;
using System.Collections;
using System.Configuration;
using System.Diagnostics;
using System.IO;
using System.Threading;
using IBM.WMQ;class MQInteractiveSender
{static readonly string QManager = ConfigurationManager.AppSettings["QManager"];static readonly string HostName = ConfigurationManager.AppSettings["HostName"];static void Main(){Console.Title = "IBM MQ 交互式消息发送器 (带配置默认值)";Console.WriteLine("=== MQ 交互式消息发送程序 ===");Console.WriteLine("注意:直接按Enter将使用配置的默认值\n");while (true){try{// 从配置读取默认值var defaults = new{Channel = ConfigurationManager.AppSettings["DefaultChannel"],Queue = ConfigurationManager.AppSettings["DefaultQueue"],XmlDir = ConfigurationManager.AppSettings["DefaultXmlDir"],XmlFile = ConfigurationManager.AppSettings["DefaultXmlFile"],Count = int.Parse(ConfigurationManager.AppSettings["DefaultMessageCount"]),Interval = int.Parse(ConfigurationManager.AppSettings["DefaultIntervalMs"])};// 用户输入参数(带配置默认值)Console.WriteLine("\n=== 新消息批次 ===");string channel = ReadInput("通道名称", defaults.Channel);string queueName = ReadInput("队列名称", defaults.Queue, true);string xmlDir = ReadInput("XML文件夹", defaults.XmlDir);string xmlFile = ReadInput("XML文件名", defaults.XmlFile);string xmlPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, xmlDir, xmlFile);int messageCount = ReadIntInput("发送次数", defaults.Count);int intervalMs = ReadIntInput("发送间隔(毫秒)", defaults.Interval);// 验证文件if (!File.Exists(xmlPath)){Console.WriteLine($"错误:XML文件不存在 - {xmlPath}");if (!AskYesNo("是否继续?(y/n)", true)) break;continue;}// 发送消息SendMessages(channel, queueName, xmlPath, messageCount, intervalMs);// 询问是否继续if (!AskYesNo("继续发送新消息?(y/n)", true)) break;}catch (Exception ex){Console.WriteLine($"发生错误: {ex.Message}");if (!AskYesNo("是否继续?(y/n)", true)) break;}}Console.WriteLine("\n程序已退出");}static void SendMessages(string channel, string queueName, string xmlPath, int count, int intervalMs){Hashtable mqProps = new Hashtable{[MQC.HOST_NAME_PROPERTY] = HostName,[MQC.CHANNEL_PROPERTY] = channel,[MQC.TRANSPORT_PROPERTY] = MQC.TRANSPORT_MQSERIES_CLIENT};string xmlContent = File.ReadAllText(xmlPath);string compressedXml = RemoveWhitespace(xmlContent);// 添加计时器Stopwatch stopwatch = new Stopwatch();long totalElapsedMs = 0;int successCount = 0;using (var qMgr = new MQQueueManager(QManager, mqProps))using (var queue = qMgr.AccessQueue(queueName, MQC.MQOO_OUTPUT)){for (int i = 0; i < count; i++){try{stopwatch.Restart();var msg = new MQMessage();msg.WriteString(compressedXml.Replace("{{SEQ}}", (i + 1).ToString()));queue.Put(msg, new MQPutMessageOptions());stopwatch.Stop();totalElapsedMs += stopwatch.ElapsedMilliseconds;successCount++;Console.WriteLine($"[{DateTime.Now:HH:mm:ss.fff}] 发送 {i + 1}/{count}" +$" | 本次耗时: {stopwatch.ElapsedMilliseconds}ms" +$" | 平均耗时: {totalElapsedMs / successCount}ms");if (i < count - 1 && intervalMs > 0)Thread.Sleep(intervalMs);}catch (MQException ex){stopwatch.Stop();Console.WriteLine($"[错误] 发送失败: {ex.ReasonCode} - {ex.Message}");}}}// 打印最终统计PrintStatistics(successCount, count, totalElapsedMs, intervalMs);}static void PrintStatistics(int success, int total, long totalMs, int intervalMs){Console.WriteLine("\n======== 发送统计 ========");Console.WriteLine($"成功发送: {success}/{total}");Console.WriteLine($"总耗时: {totalMs / 1000.0:F2}秒");if (success > 0){Console.WriteLine($"平均每条耗时: {totalMs / success}ms");Console.WriteLine($"纯发送速率: {success / (totalMs / 1000.0):F2} 条/秒");if (intervalMs > 0){double theoreticalMinTime = total * intervalMs / 1000.0;Console.WriteLine($"包含间隔的理论速率: {total / theoreticalMinTime:F2} 条/秒");}}Console.WriteLine("========================");}#region 输入辅助方法(带配置默认值支持)static string ReadInput(string prompt, string defaultValue, bool required = false){Console.Write($"{prompt} [默认: {defaultValue}]: ");string input = Console.ReadLine().Trim();if (string.IsNullOrEmpty(input)) return defaultValue;return input;}static int ReadIntInput(string prompt, int defaultValue, int? minValue = null, int? maxValue = null){while (true){Console.Write($"{prompt} [默认: {defaultValue}]: ");string input = Console.ReadLine().Trim();if (string.IsNullOrEmpty(input)) return defaultValue;if (int.TryParse(input, out int result)){if (minValue.HasValue && result < minValue.Value){Console.WriteLine($"不能小于 {minValue.Value}!");continue;}if (maxValue.HasValue && result > maxValue.Value){Console.WriteLine($"不能大于 {maxValue.Value}!");continue;}return result;}Console.WriteLine("请输入有效整数!");}}static bool AskYesNo(string question, bool defaultYes){string defaultText = defaultYes ? "y" : "n";Console.Write($"{question} [默认: {defaultText}]: ");string input = Console.ReadLine().Trim().ToLower();if (string.IsNullOrEmpty(input)) return defaultYes;return input.StartsWith("y");}static string RemoveWhitespace(string xml) =>System.Text.RegularExpressions.Regex.Replace(xml, @">\s+<", "><").Trim();#endregion
}

 4. 配置文件app.Config

<?xml version="1.0" encoding="utf-8" ?>
<configuration><appSettings><!-- MQ 连接默认参数 --><add key="DefaultChannel" value="SYSTEM.DEF.SVRCONN"/><add key="DefaultQueue" value="QUEUE_B"/><add key="DefaultXmlDir" value="Xml"/><add key="DefaultXmlFile" value="message.xml"/><!-- 发送设置默认参数 --><add key="DefaultMessageCount" value="1"/><add key="DefaultIntervalMs" value="100"/><!-- 其他配置 --><add key="QManager" value="QM"/><add key="HostName" value="localhost"/></appSettings>
</configuration>

IbmMqClient 代码片段 需要安装http://www.ikvm.net/ 并配置环境变量

    //配置MQ服务器连接参数MQEnvironment.hostname = HostName;MQEnvironment.port = Port;MQEnvironment.channel = ChannelName;//设置应用名称,方便服务器MQ 查看应用连接//MQEnvironment.properties.put(CommonConstants.USERID, "MQ Test By Java");mQQueueManager = new MQQueueManager(QmName);if (mQQueueSend == null)
{//mQQueueSend = mQQueueManager.accessQueue(queueName, com.ibm.mq.constants.CMQC.MQOO_OUTPUT);mQQueueSend = mQQueueManager.accessQueue(queueName, MQC.MQOO_OUTPUT);
}
MQMessage message = new MQMessage();
message.writeUTF(body);
mQQueueSend.put(message);

5.在WMQ客户端队列管理器QA->,右键创建队列QUEUE_A, 默认端口1414

6. 发送message 到QA channel 的队列的QUEUE_A 

遇到的错误及总结:

1.如果无法创建队列或者queue,请将本地用户添加到qmq组

2. WMQ 装完会默认配置java 环境变量,如果启动遇到failed to create jvm virtual machine 问题一定是原有的JAVA 环境变量 配置和WQM 冲突了或者顺序的原因,我本地是JAVA原有环境变量配置在了MQ_JAVA_LIB_PATH和MQ_JRE_PATH 之后导致,正确的是将JAVA_HOME 变量移动到MQ_开头相关的

3.如果启动代码报错2035 (07F3) (RC2035): MQRC_NOT_AUTHORIZED - IBM

则需要cmd 输入禁用授权规则

RUNMQSC QMALTER QMGR CHLAUTH(DISABLED)

或者在界面

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/75390.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

风电行业预测性维护解决方案:给风机装上 “智能医生”,实现故障 “秒级预警”

引言&#xff1a;风电设备故障为何成为 “运维黑洞”&#xff1f; 某海上风电场因齿轮箱轴承故障停机 3 天&#xff0c;直接损失 50 万元发电量。传统维护模式下&#xff0c;人工巡检覆盖率不足 40%&#xff0c;故障修复平均耗时 72 小时。而预测性维护通过物联网 AI 技术&am…

5、无线通信基站的FPGA实现架构

基站&#xff08;Base Station&#xff0c;BS&#xff09;&#xff0c;也称为公用移动通信基站&#xff0c;是无线电台站的一种形式&#xff0c;具体则指在一定的无线电覆盖区中&#xff0c;通过移动通信交换中心&#xff0c;与移动电话终端之间的信息传递的无线电收发信电台。…

笔记2——网络参考模型

一、OSI参考模型&#xff1a; 应用层&#xff1a; 报文 给应用程序提供接口 表示层&#xff1a; 进行数据格式的转换 会话层&#xff1a; 在通讯双方之间建立、管理和终止会话 传输层&#xff1a; 数据段&#xff1b;建立、维护、取消一次端到端的数据传输过程&#xff1b;控制…

最短路径:Bellman-Ford算法

Bellman-Ford的操作步骤 1.初始化距离&#xff1a;将起点的dist值设置为0&#xff0c;其他点的dist值设置为无穷大。 2.执行n-1轮松弛操作&#xff1a;遍历所有边&#xff0c;更新最短距离&#xff0c;收敛后可获得最短路径。 3.检测负权环&#xff1a;额外遍历一次&#xf…

0402-对象和类(访问器 更改器 日期类)

OOP&#xff1a;面向对象程序设计 类&#xff1a;构造对象的模板或蓝图 类构造对象的过程称为创建类的实例 封装&#xff1a;对外隐藏数据的真实实现方式&#xff0c;提供简单的方法 &#xff08;类比方向盘&#xff09; 对象&#xff1a;本质上是内存中的一小块空间 识别类&a…

【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的文件上传与下载:实现文件管理功能

<前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、开篇整…

搜索算法------DFS练习2

1. 题目 2. 思路和题解 从题目中可以看出&#xff0c;如果一个格子上有雨水&#xff0c;那么就可以流到周围比他高度低的单元格&#xff0c;如果单元格和海洋相邻&#xff0c;那么雨水也会流入海洋。总而言之一句话就是水从高处流向低处。从这里的流向可以联想到深度优先搜索这…

[python] 正则表达式

1.分割str s"1-2--3---4" are.findall(r\d|[-],s) # 输出&#xff1a;[1, -, 2, --, 3, ---, 4]s"-4(2(3)" # ? 表示 - 可以出现0次或1次 # \d 表示匹配一个或多个连续数字 # \D 表示匹配非数字字符 sre.findall(r-?\d|\D,s) # 输出&#xff1a;[-4, (,…

定制化管理系统与通用管理系统,谁更胜一筹?

一、定制化管理系统与通用管理系统的定义与特点 定制化管理系统 定制化管理系统是根据企业的具体业务需求和流程进行个性化开发的软件系统。它能够深度贴合企业的管理需求&#xff0c;提供高度灵活的解决方案。其特点包括&#xff1a; 高度适应性&#xff1a;能够精准匹配企业…

gitee 配置git上传

Git入门&#xff1f;查看 帮助 , Visual Studio / TortoiseGit / Eclipse / Xcode 下如何连接本站, 如何导入仓库 简易的命令行入门教程: Git 全局设置: 以 176fuguM2项目为例 git config --global user.name "堕落圣甲虫" git config --global user.email "11…

SpringBoot+Vue 中 WebSocket 的使用

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议&#xff0c;它使得客户端和服务器之间可以进行实时数据传输&#xff0c;打破了传统 HTTP 协议请求 - 响应模式的限制。 下面我会展示在 SpringBoot Vue 中&#xff0c;使用WebSocket进行前后端通信。 后端 1、引入 j…

STM32 FATFS - 在SDIO的SD卡中运行fatfs

参考文章 STM32CubeMX | SD Card FATFS - 知乎 [STM32F4]基于F407的硬件移植Free RTOSFATFS&#xff08;SDIO&#xff09;_freertosfatfs-CSDN博客 例程地址&#xff1a;STM32FatFS: 基于stm32的fatfs例程&#xff0c;配合博客文章 基于梁山派天空星开发板&#xff0c;STM3…

Java 进化之路:从 Java 8 到 Java 21 的重要新特性

Java 进化之路&#xff1a;从 Java 8 到 Java 21 的重要新特性 开篇介绍 在软件开发领域&#xff0c;Java 作为一门历史悠久且广泛应用的编程语言&#xff0c;始终保持着其核心竞争力和持续创新能力。自 Java 8 发布以来&#xff0c;Java 经历了一系列重要版本更新&#xff0…

Reactor 事件流 vs. Spring 事件 (ApplicationEvent)

Reactor 事件流 vs. Spring 事件 ApplicationEvent Reactor 事件流 vs. Spring 事件 (ApplicationEvent)1️⃣ 核心区别2️⃣ Spring 事件 (ApplicationEvent)✅ 示例&#xff1a;Spring 事件发布 & 监听1️⃣ 定义事件2️⃣ 发布事件3️⃣ 监听事件&#x1f539; 进阶&…

JVM生产环境问题定位与解决实战(六):总结篇——问题定位思路与工具选择策略

本文已收录于《JVM生产环境问题定位与解决实战》专栏&#xff0c;完整系列见文末目录 引言 在前五篇文章中&#xff0c;我们深入探讨了JVM生产环境问题定位与解决的实战技巧&#xff0c;从基础的jps、jmap、jstat、jstack、jcmd等工具&#xff0c;到JConsole、VisualVM、MAT的…

【5090d】配置运行和微调大模型所需基础环境【一】

RuntimeError: Failed to import transformers.integrations.bitsandbytes because of the following error (look up to see its traceback): No module named triton.ops 原因&#xff1a;是因为在导入 transformers.integrations.bitsandbytes 时缺少必要的依赖项 triton.op…

华为交换综合实验——VRRP、MSTP、Eth-trunk、NAT、DHCP等技术应用

一、实验拓扑 二、实验需求 1,内网Ip地址使用172.16.0.0/16分配 2,sw1和SW2之间互为备份 3, VRRP/STP/VLAN/Eth-trunk均使用 4,所有Pc均通过DHCP获取IP地址 5,ISP只能配置IP地址 6,所有电脑可以正常访问IsP路由器环回 三、需求分析 1、设备连接需求 二层交换机&#xff08;LS…

DeepSeek 开源的 3FS 如何?

DeepSeek 3FS&#xff08;Fire-Flyer File System&#xff09;是一款由深度求索&#xff08;DeepSeek&#xff09;于2025年2月28日开源的高性能并行文件系统&#xff0c;专为人工智能训练和推理任务设计。以下从多个维度详细解析其核心特性、技术架构、应用场景及行业影响&…

Qt实现HTTP GET/POST/PUT/DELETE请求

引言 在现代应用程序开发中&#xff0c;HTTP请求是与服务器交互的核心方式。Qt作为跨平台的C框架&#xff0c;提供了强大的网络模块&#xff08;QNetworkAccessManager&#xff09;&#xff0c;支持GET、POST、PUT、DELETE等HTTP方法。本文将手把手教你如何用Qt实现这些请求&a…

echarts+HTML 绘制3d地图,加载散点+散点点击事件

首先&#xff0c;确保了解如何本地引入ECharts库。 html 文件中引入本地 echarts.min.js 和 echarts-gl.min.js。 可以通过官网下载或npm安装&#xff0c;但这里直接下载JS文件更简单。需要引入 echarts.js 和 echarts-gl.js&#xff0c;因为3D地图需要GL模块。 接下来是HTM…