Есть ли инструмент для изменения надежных тематических сообщений JMS?

Мы используем Websphere MQ8 и думаем об использовании надежных тем для реализации шаблона публикации и подписки.

Мы уже используем очереди и JMS-браузер Hermes для исправления ошибочных сообщений очереди.

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

Поэтому я хотел бы знать, как вы справляетесь с проблемами, когда для определенного клиентского приложения есть устойчивые сообщения, которые клиент не может использовать, например. потому что сообщение имеет неправильный формат?

Нужно ли удалять все недоставленные сообщения для этого клиента? Или есть какой-то инструмент, который может это сделать?


person Dirk    schedule 15.09.2015    source источник


Ответы (1)


Как вы справляетесь с проблемами, когда для определенного клиентского приложения есть устойчивые сообщения, которые клиент не может использовать, например. потому что сообщение имеет неправильный формат?

Приложение-потребитель (Клиент) должно иметь надлежащую обработку исключений и должно отбрасывать все плохие/ядовитые сообщения.

Нужно ли удалять все недоставленные сообщения для этого клиента? Или есть какие-то инструменты, которые могут это сделать?

Сообщения будут автоматически удалены сервером MQ по истечении TTL (время жизни). Мы не можем вручную удалить эти сообщения, поскольку они принадлежат исходному клиенту (который является постоянным подписчиком) или предназначались для него.

Ссылка ниже хорошо объясняет концепцию надежных подписок JMS: https://docs.oracle.com/cd/E19798-01/821-1841/bncgd/index.html

Также я предоставил приведенный ниже пример кода для инструмента, который регистрирует (не удаляет) сообщения из темы постоянной подписки:

   InitialContext ctx = new InitialContext();
   Topic topic = (Topic)ctx.lookup("myJMSTopic1");

   TopicConnectionFactory connFactory = (TopicConnectionFactory) ctx.lookup("topicConnFactory");
   TopicConnection topicConn = connFactory.createTopicConnection();
   topicConn.setClientID("myToolId1"); //Use a different client id than original subscriber

   TopicSession topicSession = topicConn.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);

   TopicSubscriber topicSubscriber = topicSession.createDurableSubscriber(topic, "myClientExistingDuraSubName"); // this is where you have to provide the original client's durable subscription name

   while(true) {
        Message message = topicSubscriber.receive();
        TextMessage txtMsg = (TextMessage)message;
        logger.info(txtMsg.getText());
   }
person developer    schedule 16.09.2015
comment
Моя проблема в том, что когда вы получаете откат транзакции XA, например. из вашей базы данных, вы больше не можете удалить отравленное сообщение, верно? Тема тоже откатится в этом случае. Тогда немного инструментов было бы неплохо. Звучит как довольно распространенная проблема для меня, поэтому интересно, что для нее нет стандартного решения... - person Dirk; 18.09.2015
comment
Я понял вашу точку зрения, можете ли вы добавить код (в свой запрос) вашего метода MDB, который имеет этот код XATransaction? - person developer; 18.09.2015
comment
Прямо сейчас у нас есть MDB, прослушивающие очереди и впоследствии записывающие в базу данных. Но код будет очень похож при прослушивании тем. Какова ваша идея? - person Dirk; 19.09.2015