У меня проблема с производительностью при получении / приеме сообщений из очереди JMS через сервлет.
Простой запрос через сервлет занимает 10 секунд, чтобы выполнить метод close (чтобы закрыть ресурсы JMS) объекта QueueSession.
Метод закрытия занимает 20-30 секунд, если я использую сервлет несколько раз подряд.
Параллельное выполнение (10 запросов одновременно) занимает 6-7 минут для queueConnection.close ().
В синхронизированном блоке я возвращаюсь к значению 20-30 секунд для выполнения queueConnection.close ().
У меня такое ощущение, что потоки сервлетов получают одинаковое QueueConnection из пула.
Не должно ли быть так, чтобы сервлеты брали бесплатные ресурсы подключения из пула?
Можно выполнить следующие настройки пула фабрики соединений JMS:
Начальный и минимальный размер пула, максимальный размер пула, количество изменения размера пула, время простоя, максимальное время ожидания.
Я пробовал с несколькими настройками для пула, но лучшего результата не получилось.
Я думаю, что я должен также реализовать само объединение для объединения подключений, которые я получаю из пула подключений OpenMQ, верно?
У меня более 40 000 сообщений в очереди, и сообщения параметризованы (с помощью селекторов сообщений), является ли это причиной задержки метода закрытия (для освобождения источников данных JMS)?
Будет ли иметь значение, если я переключусь с сохраняемости на основе файлов на постоянство на основе jdbc, чтобы получить более высокую производительность?
В ответе ниже было предложено использовать UMS-компонент OpenMQ. UMS полезна, но мне нужно использовать селекторы сообщений, и я думаю, что это не поддерживается UMS.
Спасибо!
Coding:
public class MessageReceiver {
...
public MessageReceiver(){
queueName = "myQueuedestination";
jndiContext = new InitialContext();
queue = (Queue) jndiContext.lookup(queueName);
queueConnectionFactory = (ConnectionFactory) jndiContext
.lookup("myQueueconnectionfactory");
queueConnection = queueConnectionFactory.createConnection();
queueConnection.start();
}
...
public String receive(String KEY, String keyValue) throws Exception {
String returnMessage = null;
String messageSelector = getMessageSelector(KEY, keyValue);
Message m = null;
QueueSession queueSession = queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
QueueReceiver queueReceiver = queueSession.createReceiver(queue, messageSelector);
m = queueReceiver.receiveNoWait();
if (queueSession != null) {
try {
queueSession.close();
} catch (JMSException e) {
logger.info("There was an error closing the queueSession");
e.printStackTrace();
}
}
queueSession = null;
if (m != null && m instanceof TextMessage) {
returnMessage = ((TextMessage) m).getText();
}
return returnMessage;
}
...
...
}
Servlet
...
public void init(ServletConfig config) throws ServletException {
...
messageReceiver = new MessageReceiver();
...
}
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException
{
...
...
synchronized (this)
{
message = messageReceiver.receive(KEY, keyValue);
}
...
...
}