Итак, я использовал параллелизм весной jms 50-100, разрешив максимальное количество подключений до 200. Все работает, как и ожидалось, но если я пытаюсь получить 100k сообщений из очереди, я имею в виду, что на моих sqs есть 100k сообщений, и я их читаючерез пружину jms нормальный подход.
@JmsListener
Public void process (String message) {
count++;
Println (count);
//code
}
Я вижу все журналы в моей консоли, но после примерно 17k он начинает выдавать исключения
Что-то вроде: aws sdk exception: port уже используется.
Почему я вижу это исключение и как это сделать.Я от этого избавляюсь?
Я пытался поискать это в интернете.Ничего не удалось найти.
Моя настройка:
Параллелизм 50-100
Задать сообщения для задачи: 50
Клиент подтвердил
timestamp=10:27:57.183, level=WARN , logger=c.a.s.j.SQSMessageConsumerPrefetch, message={ConsumerPrefetchThread-30} Encountered exception during receive in ConsumerPrefetch thread,
javax.jms.JMSException: AmazonClientException: receiveMessage.
at com.amazon.sqs.javamessaging.AmazonSQSMessagingClientWrapper.handleException(AmazonSQSMessagingClientWrapper.java:422)
at com.amazon.sqs.javamessaging.AmazonSQSMessagingClientWrapper.receiveMessage(AmazonSQSMessagingClientWrapper.java:339)
at com.amazon.sqs.javamessaging.SQSMessageConsumerPrefetch.getMessages(SQSMessageConsumerPrefetch.java:248)
at com.amazon.sqs.javamessaging.SQSMessageConsumerPrefetch.run(SQSMessageConsumerPrefetch.java:207)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: com.amazonaws.SdkClientException: Unable to execute HTTP request: Address already in use: connect
Обновление: я искал проблему, и кажется, что новые сокеты создаются, пока не будут исчерпаны все сокеты.
Моя весенняя версия jms будет 4.3.10
. Чтобы повторить эту проблему, просто выполните описанную выше конфигурацию с максимальным соединением 200 и валютой 50-100 и отправьте несколько сообщений по 40 КБ вsqs queue .. https://github.com/adamw/elasticmq можно использовать в качестве локального стекового сервера, который реплицирует Amazon sqs.Прокомментируйте jms listener и используйте нагрузочное тестирование soap ui и вызовите send message, чтобы запустить много сообщений.Только потому, что вы прокомментировали аннотацию @jmslistener, она не будет принимать сообщения из очереди.Как только вы увидите, что отправили 40 тыс. Сообщений, остановитесь.Раскомментируйте @jmslistener и перезапустите сервер.
Обновление:
DefaultJmsListenerContainerFactory factory =
new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setDestinationResolver(new DynamicDestinationResolver());
factory.setErrorHandler(Throwable::printStackTrace);
factory.setConcurrency("50-100");
factory.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
return factory;
Обновление:
SQSConnectionFactory connectionFactory = new SQSConnectionFactory( new ProviderConfiguration(), amazonSQSclient);
Обновление:
Сведения о конфигурации клиента:
Protocol : HTTP
Max connections : 200
Обновление:
Я использовал класс фабрики соединений с кешем и похоже.Я прочитал о переполнении стека и в их официальной документации, чтобы не использовать класс фабрики соединений с кешем и фабрику контейнеров слушателя jms по умолчанию.
https://stackoverflow.com/a/21989895/5871514
Это выдает ту же ошибку, что и раньше.
обновление
Моя цель - получить 500 т / с, то есть я должен иметь возможность потреблять так много .. Итак, я попробовал этот метод, и кажется, что я могу достичь100-200, но не более того ... Плюс эта штука является блокирующим при высоком параллелизме .. Если вы используете это .. Если у вас есть какое-то лучшее решение для достижения этого ... Я весь слух.
** обновлено **
Я использую amazonsqsclient