JMS. Не работает createDurableConsumer()

346
29 октября 2017, 17:47

Есть следующий код (для получателя сообщений):

ConnectionFactory factory = new ConnectionFactory();
    try (JMSContext context = factory.createContext("admin", "admin", JMSContext.AUTO_ACKNOWLEDGE))
    {
        factory.setProperty(ConnectionConfiguration.imqAddressList, "mq://127.0.0.1:7676,mq://127.0.0.1:7676");
        int id = new Random().nextInt();
        context.setClientID("" + id);
        Topic topic = context.createTopic("Topic");
        String selector= "name='value'";
        String dur_id = "DurableC" + id;
        JMSConsumer consumer = context.createDurableConsumer(topic,dur_id);
        while (true) {
            Message msg = consumer.receive();
            System.out.println(msg.getBody(String.class));
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

Есть следующий код для отправителя:

 ConnectionFactory factory = new ConnectionFactory();
    try (JMSContext context = factory.createContext("admin", "admin"))
    {
        factory.setProperty(ConnectionConfiguration.imqAddressList, "mq://127.0.0.1:7676,mq://127.0.0.1:7676");
        Topic topic = context.createTopic("Topic");
        TextMessage textMessage = context.createTextMessage("Message #" + msg);
        textMessage.setStringProperty("name", "value");
        context.createProducer().send(topic, textMessage);
        Thread.sleep(1000);
    }
    catch (Exception e)
    {
        System.out.println(e.getMessage());
    }

Проблема заключается в том, что если будет разрыв соединения, то никакие сообщения из Topic на консоль у меня не выводятся, хотя я создаю Durable Consumer. Объясните, что я делаю не так

Answer 1

В JavaDoc к методу createDurableConsumer пишется:

The JMS provider retains a record of this durable subscription and ensures that all messages from the topic's publishers are retained until they are delivered to, and acknowledged by, a consumer on this durable subscription or until they have expired.

A durable subscription will continue to accumulate messages until it is deleted using the unsubscribe method.

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

Вы можете назначить слушателя ошибок:

context.setExceptionListener(new MyExceptionListener());

и реализовать в нём логику проверки наличия соединения и его восстановления в случае обрыва.

READ ALSO
XMLSignatureInput в библиотеке от СМЭВ на java

XMLSignatureInput в библиотеке от СМЭВ на java

Так как у СМЭВ есть образцовая реализация механизма их же нормализации XML в их методической рекомендации (можно глянуть тут пункт 124), то я решил...

325
Странная ошибка в приложении Swing

Странная ошибка в приложении Swing

Делаю редактор кода с подсветкой синтаксиса на Swing в NetBeans 82

257
перевод миллисекунд в минуты

перевод миллисекунд в минуты

Здравствуйте! При переводе миллисекунд в минуты, число превышает 60, должно быть меньше 60Что я делаю не так, подскажите? Спасибо

349