Конфигурация JBossMQ - заполнение jms_messages, несмотря на настройки. Также количество потоков MDB
Я сдаюсь с форумами сообщества JBoss - там никогда не будет ответа на вопрос. Так что попробуйте здесь вместо.
Я написал небольшую тестовую программу, чтобы помочь мне диагностировать проблему, с которой я столкнулся в реальной среде, но меня немного смущает множество настраиваемых настроек с помощью JBoss MQ, и еще больше смущает тот факт, что ни одна из них не создает никаких разница.
Среда JBoss 4.0.,4.
В реальной среде соединение JMS из автономного приложения Java с темой JBoss MQ (обслуживаемой MDB) на удаленной машине теряется. У меня нет никакой доступной информации о том, почему она теряется (и включается прослушиватель исключений).
Поэтому я создал тестовую среду с Java-приложением, которое отправляет TextMessages (содержащие возрастающее число) в раздел на удаленном JBoss.
Все, что делает код MDB, это печатает число в TextMessage.
Первое, что я заметил, это то, что печатаемый поток называется "JMS SessionPool Worker-XX", где XX - от 0 до 32. Когда я снова запускаю приложение отправителя, значение XX составляет от 32 до 46. И третье run, значение от 46 до 60. Шаблон всегда один и тот же - больше потоков используется для первого запуска после запуска JBoss и 14 или 15 потоков для последующих запусков.
Итак, вопрос 1: есть ли объяснение этой модели?
Во время выполнения, которое отправляет около 15000 сообщений, на компьютере JBoss создается таблица jms_messages. Это означает, что JBoss MQ не может идти в ногу, верно? Я предположил, что объем памяти должен превышать пороговое значение, указанное в определении MessageCache MBean в mysql-jdbc2-service.xml. Но когда я наблюдаю за памятью JVM, она не приближается к значению 150 МБ, указанному для HighMemoryMark. Наверное, я неправильно понял этот комментарий по поводу определения компонента MessadeCache: "Как только использование памяти JVM достигнет максимальной отметки памяти, старые сообщения в кеше начнут храниться в DataDirectory". Я думал, что это означает, что когда использование кучи достигнет 150 МБ, полученные сообщения начнут записываться в jms_messages, но, очевидно, я ошибся.
Вопрос 2: при каких обстоятельствах JBoss MQ начинает запись в jms_messages?
И последний вопрос - имеет ли параметр конфигурации контейнера, приведенный ниже, какое-либо влияние на число потоков, которые я наблюдаю при обработке сообщений?
<container-pool-conf>
<MaximumSize>500</MaximumSize>
<container-pool-conf>
Спасибо.
1 ответ
Прошло много времени с тех пор, как мне нужно было использовать JBoss MQ... так что это не совсем ответ на ваши (интересные) вопросы, но может помочь в любом случае.
Если вы используете встроенную базу данных HSQL в качестве хранилища сообщений для JBoss MQ, то вы не сможете справиться с такими нагрузками, как 15 тыс. Сообщений, отправленных за короткое время. Вам нужно переключиться на реальную базу данных, если вы не хотите отказаться от постоянного хранения сообщений (насколько я помню, вы можете настроить это), что хорошо для производительности, но некоторые сообщения могут быть потеряны навсегда.
JBoss MQ не совсем лучший JMS-провайдер, когда-либо созданный. На самом деле, это вряд ли готовое к работе решение, и работать с ним - настоящая боль (нет хорошей документации, странной конфигурации, что вы испытываете сейчас). Вот почему люди JBoss переключились в JBoss 5.X на JBoss Messaging (на самом деле в коммерческом JBoss 4.X EAP - не GA - они всегда использовали JBoss Messaging).
Правда, не самый лучший вариант - перейти на HornetQ - он хорошо документирован, надежен и готов к работе с очень большими нагрузками.