Spring JMS - задержка обработки сообщений в классе MessageListener - PullRequest
0 голосов
/ 24 февраля 2020

Мое приложение работает на 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 секунд, но это не помогло. Любое исправление относительно того, как этого можно достичь?

...