我是否需要在实现 MessageListener 类的类的 onMessage 方法中关闭执行程序?

我有一个使用 Spring 框架的 Java 应用程序。它是一个侦听器应用程序,它使用线程非常快速地从某个源异步获取消息并将其保存到数据库中。

我正在使用 ExecutorService,它在 Servlet 类中初始化并存储在可以通过该onMessage()方法访问的静态变量中

我想知道的是,如果我总是收到消息,是否需要关闭 ExecutorService。如果事实证明我需要关闭执行程序,我应该把它放在哪里?

@Override
public void onMessage(Message message) {
    String msg = "";
    ExecutorService taskExecutor;

    try {
        taskExecutor = StartupServlet.taskManager.getExecutor();
        msg = extractMessage(message);
        taskExecutor.execute(new MessageTask(msg));
        // Where do I place taskExecutor.shutdown();? Doing so here will reject the succeeding tasks, which breaks the listener.
    } catch (Exception e) {
        e.printStackTrace();
    }
}

我正在使用 Spring Beans 来初始化线程并且它工作正常。我只是不确定是否应该关闭它或根本不应该关闭它。

<bean id="taskManager" class="com.company.threading.TaskManager">
    <property name="executor" ref="executorService"/>
</bean>

<bean id="executorService" 
      class="java.util.concurrent.Executors" 
      factory-method="newFixedThreadPool" 
      destroy-method="shutdown">
    <constructor-arg value="5"/>
</bean>

谢谢你。

谢尔盖·普罗科菲耶夫

假设这com.company.threading.TaskManager是您的自定义类,您不需要调用shutdowninside onMessage,因为如果这样做,您将无法处理其他消息。

您需要做的是在 Spring 上下文关闭时优雅地终止您的执行程序

@Component
public class ContextClosedHandler implements ApplicationListener<ContextClosedEvent> {

    @Autowired
    @Qualifier("executorService")
    private ExecutorService executor;

    @Override
    public void onApplicationEvent(ContextClosedEvent event) {
        executor.shutdown();
        try {
            // define how much time to wait for the completion
            if (!executor.awaitTermination(15, TimeUnit.MINUTES)) { 
                List<Runnable> incompleteTask = executor.shutdownNow();
                // do that you want with them
            }
        } catch (InterruptedException e) {
            // handle or log exception
        }
    }
}

另外,我建议您不要像这样使用静态对象来获取执行程序实例StartupServlet.taskManager.getExecutor()让春天为你做吧!

@Autowired
@Qualifier("executorService")
private ExecutorService executor;

希望能帮助到你!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

WAS 8.5中的MessageListener类强制转换异常

来自分类Dev

为什么我需要在实现接口的类中实现接口的所有方法?

来自分类Dev

单元测试 MessageListener 类

来自分类Dev

抽象类是否需要在Java 7中实现整个接口?

来自分类Dev

我的类方法中是否需要“ this指针”?

来自分类Dev

我是否需要在实体框架6中使用POCO类

来自分类Dev

使用Angular 2时,是否需要在Typescript中复制我的Entity Framework类?

来自分类Dev

我是否需要在类中定义一个用于依赖项注入的容器?

来自分类Dev

我是否需要在新类中声明构造函数和析构函数?

来自分类Dev

您是否需要在主类中扩展JApplet?

来自分类Dev

使用 Spring Boot 在 RabbitMQ 上不断调用 MessageListener.onMessage

来自分类Dev

在基类中定义接口后,是否需要在派生类中定义相同的接口?

来自分类Java

在基类中编写需要在子类中重写的方法实现?

来自分类Dev

我是否需要测试类中的测试方法

来自分类Java

如果我的类在Java中实现了可比性,是否需要一个equals和Hashcode方法?

来自分类Dev

我的Sinatra API应用程序是否需要类声明?

来自分类Dev

需要在一个类中实现Python itertools函数“chain”

来自分类Dev

让继承的类实现超类的方法

来自分类Dev

Java:在最终类中实现接口的类

来自分类Dev

派生类是否在 Typescript 中实现了基类的接口

来自分类Dev

在 spring 框架中,如果我使用注释而不是 XML 配置,我是否需要在单独的类中初始化 spring 容器?

来自分类Dev

Python中的类实现

来自分类Dev

Python中类的实现

来自分类Dev

我什么时候需要在 Scala 中向我的类添加成员定义?

来自分类Dev

检查类是否包含 jQuery 中的类

来自分类Dev

在C ++(类)中,是否总是需要在头文件中声明函数?

来自分类Dev

是否需要在类构造函数中声明所有成员

来自分类Dev

是否需要在静态类中的每个成员之前键入“ static”?

来自分类Dev

如果goog.require是基类导入的,它是否需要在子类中重复

Related 相关文章

  1. 1

    WAS 8.5中的MessageListener类强制转换异常

  2. 2

    为什么我需要在实现接口的类中实现接口的所有方法?

  3. 3

    单元测试 MessageListener 类

  4. 4

    抽象类是否需要在Java 7中实现整个接口?

  5. 5

    我的类方法中是否需要“ this指针”?

  6. 6

    我是否需要在实体框架6中使用POCO类

  7. 7

    使用Angular 2时,是否需要在Typescript中复制我的Entity Framework类?

  8. 8

    我是否需要在类中定义一个用于依赖项注入的容器?

  9. 9

    我是否需要在新类中声明构造函数和析构函数?

  10. 10

    您是否需要在主类中扩展JApplet?

  11. 11

    使用 Spring Boot 在 RabbitMQ 上不断调用 MessageListener.onMessage

  12. 12

    在基类中定义接口后,是否需要在派生类中定义相同的接口?

  13. 13

    在基类中编写需要在子类中重写的方法实现?

  14. 14

    我是否需要测试类中的测试方法

  15. 15

    如果我的类在Java中实现了可比性,是否需要一个equals和Hashcode方法?

  16. 16

    我的Sinatra API应用程序是否需要类声明?

  17. 17

    需要在一个类中实现Python itertools函数“chain”

  18. 18

    让继承的类实现超类的方法

  19. 19

    Java:在最终类中实现接口的类

  20. 20

    派生类是否在 Typescript 中实现了基类的接口

  21. 21

    在 spring 框架中,如果我使用注释而不是 XML 配置,我是否需要在单独的类中初始化 spring 容器?

  22. 22

    Python中的类实现

  23. 23

    Python中类的实现

  24. 24

    我什么时候需要在 Scala 中向我的类添加成员定义?

  25. 25

    检查类是否包含 jQuery 中的类

  26. 26

    在C ++(类)中,是否总是需要在头文件中声明函数?

  27. 27

    是否需要在类构造函数中声明所有成员

  28. 28

    是否需要在静态类中的每个成员之前键入“ static”?

  29. 29

    如果goog.require是基类导入的,它是否需要在子类中重复

热门标签

归档