IBM.XMS IMessageConsumer - не выпустит - не может отписаться

Первое: проблема, с которой я не могу успешно выполнить эти шаги на асинхронном долговременном подписчике по темам mq от ibm.

IMessageConsumer.MessageListener = null;
IMessageConsumer.Close();
IMessageConsumer.Dispose();
ISession.Unsubscribe(topicPath);

Я получаю IBM.WMQ.MQException {"2428"} "Не удалось отписаться от темы X с помощью MQCLOSE. Возможно, возникла проблема при удалении подписки, поскольку она используется получателем сообщений. Убедитесь, что все потребители сообщений, использующие эту подписку, закрыто перед отпиской. Пожалуйста, смотрите связанное исключение для получения дополнительной информации."

Второе: особенности Итак, я использую инфраструктуру IBM MQ. В частности, их реализация Темы для распределенной реализации издателя / подписчика. Я включаю все это в проект.NET WEB API (MVC5), чтобы абстрагировать от остальной части организации все особенности MQ. На данный момент игнорировать все сбой, и т. Д. Когда клиент звонит, я сначала вижу, есть ли у нас ISession для звонящего. Если мы сделаем это, я использую существующее, если нет, я создаю новое из фабрики общих соединений. Затем я создаю новое направление для потребителя. Затем я создаю долговременную подписку для определенного пути к теме. Затем я добавляю MessageListener и добавляю весь беспорядок в кэш в памяти. Другое отслеживание также происходит, но не важно для этого обсуждения.

using IBM.XMS;

// Subscribe
MQConnectionFactory f = (MQConnectionFactory)fact;
SessionClass newSession = new SessionClass(); // Contains an ISession, IDestination, IMessageConsumer

newSession.Session = f.CreateSession();
newSession.Destination = newSession.Session.CreateTopic(MQConnectionFactory.FormatTopic(path));
newSession.Consumer = newSession.Session.CreateDurableSubscriber(newSession.Destination, subId.ToString());
newSession.Consumer.MessageListener = new MessageListener(MessageHandler);


// Message Handler - Some "details" removed
private void MessageHandler(IMessage msg)
{
    string topic = msg.GetStringProperty(MQConstants.TOPIC);
    DateTime timestamp = DateTime.FromBinary(msg.GetLongProperty(MQConstants.DATETIME));
    List<KeyValuePair<string, object>> parms = msg.GetStringProperty(MQConstants.PARAMETERS).FromBase64();
    object payload = msg.GetObjectProperty(MQConstants.PAYLOAD);

    Publication publication = new Publication()
    {
        MessageTimestamp = timestamp,
        Topic = topic,
        Parameters = parms
    };

    Callback.Notify(publication))
    _log.DebugFormat("Message delivered to {0}", msg.JMSMessageID);
    msg.Acknowledge();
}

// And for unsubscribe
SessionClass s = _destinations[fullPath];
s.Consumer.MessageListener = null;
s.Consumer.Close();
s.Consumer.Dispose();
s.Session.Unsubscribe(s.Destination.Name);
_destinations.Remove(fullPath);

Так что все подписка и обработка сообщений работают нормально. Отписаться всегда не удается, когда я нажимаю

s.Session.Unsubscribe(s.Destination.Name) 

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

У кого-нибудь есть идеи? Я не могу полностью удалить подписки из MQ после их создания.

Спасибо

1 ответ

Так что после тщательного изучения документации и консультаций с другими людьми вопрос не совсем понятен в MQ.

То, что необходимо передать методу Unsubscribe, это идентификатор, переданный методу CreateDurableSubscriber

Так что.... используя приведенный выше код, единственное изменение - это вызов Unsubscribe.

s.Session.Unsubscribe(subId.ToString());

И тогда все хорошо.

Другие вопросы по тегам