Я пишу код для клиента 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>
Я все еще работаю над этой проблемой и нашел больше информации. Мой код отправляет правильное сообщение один раз, а затем приходит повторяющееся сообщение.
Для повторяющихся сообщений у него нет информации об отправителе и SID. GUID и имя исходного компьютера также отличаются.
Правильные данные очереди сообщений в журнале приведены в следующем формате: DIRECT = OS: PCName \ privates $ \ queuename.
Очередь сообщения об ошибке. Формат имени:
DIRECT = TCP: IPADDRESS \ частные $ \ ИмяОчереди
Что может быть основной причиной? Размер сообщения о проблеме - 2102.