【发布时间】:2019-02-22 19:41:32
【问题描述】:
我编写了连接远程 MQ 并下载消息的代码,但有时缺少一些消息。我正在发布我的代码。谁能告诉我这段代码有什么错误
using IBM.WMQ;
internal class MQReader
{
private static MQQueueManager queueManager;
private static MQMessage queueMessage;
private static MQGetMessageOptions queueGetMessageOptions;
private static MQQueue queue;
static string strReturn = "";
static string message = "";
static string mqexception = "";
static string connerror = "";
static string QueueName;
static string QueueManagerName;
static string ChannelInfo;
static string channelName;
static string PortNumber;
static string transportType;
static string connectionName;
static bool running;
static bool conresult;
static string checkconnexp;
static bool connerrorflag;
static bool checkconnresult;
public static bool connectMQ()
{
bool flag;
QueueManagerName = ConfigurationManager.AppSettings["QueueManager"];
QueueName = ConfigurationManager.AppSettings["Queuename"];
ChannelInfo = ConfigurationManager.AppSettings["ChannelInformation"];
PortNumber = ConfigurationManager.AppSettings["Port"];
char[] separator = { '/' };
string[] ChannelParams;
ChannelParams = ChannelInfo.Split(separator);
channelName = ConfigurationManager.AppSettings["Channel"];
transportType = ConfigurationManager.AppSettings["TransportType"];
connectionName = ConfigurationManager.AppSettings["ConnectionName"];
try
{
queueManager = new MQQueueManager(QueueManagerName,
channelName, connectionName);
queue = queueManager.AccessQueue(QueueName,
MQC.MQOO_INPUT_AS_Q_DEF + MQC.MQOO_FAIL_IF_QUIESCING);
connerror = "Connected Successfully";
flag = true;
}
catch (MQException connectionexp)
{
connerror = "Exception: " + connectionexp.Message;
logFile(connerror);
flag = false;
}
return flag;
}
private static void logFile(string errormsg)
{
string path = ConfigurationManager.AppSettings["logFilePath"];
string fileName = path + "MQLog" + DateTime.Now.Date.ToString("yyyyMMdd") + ".txt";
System.IO.File.AppendAllText(fileName, errormsg + Environment.NewLine);
}
public static void getMessage()
{
conresult = connectMQ();
running = true;
while (running)
{
if (conresult == true)
{
try
{
queueMessage = new MQMessage();
queueMessage.Format = MQC.MQFMT_STRING;
queueGetMessageOptions = new MQGetMessageOptions();
queueGetMessageOptions.Options |= MQC.MQGMO_WAIT | MQC.MQGMO_FAIL_IF_QUIESCING;
queueGetMessageOptions.WaitInterval = 60000;
queue.Get(queueMessage, queueGetMessageOptions);
message = queueMessage.ReadString(queueMessage.MessageLength);
}
catch (MQException exp)
{
mqexception = exp.Message;
message = "Exception: " + mqexception;
}
if (message != "Exception: " + mqexception)
{
string path = ConfigurationManager.AppSettings["xmlFilePath"];
string fileName = path + "MQMessage" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".xml";
System.IO.File.WriteAllText(fileName, message);
}
else
{
logFile(message);
queueManager.Close();
queueManager.Disconnect();
conresult = false;
}
}
if (conresult == false)
{
conresult = connectMQ();
}
}
}
public void InitializeConnections()
{
getMessage();
}
public void StopIt()
{
queueManager.Disconnect();
running = false;
}
}
有时消息未下载或丢失到本地目录。所有连接代码都是来自 web.config 的凭据。
编辑 请建议任何远程 mq 监控工具,它会在消息发送到 mq 和下载消息时进行记录。任何 power shell 脚本或任何工具都可以。
【问题讨论】:
-
150 行代码对 4 行问题不是一个好的比例。你检查过 MQ 日志吗?
-
你好@stuartd 我不知道如何读取MQ日志的过程
-
Logs in WebSphere MQ 可能有帮助 - "消息放入时,可以请求Confirmation on Delivery。当消息被消费时,会向Reply-To Queue和Reply发送一条报告消息-至原始消息中设置的 QMgr"
-
这里的信息真的不多。您刚刚发布了您的代码并询问我们出了什么问题,但没有告诉我们您自己进行了哪些调试。你甚至没有发布你的程序正在产生什么输出。正如其他人所说,您应该首先查看错误日志以查看 MQ 是否发布任何错误。此外,请在此问题中添加更多详细信息,以帮助我们指出问题所在。
-
当消息“丢失”时,您是否在应用程序中看到任何异常?另外,当您尝试获取时,您确定队列中有消息吗?