【问题标题】:MQ mesage is not downloading sometime , Suggest any remote MQ monitor toolMQ消息有时没有下载,建议使用任何远程MQ监控工具
【发布时间】: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 是否发布任何错误。此外,请在此问题中添加更多详细信息,以帮助我们指出问题所在。
  • 当消息“丢失”时,您是否在应用程序中看到任何异常?另外,当您尝试获取时,您确定队列中有消息吗?

标签: c# ibm-mq


【解决方案1】:

我会很有礼貌,只对那个代码说“Yuk”。

首先,C# 是一门面向对象的语言,因此您应该学习如何使用 try、catch 和 finally。

if (message != "Exception: " + mqexception)

那是什么?这不是您进行字符串比较的方式,为什么 try{} 部分中没有该代码?

string fileName = path + "MQMessage" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".xml";

嗯。你没有丢失你的信息,你把它们扔掉了。如果您在同一毫秒内收到 2 条或更多消息会发生什么?

来自 Write​All​Text 的文档:

创建一个新文件,将内容写入文件,然后关闭 文件。如果目标文件已经存在,则覆盖。

因此,这意味着当您在同一毫秒内收到 2 条或更多消息时,下一条消息会覆盖前一条消息。

【讨论】:

  • 你好@Roger。谢谢你的回复 。对此,我真的非常感激 。它将改善我的编码。谢谢:) 我明白了你的意思,但是对此有任何解决方案..我应该怎么做才能解决这个问题。任何提示任何链接都会有所帮助
  • 这里有2个想法:(1)不要覆盖而是将新数据附加到文件中或(2)创建一个方法来检查文件是否已经存在,如果存在,添加一个计数器文件名并再次检查,直到找不到该文件,然后使用该文件名。另外,为什么不在程序中放置一个消息计数器并在完成时输出。因此,您应该拥有与消息计数器状态相同数量的输出文件。
  • 谢谢罗杰。我会尝试你的方式并发布我的新代码
  • Roger 我在发送消息时无法使用计数器,因为其他团队正在发送消息。每次新消息在 MQ 中时,我都尝试将数据附加到新文件中。让我们看看。
  • 我说在您的代码中添加一个消息计数器,而不是在发送应用程序中。此外,您为什么不记录每条消息的 MsgId 和 CorrelId 以及写入消息的文件名。您应该使用应用程序日志记录,以便轻松确定问题所在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-03
  • 1970-01-01
相关资源
最近更新 更多