Строка проверки WebSphere MQ с сообщением mq

Я хочу прочитать первое сообщение 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, если сообщение является единицей работы?


person ZerOne    schedule 18.12.2014    source источник
comment
возможный дубликат Как выполнить транзакционное получение из Websphere MQ в дотнете?   -  person Steven Liekens    schedule 18.12.2014
comment
Вам следует рассмотреть возможность использования транзакции XA для этого вместо того, чтобы делать это вручную.   -  person Gas    schedule 18.12.2014
comment
Итак, в моем понимании ... ответ на повторяющийся вопрос блокирует очередь, чтобы разрешить только один доступ или?   -  person ZerOne    schedule 18.12.2014
comment
@Gas, у вас есть пример транзакции XA с mq?   -  person ZerOne    schedule 18.12.2014
comment
Проверьте эту страницу для запуска WebSphere Распределенные транзакции MQ в .NET   -  person Gas    schedule 18.12.2014
comment
Как узнать, установлен ли клиент расширенных транзакций в WebSphere MQ? Если он уже настроен, является ли SimpleXAGet правильным способом обработки транзакции?   -  person ZerOne    schedule 09.01.2015


Ответы (1)


Итак, чтобы уточнить некоторую терминологию, сообщение находится в очереди, а не в канале - канал просто дает вам доступ к диспетчеру очередей. Таким образом, вы хотите «получить» первое сообщение (внутри единицы работы с GMO_SYNCPOINT), сохранить его в базе данных и, если сохранение работает, удалить сообщение из очереди (через фиксацию). Чтобы сделать это, вы должны получить сообщение из очереди в единице работы и только «зафиксировать» получение (т.е. заставить это произойти) и обновление базы данных одновременно. Вообще говоря, вы должны использовать координацию транзакций, чтобы гарантировать, что обновление базы данных и получение либо происходят (фиксация), либо не происходят (откат). Надеюсь, вы сможете использовать o/s DTC (координатор распределенных транзакций), чтобы и MQ, и база данных участвовали в одной и той же транзакции — вам также нужно посмотреть, нужны ли вам управляемые или неуправляемые соединения, поскольку они представляют собой разные реализации — см. информационный центр. http://www-01.ibm.com/support/knowledgecenter/SSFKSJ_8.0.0/com.ibm.mq.dev.doc/q029290_.htm

person JasonE    schedule 18.12.2014
comment
Я просмотрел ссылки выше и теперь лучше понимаю, как с этим справиться, спасибо! Я подключаю очередь к консольному приложению С#... так что это неуправляемый код, верно? У вас есть пример транзакции на С#? - person ZerOne; 22.12.2014
comment
Библиотека MQ .net может устанавливать соединения и передавать данные напрямую в системы MQ, полностью оставаясь в среде .net (управляемая), или может выполнять вызовы MQI через обычный клиент C (неуправляемый, по умолчанию). Исторически неуправляемые были полностью функциональными, а неуправляемые — в меньшей степени, хотя со временем они стали намного ближе. www-01. ibm.com/support/knowledgecenter/SSFKSJ_7.5.0/ и его дочерние страницы рассказывают о том, как все это работает - person JasonE; 23.12.2014
comment
Привет, вы получаете с помощью просмотра (оставляя сообщение там), затем сохраняете полученное сообщение, а затем деструктивно получаете сообщение в начале очереди. Это и ОЧЕНЬ опасно (если вы запускаете 2 копии приложения для его масштабирования, они оба сохраняют первое сообщение, а 2 выбрасывают), и лишние вызовы.... Посмотрите на MQGMO_SYNCPOINT. Сделать сначала получить GET с gmo_syncpoint, а потом сохранить в БД под единицей работы. Затем вы фиксируете или откатываетесь. Если вы фиксируете, «получить» уничтожает сообщение, если вы откатываете, «получение» отменяется, и сообщение возвращается в очередь. - person JasonE; 09.01.2015