在spring中限制@JmsListener(阻止TaskRejectedException)

时间:2017-12-20 18:40:45

标签: spring spring-boot jms spring-jms

我目前有一个配置了以下threadpool的JMSListener:

    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(5);
    executor.setMaxPoolSize(10);
    executor.initialize();

我正在侦听的队列有超过100条消息,当我启动监听器时,它将处理前10条消息没有问题,然后我将获得 TaskRejectedException 异常剩下的消息。

我的意图是,如果没有可用的线程来处理所述消息,@ JmsListener不应该提取任何新消息。有谁知道这种配置是否可行?我使用的是springboot 1.5.3版本。

-TIA

1 个答案:

答案 0 :(得分:1)

如果你不想丢失信息,你根本不应该使用遗嘱执行人;容器将在执行程序中排队后立即响应每条消息。如果系统死机,任何尚未处理的消息都将丢失。

相反,使用容器的并发设置来多线程化您的侦听器。

如果您真的必须使用遗嘱执行人并且不介意丢失消息,请在遗嘱执行人中使用呼叫者运行政策 - SELECT Q1.*, Q2.tags, Q3.image_id FROM ( SELECT phppos_items.item_id, phppos_items.name, SUM(phppos_location_item_variations.quantity) as quantity FROM `phppos_items` LEFT JOIN `phppos_item_variations` ON `phppos_item_variations`.`item_id` = `phppos_items`.`item_id` LEFT JOIN `phppos_location_item_variations` ON `phppos_location_item_variations`.`item_variation_id` = `phppos_item_variations`.`id` and `phppos_location_item_variations`.`location_id` = 1 GROUP BY `phppos_items`.`item_id` ) as Q1 LEFT JOIN ( SELECT i.item_id, GROUP_CONCAT(DISTINCT t.name) as tags FROM phppos_items i LEFT JOIN phppos_items_tags it ON i.item_id = it.item_id LEFT JOIN phppos_tags t ON it.tag_id = t.id GROUP BY i.item_id ) as Q2 ON Q1.item_id = Q2.item_id LEFT JOIN ( SELECT item_id, MIN(image_id) as image_id FROM phppos_item_images GROUP BY item_id ) as Q3 ON Q1.item_id = Q3.item_id