SpringJMS-MessageListener类中消息的延迟处理
我的应用程序正在WAS 8.5上运行&使用JMS MessageListener使用来自IBM MQ 9的消息。当我的应用程序最初启动时,通过从DB访问数据也会形成一个缓存。但是,如果jvm的任何重启或停止/启动都完成了,我的应用程序就会进入空指针状态,因为缓存没有完全加载&onMessage方法开始从MQ拾取消息。Spring使用缓存进行依赖项注入。在这种情况下,如何停止或MessageListener类如何等待缓存完全加载。下面是我的MessageListener以及LoadCache类的代码片段 JMS消息侦听器SpringJMS-MessageListener类中消息的延迟处理,spring,jms,ibm-mq,spring-jms,websphere-8,Spring,Jms,Ibm Mq,Spring Jms,Websphere 8,我的应用程序正在WAS 8.5上运行&使用JMS MessageListener使用来自IBM MQ 9的消息。当我的应用程序最初启动时,通过从DB访问数据也会形成一个缓存。但是,如果jvm的任何重启或停止/启动都完成了,我的应用程序就会进入空指针状态,因为缓存没有完全加载&onMessage方法开始从MQ拾取消息。Spring使用缓存进行依赖项注入。在这种情况下,如何停止或MessageListener类如何等待缓存完全加载。下面是我的MessageListener以及LoadCache类的代
public class MQMessageConsumer implements MessageListener {
private static Log log = LogFactory.getLog(MQMessageConsumer.class);
ExecutorService executor = Executors.newFixedThreadPool(500);
@SuppressWarnings("unchecked")
public void onMessage(Message message) {
log.debug("There is a message in the Queue");
String inputXML = null;
if (message instanceof TextMessage) {
try {
inputXML = ((TextMessage) message).getText();
MQMessageProcessor mqp = new MQMessageProcessor(inputXML);
executor.submit(mqp);
} catch (Exception e) {
log.error("Error in processing the message - " + e.getMessage());
}
} else
log.error("Invalid message format, please resend with correct MQ message header as MQSTR");
}
}
LoadCache
public class LoadCache implements ServletContextListener{
private Cache cache;
protected static Log log = LogFactory.getLog(LoadCache.class);
private ApplicationService service = new ApplicationService();
public void contextInitialized(ServletContextEvent event){
cache = Cache.getCache();
try {
System.out.println("Cache building started during strtup");
/*log.debug("Cahe building started during strtup");*/
long startTime = System.currentTimeMillis();
loadProperties(cache);
loadDataTable(cache);
loadOP(cache);
loadUCM(cache);
long endTime = System.currentTimeMillis() ;
System.out.println("Total Cache building time is :"+(endTime - startTime));
/*log.debug("Total Cache building time is :"+(endTime - startTime));*/
} catch (DataAccessException e) {
e.printStackTrace();
log.debug("Error While communicating to database:"+e.getMessage());
}
}
public void contextDestroyed(ServletContextEvent event){
System.out.println("Context Destroyed-LoadCache Gone");
}
}
如何使我的应用程序侦听器等待缓存加载?我还尝试在MessageConsumer类中创建一个默认构造函数&添加了20秒的线程睡眠,但这对aas没有很好的帮助。关于如何实现这一点,有什么解决办法吗?我对SpringJMS的了解很少。但是,能否检查代码中是否有connection.start()方法调用?如果是,请确保在缓存完全初始化后调用connection.start()。调用connection.start()告诉队列管理器开始传递消息。您是否正在使用?然后,我将把
LoadCache
转换成一个bean,它在构造函数中初始化,并使这个bean成为DefaultMessageListenerContainer
的依赖项@DanielSteinmann,我目前正在使用JMS侦听器容器。但是,我可以尝试使用DefaultMessageListenerContainer
的这种方法。