Как эффективно обрабатывать очередь JMS, избегая нагрузки на сервер - PullRequest
2 голосов
/ 26 марта 2019

Мой вопрос здесь заключается в том, чтобы узнать, как я могу справиться с нагрузкой на сервер, если очередь jms (Wildfly 10) заполняется с высокой степенью заполнения.Проблема в том, что сообщения постоянно добавляются в очередь JMS, но они обрабатываются по одному. Написанная логика заключается в обработке сообщений одно за другим. Мы не можем обрабатывать несколько сообщений за раз, то есть логику нельзя изменить.Но это приводит к увеличению нагрузки на сервер, так как очередь загружается многими сообщениями.Как я могу управлять очередью на этом этапе.

Вот пример кода, который я использую для производства и потребления: -

Следующий код проходит по расписанию каждые 100 миллисекунд и получает 100 сообщений избазу данных и отправить в очередь.

Arraylist arrMessages = GetMessagesFromdatabase ();

для (MessageObject obj: arrMessages) sendMessagetoQueue (obj);

Код производителя: -

void sendMessagetoQueue(MessageObject messageObject){
        ConnectionFactory connectionFactory = JMSConstants.getConnFactory.getJmsConnectionFactory();
            Context initialContext = JMSConstants.getConnFactory.getInitialcontext();
            Connection connection = null;

            String destinationName = "java:/jms/queue/Queue";
            MessageProducer publisher = null;
            Session session = null;

            try {

                connection = connectionFactory.createConnection();

                Queue queue = (Queue) initialContext
                        .lookup(destinationName);

                session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

                publisher = session.createProducer(queue);

                connection.start();

                ObjectMessage objMessage = session.createObjectMessage(messageObject);

                publisher.send(objMessage);
                } catch (Exception exc) {
                exc.printStackTrace();
                LOG.error(exc);
            }
}

Затем каждые 100 миллисекунд запускается другое расписание, которое получает сообщение из очереди и пересылает его для обработки по одному.

Код потребителя: -

ConnectionFactory connectionFactory = JMSConstants.getConnFactory.getJmsConnectionFactory();
        Context initialContext = JMSConstants.getConnFactory.getInitialcontext();
        Connection connection = null;
        String destinationName = "java:/jms/queue/Queue";
        Session session = null;
        MessageConsumer consumer = null;
        Boolean checkFlag = true;
        QueueBrowser queueBrowserconnect = null;
        try {



                connection = connectionFactory.createConnection();

                Queue queue = (Queue) initialContext.lookup(destinationName);

                session = connection.createSession();
                consumer = session.createConsumer(queue);
                Queue senderqueueconnect = (Queue) initialContext.lookup(senderQueueconnect);
                queueBrowserconnect = session.createBrowser(senderqueueconnect);

                connection.start();


                ObjectMessage objectMessage = (ObjectMessage) consumer.receive(1);

                if (objectMessage != null) {

                    objectMessage.acknowledge();

                    MessageObject messageobject= (MessageObject) objectMessage.getObject();

                    //Send object for processing
                    messageService.processInputFromQueue(messageobject);

                }


        } catch (Exception exc) {
            exc.printStackTrace();
            LOG.error(exc.getMessage());
        }
...