Я согласен с предыдущими ответами.
Когда у вас низкая производительность потребления сообщений с Spring DefaultMessageListenerContainer (DML C), это почти всегда означает, что потребитель / сеанс / соединение JMS воссоздаются для каждого прочитанного сообщения.
В случае отсутствия транзакции вы можете кэшировать DML C потребителя. DML C будет использовать одно соединение JMS и запускать несколько сеансов JMS для соединения. У каждого сеанса будет получатель сообщений JMS.
В случае транзакции у вас не будет кеширования в DML C, и вам придется использовать фабрику кэширующих соединений, чтобы избежать проблем с производительностью. Посмотрите на org.apache.activemq.pool.PooledConnectionFactory
или org.messaginghub.pooled.jms.JmsPoolConnectionFactory
для этой функции.
Что касается ваших вопросов, я бы также не стал беспокоиться о TaskExecutor
. Я бы порекомендовал для начала параллелизм 5-5
. Я обнаружил, что одинаковое минимальное и максимальное количество потребителей (просто наличие прибитого пула) дает преимущества в стабильности и производительности.
Что касается сбоя ActiveMQ, это связано с предварительной выборкой ActiveMQ. По умолчанию ActiveMQ имеет значение предварительной выборки 1000. Потребитель сообщения JMS запрашивает сообщение, а брокер доставляет это сообщение и 999 других сообщений в предварительной выборке. Если потребитель / сеанс затем закрывается, 999 сообщений отбрасываются на стороне клиента, а затем повторно ставятся в очередь на брокере. Это очень оскорбительно для брокера и не очень хорошо обрабатывается.
Также имейте в виду, что если у вас есть 5 одновременных потребителей, например, тогда первый потребитель получит 1000 сообщений, а затем следующий получит 1000 сообщений и так далее. Таким образом, если у вас в очереди всего 500 сообщений, тогда будет активен только один потребитель. Вам потребуется 5000 сообщений в очереди для активации всех 5 потребителей.
В случае сомнений отключите предварительную выборку сообщений в конфигурации клиента:
tcp://broker_uri:61616?jms.prefetchPolicy.all=0