JMS 队列静态快照
JMS queue static snapshot
我需要浏览 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
}
如the JavaDoc for javax.jms.QueueBrowser
所述:
Messages may be arriving and expiring while the scan is done. The JMS API does not require the content of an enumeration to be a static snapshot of queue content. Whether these changes are visible or not depends on the JMS provider.
队列浏览器从 JBoss EAP 中的 JMS 提供程序提供的枚举内容 不是 静态的,无法强制它成为静态的。
由于 JMS 不保证您寻找的行为,我建议您调整您的应用程序,使其不依赖此类行为。
我想到了几个备选方案:
- 设置浏览器将检查的邮件数量的上限。
- 在创建浏览器之前使用特定于提供程序的管理调用获取队列中的消息数,然后仅浏览该数量的消息。
我需要浏览 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
}
如the JavaDoc for javax.jms.QueueBrowser
所述:
Messages may be arriving and expiring while the scan is done. The JMS API does not require the content of an enumeration to be a static snapshot of queue content. Whether these changes are visible or not depends on the JMS provider.
队列浏览器从 JBoss EAP 中的 JMS 提供程序提供的枚举内容 不是 静态的,无法强制它成为静态的。
由于 JMS 不保证您寻找的行为,我建议您调整您的应用程序,使其不依赖此类行为。
我想到了几个备选方案:
- 设置浏览器将检查的邮件数量的上限。
- 在创建浏览器之前使用特定于提供程序的管理调用获取队列中的消息数,然后仅浏览该数量的消息。