【问题标题】:JMS queue static snapshotJMS 队列静态快照
【发布时间】:2019-11-07 15:09:27
【问题描述】:

我需要浏览一个 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
}

【问题讨论】:

  • 包括用于浏览的代码......假设初始队列数为 20,当我浏览时我只想查看这 20 条消息,如果有新消息进入队列则忽略

标签: jms jboss-eap-7


【解决方案1】:

the JavaDoc for javax.jms.QueueBrowser中所述:

扫描完成时,邮件可能会到达并过期。 JMS API 不要求枚举的内容是队列内容的静态快照。这些更改是否可见取决于 JMS 提供者。

队列浏览器从 JBoss EAP 中的 JMS 提供者提供的枚举内容不是静态的,没有办法强制它是静态的。

由于 JMS 不保证您寻找的行为,我建议您调整您的应用程序,使其不依赖于此类行为。

我想到了几个替代方案:

  • 设置浏览器检查消息的上限。
  • 使用特定于提供程序的管理调用在创建浏览器之前获取队列中的消息数量,然后仅浏览该数量的消息。

【讨论】:

  • 感谢 API 信息,在发布我的问题之前我也碰巧看到了这些信息。但它在 Weblogic 中运行没有问题。如果我找不到这两个应用程序服务之间的行为不同的原因,我将关闭此作为答案
  • 如 JavaDoc 中所述,枚举的内容是否是静态的取决于 JMS 提供者如何实现它。我认为可以肯定地说 Weblogic 实现了静态内容,而 JBoss EAP 的 JMS 提供者没有。关键是规范不保证行为,因此您的应用程序不应依赖它,否则在将应用程序移植到不同的 JMS 提供程序时可能会遇到这样的困难。
  • 我同意 JMS Queue 浏览器的 Weblogic 与 Jboss 的实现差异
猜你喜欢
  • 2016-10-07
  • 1970-01-01
  • 2021-06-26
  • 2021-12-30
  • 2022-12-01
  • 2011-06-15
  • 2019-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多