SpringJMS-MessageListener类中消息的延迟处理

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类的代

我的应用程序正在WAS 8.5上运行&使用JMS MessageListener使用来自IBM MQ 9的消息。当我的应用程序最初启动时,通过从DB访问数据也会形成一个缓存。但是,如果jvm的任何重启或停止/启动都完成了,我的应用程序就会进入空指针状态,因为缓存没有完全加载&onMessage方法开始从MQ拾取消息。Spring使用缓存进行依赖项注入。在这种情况下,如何停止或MessageListener类如何等待缓存完全加载。下面是我的MessageListener以及LoadCache类的代码片段

JMS消息侦听器

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
的这种方法。