C# MQ mesage有时不下载,建议使用任何远程MQ监视器工具

C# MQ mesage有时不下载,建议使用任何远程MQ监视器工具,c#,ibm-mq,C#,Ibm Mq,我编写了连接远程MQ并下载消息的代码,但有时会丢失一些消息。我正在发布我的代码。谁能告诉我这段代码有什么错误吗 using IBM.WMQ; internal class MQReader { private static MQQueueManager queueManager; private static MQMessage queueMessage; private static MQGetMessageOptions queueGetMessageOptions

我编写了连接远程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和下载消息时记录日志。任何powershell脚本或任何工具都行。

我会有礼貌地对代码说“Yuk”

首先,C是一种面向对象的语言,所以您应该学习如何使用try、catch和finally

if (message != "Exception: " + mqexception)
那是什么?这不是进行字符串比较的方式,为什么该代码不在try{}部分

string fileName = path + "MQMessage" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".xml";
嗯。你没有丢失你的信息,你把它们扔掉了。如果在同一毫秒内收到2条或更多消息,会发生什么情况

从文档中进行写入​全部的​正文:

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


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

150行代码与4行问题的比率不是很好。你检查过MQ日志了吗?Hello@stuartd我不知道如何读取MQ日志的过程可能会有所帮助-当消息被放入时,你可以在传递时请求确认。当消息被使用时,一条报告消息被传递到在原始消息中设置的Reply to Queue和Reply to QMgr。这里的信息确实不多。你刚刚发布了你的代码,问我们出了什么问题,但没有告诉我们你自己做了什么调试。您甚至还没有发布程序正在生成的输出。正如其他人所说,您应该从查看错误日志开始,查看MQ是否发布了任何错误。此外,请在此问题中添加更多详细信息,以帮助我们指出问题所在。当消息丢失时,您在应用程序中是否看到任何异常?另外,您确定在尝试获取时队列中有消息吗?您好@Roger。谢谢你的回复。我真的很感激。它将改进我的编码。谢谢:我明白你的意思,但有什么解决办法吗。。我应该怎么做才能解决这个问题。任何提示任何链接都会有帮助这里有两个想法:1不要覆盖,而是将新数据附加到文件中;2创建一个方法来检查文件是否已经存在,如果已经存在,则为文件名添加一个计数器,并再次检查,直到找不到文件,然后使用该文件名。另外,为什么不在程序中放置一个消息计数器,并在完成后输出。因此,输出文件的数量应与消息计数器所述数量相同。谢谢,罗杰。我会尝试你的方式,并张贴我的新代码罗杰,我不能在发送信息时使用计数器,因为其他团队正在发送信息。每次新消息出现在MQ中时,我都试图将数据附加到新文件中。让我想想。我说在你的代码中添加一个消息计数器,而不是在发送应用程序中。另外,为什么不记录每条消息的MsgId和CorrelId以及写入消息的文件名呢。您应该使用应用程序日志记录,以便轻松确定问题所在。