Долгий трейтинг в onMessage (): как справиться?Я хочу, чтобы этот метод был вызван потоком - PullRequest
2 голосов
/ 07 апреля 2011

При получении сообщения JMS я испытываю некоторую тяжелую травму с высоким риском тайм-аута.

Весь смысл использования JMS для меня состоит в том, чтобы позволить такой вид вычислений выполнять асинхронно. (Я не хочу, чтобы мой другой потребитель блокировал, если один из них блокирует, я не хочу, чтобы мой производитель блокировал, когда-либо). в идеале, я также хочу, чтобы мой потребитель мог получать второе сообщение во время вычисления первого

Прямо сейчас я использую уникальный javax.jms.Session для отправки и использования моего сообщения. Я знаю, что это была ошибка зачатия. Как указано в документе:

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

Но также:

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

Решением может быть использование сеанса для производителя и разного сеанса для каждого потребителя, но потребители все равно смогут обрабатывать только одно сообщение за раз

Для моего понимания метод onMessage вызывается провайдером Jms (ActiveMq в моем случае). Может ли какая-либо конфигурация позволить этому вызову быть вызванным в нескольких потоках?

Может быть, этот вопрос отражает серьезный недостаток в моем понимании того, как следует использовать JMS / мою концепцию. Пожалуйста, не стесняйтесь обсуждать;)

Спасибо!

Редактировать:

моя проблема в одном предложении:

  • если у меня есть 2 потребителя, и если одному из них потребуется много времени для обработки onMessge, все остальные потребители будут блокироваться.

Что делается сегодня: Я использую java.util.concurent.Executor , но я не большой поклонник этого решения. Я нахожусь в контексте сервера приложений Tomcat и уже использую слишком много потоков, я хотел бы делегировать эту ответственность более надежной группе кода. (Например: activeMq)

Редактировать 2:

Подробнее:

  • Я не использую транзакционный сеанс

  • Я использую Auto_Acknoledge

Ответы [ 3 ]

1 голос
/ 07 апреля 2011

Твоему описанию трудно следовать, и я не думаю, что это проблема языка.Насколько я понимаю, ваш производитель блокирует, потому что потребителю требуется много времени для обработки сообщения.Если это правда, это означает, что вы используете надежные сообщения и явное подтверждение после обработки сообщения.

И если это так, два возможных решения: (1) решить, действительно ли вам нужны гарантии и использоватьнеявное подтверждение и / или недолговечные сообщения, если нет, или (2) надежно сохранить сообщение в получателе, подтвердить, а затем обработать сообщение.


На основании ваших правок краткий ответ:«Да, вы можете создавать темы.»Поскольку производителя не волнует, способен ли потребитель обработать сообщение, у вас есть большая гибкость в том, как вы его обрабатываете.

Я подозреваю, что ActiveMQ обладает некоторым свойством, которое позволит вам контролироватьколичество потоков обработки сообщений.Я не использовал его широко (предпочитаю HornetQ), поэтому не могу дать однозначного ответа.

Однако, даже если это так, я бы предпочел использовать Java ThreadPoolExecutorService (думаю, это названиеоб этом; см. java.util.concurrent).Основная причина в том, что он предоставляет свою собственную внутреннюю очередь работы.Независимо от того, сколько потоков вы добавляете в среду обмена сообщениями, всегда есть вероятность, что у вас будет достаточно работы, чтобы связать их.С ExecutorService вы будете продолжать получать и помещать в очередь сообщения, пока не закончится память (и если это произойдет, у вас есть некоторые проблемы с дизайном, которые нужно решить).

1 голос
/ 08 апреля 2011

javax.jms.Session и ниже (MessageConsumer, MessageProducer) являются однопоточными. Если вам нужна многопоточность, вам нужно несколько сессий. Одна сессия на потребителя.

Каждый потребитель будет однопоточным. Но реализация JMS должна обеспечивать многопоточную доставку сообщений между несколькими потребителями, если они созданы из нескольких сеансов.

0 голосов
/ 07 апреля 2011

Вы должны просто сократить свои тяжелые черты в процессе, который может быть обработан в одной транзакции.

Я не могу вам помочь, так как вы не упоминаете, о чем эта черта.

...