Почему мой код отправляет то же сообщение в MSMQ, когда я этого не ожидаю? - PullRequest
1 голос
/ 11 июня 2019

Я пишу код для клиента MSMQ, который используется для связи с сервером MSMQ. Мой метод отправки будет многократно отправлять одно и то же сообщение тысячи раз с более длинным сообщением, что не ожидается. С коротким сообщением эта проблема не возникает. Очередь приема и отправки является частной очередью.

Что может быть причиной этого?

Я включил журнал MSMQ, чтобы отслеживать, сколько дублирующих сообщений создается.

Функция отправки:

private void Send(string content, string queuePath, int timeToBeReceived)
{
    // check if queue exist
    if (sendQueue == null)
    {
        // remote private queue
        if (queuePath.Contains("FormatName"))
        {
            sendQueue = new MessageQueue(queuePath);
        }
        else
        {
            // private queue path
            if (MessageQueue.Exists(queuePath))
            {
                sendQueue = new MessageQueue(queuePath);
            }
            else
            {
                sendQueue = MessageQueue.Create(queuePath);
                // Set permissions
                sendQueue.SetPermissions("Everyone", MessageQueueAccessRights.FullControl, AccessControlEntryType.Allow);
            }
        }
    }

    // create message
    Message msg = new Message();
    msg.Formatter = new XmlMessageFormatter((new Type[] { typeof(string) }));

    try
    {
    // validation
        XmlDocument xml = new XmlDocument();
        xml.LoadXml(content);
        xml = null;

        msg.BodyStream = new MemoryStream();
        var bytes = System.Text.Encoding.UTF8.GetBytes(content);
        msg.BodyStream.Write(bytes, 0, bytes.Length);
        if (timeToBeReceived > 0)
        {
            msg.TimeToBeReceived = TimeSpan.FromMilliseconds(timeToBeReceived);
        }
        sendQueue.Send(msg);
        Array.Clear(bytes, 0, bytes.Length);
        msg.Dispose();
    }
    catch (XmlException ex) {
        MessageBox.Show(ex.Message, "Wrong XML Format Detected!", MessageBoxButton.OK, MessageBoxImage.Warning);
        return;
    }
}

При вызове этой функции из MainViewModule значение TimeToBeReceived по умолчанию равно 0

private RelayCommand _sendCommand;

public RelayCommand SendCommand
{
    get
    {
        return _sendCommand
            ?? (_sendCommand = new RelayCommand(
            () =>
            {
                Send(SendText, Properties.Settings.Default.MSMQSendPath, Properties.Settings.Default.TimeToBeReceived);
                SendText = string.Empty;
            }));
    }
}

Тело сообщения:

<result>
<job bsn="000789364" barcode="LJS@000789364@004@IP@LPSTEST@.@.@20190610103346@1@0@.@C519 IP LHD@2.6286@755055@151xx1x1xx1611x1xxx32112111x1x21xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx@*000789364*=" jobtype="C519 EB LHD" overallresult="pass"></job>
<tester name="LHD" lane="EB Line 6" version="KSK"></tester>
    <tests performed="2019-01-09 10:31:27" cycletime="187" faultmessage="any useful text">
    <test name="JX6T91A000LAD" result="pass" value="module" status="1"></test>
    <test name="JX6T91A002LAD" result="pass" value="module" status="1"></test>
    <test name="JX6T91A003LAD" result="pass" value="module" status="1"></test>
    <test name="JX6T91A102LAD" result="pass" value="module" status="1"></test>
    <test name="JX6T91A107LAD" result="pass" value="module" status="1"></test>
    <test name="JX6T91A111LAD" result="pass" value="module" status="1"></test>
    <test name="JX6T91A112LBB" result="pass" value="module" status="1"></test>
    <test name="JX6T91A209LAD" result="pass" value="module" status="1"></test>
    <test name="JX6T91A303LAD" result="pass" value="module" status="1"></test>
    <test name="JX6T91A401LGD" result="pass" value="module" status="1"></test>
    <test name="JX6T91A641LAD" result="pass" value="module" status="1"></test>
    <test name="JX6T91A680LBD" result="pass" value="module" status="1"></test>
    <test name="JX6T91A681LAD" result="pass" value="module" status="1"></test>
    <test name="JX6T91A682LAD" result="pass" value="module" status="1"></test>
    <test name="JX6T91A790LAD" result="pass" value="module" status="1"></test>
    <test name="JX6T91A792LCC" result="pass" value="module" status="1"></test>
    <test name="JX6T91A793LAD" result="pass" value="module" status="1"></test>
    <test name="JX6T91A811LAD" result="pass" value="module" status="1"></test>
    <test name="JX6T91B111LEC" result="pass" value="module" status="1"></test>
    <test name="JX6T91B302LDD" result="pass" value="module" status="1"></test>
    <test name="JX6T91B830LCD" result="pass" value="module" status="1"></test>
</tests>

Я все еще работаю над этой проблемой и нашел больше информации. Мой код отправляет правильное сообщение один раз, а затем приходит повторяющееся сообщение. Correct and wrong messages in the Journals

Для повторяющихся сообщений у него нет информации об отправителе и SID. GUID и имя исходного компьютера также отличаются. Correct and duplicated messages

Правильные данные очереди сообщений в журнале приведены в следующем формате: DIRECT = OS: PCName \ privates $ \ queuename.

Очередь сообщения об ошибке. Формат имени:

DIRECT = TCP: IPADDRESS \ частные $ \ ИмяОчереди Correct message queue name

Что может быть основной причиной? Размер сообщения о проблеме - 2102.

...