Статический снимок очереди JMS - PullRequest
0 голосов
/ 07 ноября 2019

Мне нужно просмотреть очередь JMS и отфильтровать ее по количеству сообщений с определенными критериями.

Но проблема заключается в JBoss EAP, при просмотре очереди, если приходят новые сообщения, это также считаетсяв обзоре, который заставляет процесс выполняться так долго, потому что это приложение постоянно получает много сообщений.

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

PS: Это нормально работало на сервере Weblogic.

Вот код браузера:

Context namingContext = null;

try {
    String userName = System.getProperty("username", DEFAULT_USERNAME);
    String password = System.getProperty("password", DEFAULT_PASSWORD);

    // Set up the namingContext for the JNDI lookup
    final Properties env = new Properties();
    env.put(Context.INITIAL_CONTEXT_FACTORY, INITIAL_CONTEXT_FACTORY);
    env.put(Context.PROVIDER_URL, System.getProperty(Context.PROVIDER_URL, PROVIDER_URL));
    env.put(Context.SECURITY_PRINCIPAL, userName);
    env.put(Context.SECURITY_CREDENTIALS, password);
    namingContext = new InitialContext(env);

    // Perform the JNDI lookups
    String connectionFactoryString = System.getProperty("connection.factory", DEFAULT_CONNECTION_FACTORY);
    ConnectionFactory connectionFactory = (ConnectionFactory) namingContext.lookup(connectionFactoryString);


    try (JMSContext context = connectionFactory.createContext(userName, password)) {
        Queue queue = (Queue) namingContext.lookup("jms/ubsexecute");
        QueueBrowser browser = context.createBrowser(queue);
        Enumeration enumeration = browser.getEnumeration();
        int i =1;
        while (enumeration.hasMoreElements()) {
            Object nextElement = enumeration.nextElement();
            System.out.println("Read a message " + i++);

            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    } catch (NamingException e) {
        log.severe(e.getMessage());
        e.printStackTrace();
    } finally {
        if (namingContext != null) {
            try {
                namingContext.close();
            } catch (NamingException e) {
                log.severe(e.getMessage());
            }
        }
    }
} catch (Exception e) {
    // TODO: handle exception
}

1 Ответ

0 голосов
/ 07 ноября 2019

Как отмечено в JavaDoc для javax.jms.QueueBrowser:

Сообщения могут приходить и заканчиваться, когда сканирование выполнено. JMS API не требует, чтобы содержимое перечисления было статическим снимком содержимого очереди. Видны ли эти изменения или нет, зависит от поставщика JMS.

Содержимое перечисления, предоставляемого браузером очереди от поставщика JMS в JBoss EAP, не статично и существуетневозможно заставить его быть таким.

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

Aна ум приходит пара альтернатив:

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