我是IBM Websphere MQ的新手
我正在尝试将消息添加到远程websphere MQ队列管理器。我在尝试连接时遇到错误。
此外,我已经尝试过在论坛中提供的许多可能的解决方案,例如将.net框架更改为3.5,我在ping远程计算机时遇到了良好的ping但我无法使用C#代码连接到它。队列管理器侦听器已启动并正在运行,但这是我得到的错误
2538 - MQRC_HOST_NOT_AVAILABLE
尝试这样做。
queueManager = new MQQueueManager();
我正在使用.net framework 4.5。任何帮助将不胜感激。
答案 0 :(得分:1)
MQRC_HOST_NOT_AVAILABLE
可能意味着您的客户端无法找到您告诉它要查找的队列管理器。鉴于你已经说过你的代码是
queueManager = new MQQueueManager();
我怀疑你没有告诉你的.NET需要知道的一些关键信息才能找到队列管理器。为了将MQ客户端连接到队列管理器,它需要知道
对于.NET,这些可以通过knowledge center doc on the MQQueueManager clas s。
中详述的不同方式提供从该页面可以看到连接到队列管理器的示例代码:
MQEnvironment.hostname =" fred.mq.com&#34 ;; //主持人连接
MQEnvironment.port = -1; //连接的端口。如果未设置,则对于WebSphereMQ客户端连接,此缺省值为1414。
MQEnvironment.channel =" channel.name&#34 ;; //队列管理器上的SVRCONN通道的CASE-SENSITIVE名称
MQQueueManager qMgr = new MQQueueManager(" MYQM");
另请注意,创建MQQueueManager的调用也会使用一个参数,该参数是连接到的队列管理器的名称。
检查您是否提供了客户端需要连接的所有必要信息,包括队列管理器的名称。如果它仍然失败,那么检查队列管理器的日志以查找任何错误消息(如果没有客户端真的没有到达队列管理器,否则错误消息将说明为什么队列管理器不是&# 39;没有回应)
答案 1 :(得分:1)
请不要使用MQEnvironment类,因为它不是线程安全的。将所有信息放在Hashtable中并将Hashtable传递给MQQueueManager类要好得多。以下是使用Hashtable for MQ连接信息的MQ .NET托管模式示例:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using IBM.WMQ;
namespace MQTest02
{
class MQTest02
{
private Hashtable inParms = null;
private Hashtable qMgrProp = null;
private System.String qManager;
private System.String outputQName;
/*
* The constructor
*/
public MQTest02()
: base()
{
}
/// <summary> Make sure the required parameters are present.</summary>
/// <returns> true/false
/// </returns>
private bool allParamsPresent()
{
bool b = inParms.ContainsKey("-h") && inParms.ContainsKey("-p") &&
inParms.ContainsKey("-c") && inParms.ContainsKey("-m") &&
inParms.ContainsKey("-q");
if (b)
{
try
{
System.Int32.Parse((System.String)inParms["-p"]);
}
catch (System.FormatException e)
{
b = false;
}
}
return b;
}
/// <summary> Extract the command-line parameters and initialize the MQ variables.</summary>
/// <param name="args">
/// </param>
/// <throws> IllegalArgumentException </throws>
private void init(System.String[] args)
{
inParms = Hashtable.Synchronized(new Hashtable());
if (args.Length > 0 && (args.Length % 2) == 0)
{
for (int i = 0; i < args.Length; i += 2)
{
inParms[args[i]] = args[i + 1];
}
}
else
{
throw new System.ArgumentException();
}
if (allParamsPresent())
{
qManager = ((System.String)inParms["-m"]);
outputQName = ((System.String)inParms["-q"]);
qMgrProp = new Hashtable();
qMgrProp.Add(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_MANAGED);
qMgrProp.Add(MQC.HOST_NAME_PROPERTY, ((System.String)inParms["-h"]));
qMgrProp.Add(MQC.CHANNEL_PROPERTY, ((System.String)inParms["-c"]));
try
{
qMgrProp.Add(MQC.PORT_PROPERTY, System.Int32.Parse((System.String)inParms["-p"]));
}
catch (System.FormatException e)
{
qMgrProp.Add(MQC.PORT_PROPERTY, 1414);
}
if (inParms.ContainsKey("-u"))
qMgrProp.Add(MQC.USER_ID_PROPERTY, ((System.String)inParms["-u"]));
if (inParms.ContainsKey("-x"))
qMgrProp.Add(MQC.PASSWORD_PROPERTY, ((System.String)inParms["-x"]));
if (inParms.ContainsKey("-s"))
qMgrProp.Add(MQC.SECURITY_EXIT_PROPERTY, ((System.String)inParms["-s"]));
System.Console.Out.WriteLine("MQTest02:");
Console.WriteLine(" QMgrName ='{0}'", qManager);
Console.WriteLine(" Output QName ='{0}'", outputQName);
System.Console.Out.WriteLine("QMgr Property values:");
foreach (DictionaryEntry de in qMgrProp)
{
Console.WriteLine(" {0} = '{1}'", de.Key, de.Value);
}
}
else
{
throw new System.ArgumentException();
}
}
/// <summary> Connect, open queue, read a message, close queue and disconnect.
///
/// </summary>
/// <throws> MQException </throws>
private void testReceive()
{
MQQueueManager qMgr = null;
MQQueue queue = null;
int openOptions = MQC.MQOO_INPUT_AS_Q_DEF + MQC.MQOO_FAIL_IF_QUIESCING;
MQGetMessageOptions gmo = new MQGetMessageOptions();
MQMessage receiveMsg = null;
try
{
qMgr = new MQQueueManager(qManager, qMgrProp);
System.Console.Out.WriteLine("MQTest02 successfully connected to " + qManager);
queue = qMgr.AccessQueue(outputQName, openOptions, null, null, null); // no alternate user id
System.Console.Out.WriteLine("MQTest02 successfully opened " + outputQName);
receiveMsg = new MQMessage();
queue.Get(receiveMsg, gmo);
System.Console.Out.WriteLine("Message Data>>>" + receiveMsg.ReadString(receiveMsg.MessageLength));
}
catch (MQException mqex)
{
System.Console.Out.WriteLine("MQTest02 cc=" + mqex.CompletionCode + " : rc=" + mqex.ReasonCode);
}
catch (System.IO.IOException ioex)
{
System.Console.Out.WriteLine("MQTest02 ioex=" + ioex);
}
finally
{
try
{
queue.Close();
System.Console.Out.WriteLine("MQTest02 closed: " + outputQName);
}
catch (MQException mqex)
{
System.Console.Out.WriteLine("MQTest02 cc=" + mqex.CompletionCode + " : rc=" + mqex.ReasonCode);
}
try
{
qMgr.Disconnect();
System.Console.Out.WriteLine("MQTest02 disconnected from " + qManager);
}
catch (MQException mqex)
{
System.Console.Out.WriteLine("MQTest02 cc=" + mqex.CompletionCode + " : rc=" + mqex.ReasonCode);
}
}
}
/// <summary> main line</summary>
/// <param name="args">
/// </param>
// [STAThread]
public static void Main(System.String[] args)
{
MQTest02 mqt = new MQTest02();
try
{
mqt.init(args);
mqt.testReceive();
}
catch (System.ArgumentException e)
{
System.Console.Out.WriteLine("Usage: MQTest02 -h host -p port -c channel -m QueueManagerName -q QueueName [-u userID] [-x passwd] [-s securityExit]");
System.Environment.Exit(1);
}
catch (MQException e)
{
System.Console.Out.WriteLine(e);
System.Environment.Exit(1);
}
System.Environment.Exit(0);
}
}
}
答案 2 :(得分:0)
问题描述:
操作系统:7.3,MQ版本:8.0.0.5。服务器位于安全区中。
存在一个队列管理器,其服务器连接通道名为
CL_IR360。用户正在尝试连接到它,但是,失败了
与以下错误。
错误消息用户得到:
在此特定情况下的上述错误是由于以下事实造成的: 服务器连接通道的通道权限(SET CHLAUTH)设置。 添加了通道权限,并解决了错误。