Один против многопоточного JMS-производителя
Я хотел посмотреть, сколько разницы во времени будет иметь использование многопоточного производителя вместо однопоточного. Я установил ActiveMQ на своем локальном компьютере, написал класс производителя, который инициализирует и запускает соединение JMS в своем конструкторе. Я установил лимит сообщений на 3M, и для отправки всех сообщений в ActiveMQ потребовалось около 50 секунд. Я отправил только одну строку "Hello World" 3 раза.
Затем я использовал один и тот же объект-производитель (одно соединение, но несколько сеансов) и запустил его с помощью ExecutorService с размером потока восемь. вrun
метод, я бы разделил 3M на 8, чтобы убедиться, что каждый поток отправляет не более 375000 сообщений. В этом случае для отправки всех сообщений потребовалось около 60 секунд.
ExecutorService service = Executors.newFixedThreadPool(8);
for (int i = 0; i < 8; i++) {
service.execute(producer);
}
Затем я создал восемь производителей, каждый из которых имел собственное соединение, и запустил их с помощью ExecutorService или потока размером восемь. На этот раз все сообщения 3М заняли около 68 секунд.
for (int i = 0; i < 8; i++) {
service.execute(new Producer());
}
Мне интересно, почему однопоточный производитель будет лучше работать здесь? Я запускал каждый сценарий около 10 раз, но результаты остались прежними.