JMS队列静态快照
我需要浏览一个JMS队列,并根据存在多少特定条件的消息对其进行过滤 但问题在于JBoss EAP,在浏览队列时,如果出现新消息,也会在浏览中考虑,这会使流程运行太长时间,因为此应用程序不断收到大量消息 基本上,我需要了解是否可以获取队列的静态快照,以便在不考虑新消息和即将出现的消息的情况下扫描消息 PS:这在WebLogicServer中运行良好 以下是浏览器代码:JMS队列静态快照,jms,jboss-eap-7,Jms,Jboss Eap 7,我需要浏览一个JMS队列,并根据存在多少特定条件的消息对其进行过滤 但问题在于JBoss EAP,在浏览队列时,如果出现新消息,也会在浏览中考虑,这会使流程运行太长时间,因为此应用程序不断收到大量消息 基本上,我需要了解是否可以获取队列的静态快照,以便在不考虑新消息和即将出现的消息的情况下扫描消息 PS:这在WebLogicServer中运行良好 以下是浏览器代码: Context namingContext=null; 试一试{ 字符串userName=System.getProperty(“
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不能保证您所寻找的行为,我建议您调整应用程序,使其不依赖于这种行为
我想到了几个备选方案:
- 设置浏览器将检查的邮件数量上限
- 在创建浏览器之前,使用特定于提供程序的管理调用获取队列中的邮件数,然后仅浏览该数量的邮件