Я хочу прочитать первое сообщение MQ из очереди (не удаляя его) и сохранить это сообщение в моей базе данных. Затем, если все сделано, мне нужно навсегда удалить это сообщение из очереди MQ. Что я знаю, так это просто удалить первое сообщение в очереди. Но как мне узнать, является ли то же самое сообщение, которое я сохранил в базе данных, тем же самым, которое я удалю из MQ?
Спасибо, Майкл
Изменить: теперь попытался обработать действия с помощью TransactionScope в C# (консольное приложение):
using (TransactionScope scope = new TransactionScope){
//MQ Connection ( read message of queue)
Hashtable properties = new Hashtable();
properties.Add(MQC.HOST_NAME_PROPERTY, _settings.MQServer);
properties.Add(MQC.PORT_PROPERTY, _settings.MQPort);
properties.Add(MQC.CHANNEL_PROPERTY, _settings.MQChannelName);
properties.Add(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_XACLIENT);
MQQueueManager _MQHandler = new MQQueueManager(_settings.MQManager, properties);
MQQueue = _MQHandler.AccessQueue(ReceiveQueueName,
MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_FAIL_IF_QUIESCING);
MQQueueMessage = new MQMessage();
MQQueueMessage.Format = MQC.MQFMT_STRING;
MQQueueGetMessageOptions = new MQGetMessageOptions();
MQQueueGetMessageOptions.Options += MQC.MQGMO_SYNCPOINT; //new
MQQueue.Get(MQQueueMessage, MQQueueGetMessageOptions);
//DB Connection (save message in database)
if ( DBsuccess ) {
_MQHandler.Commit();
scope.Complete();
}else{
_MQHandler.Backout();
}
}
Кажется, это делает то, что я хочу :) Но есть вопрос: - Если я создам точку синхронизации в Put/Get, а затем вызову Backout(), будет ли MQ откатываться только до этой точки синхронизации? - Блокируется ли MQ для других менеджеров MQ, если сообщение является единицей работы?