#java #wildfly-10 #jms-queue
#java #wildfly-10 #jms-queue
Вопрос:
Мой вопрос здесь заключается в том, чтобы узнать, как я могу обрабатывать нагрузку на сервер, если очередь jms (Wildfly 10) заполняется в высокой степени. Проблема в том, что сообщения постоянно добавляются в очередь JMS, но они обрабатываются одно за другим.Написанная логика заключается в обработке сообщений только по одному.Мы не можем обрабатывать несколько сообщений одновременно, логика которых не может быть изменена. Но это приводит к увеличению нагрузки на сервер, поскольку очередь загружается большим количеством сообщений. Как я могу управлять очередью на этом этапе.
Вот пример кода, который я использую для создания и потребления:-
Следующий код выполняется по расписанию каждые 100 миллисекунд и извлекает 100 сообщений из базы данных и отправляет в очередь.
Arraylist arrMessages=GetMessagesFromdatabase();
для (MessageObject obj:arrMessages) Отправьте messagetoqueue(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 миллисекунд запускается другой schedular, который забирает сообщения из очереди и пересылает их для обработки одно за другим.
Потребительский код:-
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());
}
Комментарии:
1. Используйте не встроенный сервер JMS, а автономную установку. Настройте ее на переполнение на диск и убедитесь, что она может обрабатывать отставание. Тогда производительность wildfly не пострадает при заполнении очередей. Это также позволит вам масштабироваться, это сложно сделать, если очередь находится на том же сервере приложений, что и ваше приложение.
2. Но как этого добиться, потому что наша очередь добавлена на сервер wildfly, который является нашим сервером приложений
3. Да, поэтому, если вы не хотите, чтобы брокер запускался внутри Wildfly, вам нужно использовать другую очередь. Тот, который находится в автономном брокере. Необходимо указать и клиенту, и серверу на этого брокера. В качестве альтернативы, вероятно, существуют варианты настройки встроенного брокера для лучшей обработки нагрузки на память, но я ими не пользовался.