메시지가 때때로 Q에서 두 번 이상 읽히는 경우가 있습니다. MQSeries 용 .NET 래퍼 (amqmdnet.dll)를 사용하고 Windows 서비스를 사용하여 메시지를 읽습니다.MQ 시리즈 메시지가 두 번 이상 읽음
Here's how I do it with VB.NET:
'QManager
Dim properties As Hashtable = New Hashtable(4)
properties.Add(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_CLIENT)
properties.Add(MQC.CHANNEL_PROPERTY, channelName)
properties.Add(MQC.HOST_NAME_PROPERTY, iPAddress)
properties.Add(MQC.PORT_PROPERTY, port)
QManager = New MQQueueManager(queueManagerName, _
properties)
'Q itself
getMessageOptions.Options = _
MQC.MQGMO_FAIL_IF_QUIESCING Or _
MQC.MQGMO_WAIT Or _
MQC.MQGMO_SYNCPOINT
getMessageOptions.WaitInterval = 1000 ' read from config
Dim locker As New Object
System.Threading.Monitor.Enter(locker)
Q.Get(message, getMessageOptions)
QManager.Commit()
System.Threading.Monitor.Exit(locker)
나는 Q.Get (메시지, getMessageOptions는) 다른 독자 사용할 수 없습니다 메시지가 차례로 QManager.Commit 그냥 .NET 픽 & 큐에서 유추에 의한 Q에서 메시지를 (제거하게 들었). 모니터 자체가 필요하지 않습니다.
내 Windows 서비스에서 여러 스레드가 Q를 읽었으며 낮은 폴링 간격 (100ms 이하)으로 인해 래퍼가 메시지의 '읽기'플래그를 업데이트 할 충분한 시간을 갖지 못해 의심 스럽습니다. 스레드를 겹쳐서 두 번 이상 올리십시오. 역사적으로 동일한 메시지는 최대 4 번 읽습니다.
폴링 간격을 늘리기 전에 올바른 일을하고 있는지 확인하고 싶었습니다. 누구든지 내 접근 방식으로 어떤 문제를 제안 할 수 있습니까?
감사합니다.
많은 대기열 시스템은 "적어도 한 번", "한 번"또는 "한 번"과 같이 여러 가지 배달 보증을 지원합니다. MQ에 이러한 옵션이 있습니까? 그렇다면 어떤 옵션이 대기열에 선택되어 있습니까? –
덕분에, Damien, 내가 아는 한 MQSeries는 '한 번만'배달 방법을 사용합니다. –