以破坏性方式从WebSphere读取消息

时间:2018-05-08 12:08:38

标签: java c# .net queue ibm-mq

我试图从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;

我只是得到20332034,而我可以在用户界面中看到有消息。

怎么可能呢?也许我做错了什么?

我也添加了Java标记,因为它们的代码根本没有区别,例如我使用this code作为参考。

1 个答案:

答案 0 :(得分:1)

  

虽然我可以在UI中看到有消息。

我假设您看到当前队列深度为1。

如果将消息放入队列,IBM MQ会立即增加当前队列深度,即之前提交事务。但是,您可以在事务提交之后仅获取消息。