JMS队列静态快照

JMS队列静态快照,jms,jboss-eap-7,Jms,Jboss Eap 7,我需要浏览一个JMS队列,并根据存在多少特定条件的消息对其进行过滤 但问题在于JBoss EAP,在浏览队列时,如果出现新消息,也会在浏览中考虑,这会使流程运行太长时间,因为此应用程序不断收到大量消息 基本上,我需要了解是否可以获取队列的静态快照,以便在不考虑新消息和即将出现的消息的情况下扫描消息 PS:这在WebLogicServer中运行良好 以下是浏览器代码: Context namingContext=null; 试一试{ 字符串userName=System.getProperty(“

我需要浏览一个JMS队列,并根据存在多少特定条件的消息对其进行过滤

但问题在于JBoss EAP,在浏览队列时,如果出现新消息,也会在浏览中考虑,这会使流程运行太长时间,因为此应用程序不断收到大量消息

基本上,我需要了解是否可以获取队列的静态快照,以便在不考虑新消息和即将出现的消息的情况下扫描消息

PS:这在WebLogicServer中运行良好

以下是浏览器代码:

Context namingContext=null;
试一试{
字符串userName=System.getProperty(“用户名”,默认用户名);
字符串password=System.getProperty(“password”,默认密码);
//为JNDI查找设置namingContext
最终属性env=新属性();
环境放置(Context.INITIAL\u Context\u工厂,INITIAL\u Context\u工厂);
put(Context.PROVIDER\u URL,System.getProperty(Context.PROVIDER\u URL,PROVIDER\u URL));
环境放置(Context.SECURITY\u主体,用户名);
环境放置(Context.SECURITY\u凭证、密码);
namingContext=新的初始上下文(env);
//执行JNDI查找
String connectionFactoryString=System.getProperty(“connection.factory”,默认连接工厂);
ConnectionFactory ConnectionFactory=(ConnectionFactory)namingContext.lookup(connectionFactoryString);
try(JMSContext context=connectionFactory.createContext(用户名、密码)){
Queue Queue=(Queue)namingContext.lookup(“jms/ubsexect”);
QueueBrowser browser=context.createBrowser(队列);
枚举=browser.getEnumeration();
int i=1;
while(枚举.hasMoreElements()){
Object nextElement=enumeration.nextElement();
System.out.println(“读取消息”+i++);
试一试{
睡眠(1000);
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
}捕获(NamingE例外){
log.severy(如getMessage());
e、 printStackTrace();
}最后{
if(namingContext!=null){
试一试{
namingContext.close();
}捕获(NamingE例外){
log.severy(如getMessage());
}
}
}
}捕获(例外e){
//TODO:处理异常
}
如中所述:

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

队列浏览器从JBoss EAP中的JMS提供程序提供的枚举内容不是静态的,无法强制它是静态的

由于JMS不能保证您所寻找的行为,我建议您调整应用程序,使其不依赖于这种行为

我想到了几个备选方案:

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

包含用于浏览的代码。。。。假设初始队列计数为20,当我浏览时,我只想看到这20条消息,并忽略是否有任何新消息进入队列感谢API信息,我在发布问题之前也碰巧看到了这些信息。但它在Weblogic中工作没有问题。如果我找不到JavaDoc中提到的这两个应用程序服务之间行为不同的原因,我将关闭这个作为答案,枚举的内容是否是静态的取决于JMS提供者如何实现它。我认为可以肯定地说Weblogic实现了静态内容,而JBoss EAP的JMS提供程序则没有。关键是,规范不保证这种行为,因此应用程序不应该依赖它,否则在将应用程序移植到其他JMS提供程序时可能会遇到类似的困难。我同意Weblogic与Jboss for JMS Queue browser的实现差异