Читайте сообщения из WebSphere разрушительным образом - PullRequest
0 голосов
/ 08 мая 2018

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

Я написал код, который работал нормально, пока я не начал возиться с сообщениями. Например, последним было «добавить одно сообщение, прочитать его, подождать в пустой очереди, а затем добавить два сообщения». В моем случае эта программа должна прочитать первое сообщение, подождать, пока что-то появится, и затем прочитать его тоже.

Однако проблема в том, что у меня возникла ситуация, когда я застрял. У меня есть сообщение в очереди, но я не могу прочитать ни с помощью BROWSE, ни с помощью CURSOR. Вот мой код:

MQEnvironment.UserId = _queueSettings.UserName;
MQEnvironment.Password = _queueSettings.Password;


var manager = new MQQueueManager(_queueSettings.QueueManagerName, _queueSettings.ChannelName, _queueSettings.ConnectionName);
var queue = manager.AccessQueue(_queueSettings.QueueName, MQC.MQOO_FAIL_IF_QUIESCING | MQC.MQOO_INPUT_SHARED | MQC.MQOO_BROWSE);

var browseFirstOptions = new MQGetMessageOptions { Options = MQC.MQGMO_BROWSE_FIRST };
var cursorOptions = new MQGetMessageOptions { Options = MQC.MQGMO_MSG_UNDER_CURSOR };

var currentOptions = browseFirstOptions;

while (!cancellationToken.IsCancellationRequested)
{
    var logger = _contextlessLogger.ForContext("requestId", Guid.NewGuid());
    try
    {
        var msg = new MQMessage();
        queue.Get(msg, currentOptions);

        if (currentOptions == browseFirstOptions)
        {
            currentOptions = cursorOptions;
            continue;
        }

        string messageText = msg.ReadString(msg.MessageLength);
        RunProcessingTask(logger, messageText);
    }
    catch (MQException ex) when (IsNoMessagesException(ex) && currentOptions != browseFirstOptions)
    {
        currentOptions = browseFirstOptions;
    }
    catch (MQException ex) when (IsNoMessagesException(ex))
    {
        const int sleepIntervalMs = 5000;
        _contextlessLogger.Information("No messages in the queue. Sleeping for {sleepIntervalMs}ms", sleepIntervalMs);
        await Task.Delay(sleepIntervalMs);
    }
    catch (Exception ex)
    {
        logger.Error(ex, "Unexpected error occured");
    }
}

private static bool IsNoMessagesException(MQException exception) =>
    exception.ReasonCode == MQC.MQRC_NO_MSG_AVAILABLE
    || exception.ReasonCode == MQC.MQRC_NO_MSG_UNDER_CURSOR;

Я просто получаю 2033 или 2034, пока вижу в интерфейсе, что есть сообщение.

Как это могло быть сделано? Может я не так делаю?


Я также добавил тег Java, потому что их код совсем не отличается, например, я использовал этот код в качестве справочного.

1 Ответ

0 голосов
/ 08 мая 2018

пока я вижу в интерфейсе, что есть сообщение.

Я предполагаю, что вы видите текущую глубину очереди 1.

Если вы помещаете сообщение в очередь, IBM MQ немедленно увеличивает текущую глубину очереди, то есть до совершения транзакции. Но вы можете получить сообщение только после фиксации транзакции.

...