Несколько потребителей в одном сеансе ActiveMQ - PullRequest
0 голосов
/ 21 января 2019

У меня есть Java-приложение, и мне нужна помощь в проверке того, что я делал до сих пор!приложение имеет Quartz Daemon, который настроен на запуск каждые 200 мс для опроса сообщения из очереди ActiveMQ, время обработки для демона составляет около 2-3 минут для каждого сообщения, когда срабатывает триггер Daemon, тогда другой поток запускает задачу Daemon дляопрашивать другое сообщение и обрабатывать его до 50 потоков параллельно, все потоки используют одно и то же соединение и сеанс с ActiveMQ, в котором он настроен с размером по умолчанию Prefetch.

Как вы думаете, есть что-нибудьне так с этой реализацией?Спасибо!

1 Ответ

0 голосов
/ 21 января 2019

Если вам нравится текущий дизайн и вас беспокоит только реализация, то единственная причина для беспокойства, которую я здесь вижу, - это любой возможный одновременный доступ к javax.jms.Session. Session не является потокобезопасным, поэтому к нему никогда не должен обращаться более чем один поток одновременно. javax.jms.Connection является поточно-ориентированным, так что это не проблема. Может быть безопаснее / проще просто создать сеанс для каждого потребителя. Сессии довольно легкие, поэтому я не ожидаю реального снижения производительности.

Чтобы избежать проблем параллелизма сеанса, вы можете даже рассмотреть возможность использования пула соединений (например, PooledJMS , который основан на реализации пула соединений ActiveMQ).

Ваш размер предварительной выборки может быть проблемой, если вы начнете сталкиваться с проблемами потребительского голодания, но вы не указываете, каким будет объем вашего сообщения, поэтому трудно сказать, будет ли это выпускать или нет. Следует помнить две вещи:

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

Отрегулируйте размер предварительной выборки соответственно.

Что касается дизайна в целом, я не могу не думать, что реализация javax.jms.MessageListener была бы лучше здесь. Один MessageListener может получать сообщения и передавать их потокам для обработки. Это позволит избежать зависимости от кварца, а также опрос.

...