Мое приложение работает на WAS 8.5 и принимает сообщения от IBM MQ 9, используя JMS MessageListener. Когда мое приложение запускается изначально, также создается кеш путем доступа к данным из БД. Однако, если выполняется какой-либо перезапуск или останов / запуск 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 секунд, но это не помогло. Любое исправление относительно того, как этого можно достичь?