我正在创建一个 Web 应用程序,在此我将创建许多服务和执行程序来执行一些任务。我已经扩展了分派器 servlet 并在 init 方法中启动了执行程序或其他线程。这是正确的方法吗?
现在假设如果有任何请求来了,并且那个执行器或类似的任务执行线程在抛出异常后死亡。
1.我想它也会影响其他请求。那么在这种情况下我该怎么办?
2.如何创建一个监控线程来检查所有执行线程和执行器的关键任务是否正常运行?
3.在这种情况下,我是否应该让另一个备份执行器准备并推迟接管失败的执行器?如果是,那怎么办?
我正在创建一个 Web 应用程序,在此我将创建许多服务和执行程序来执行一些任务。我已经扩展了分派器 servlet 并在 init 方法中启动了执行程序或其他线程。这是正确的方法吗?
现在假设如果有任何请求来了,并且那个执行器或类似的任务执行线程在抛出异常后死亡。
1.我想它也会影响其他请求。那么在这种情况下我该怎么办?
2.如何创建一个监控线程来检查所有执行线程和执行器的关键任务是否正常运行?
3.在这种情况下,我是否应该让另一个备份执行器准备并推迟接管失败的执行器?如果是,那怎么办?
这是一个旧的,但也许它会帮助某人:)
对于 ExecutorService 有一个很好的例子来说明如何解决 Codahale Metrics 中的问题:https ://github.com/dropwizard/metrics/blob/master/metrics-core/src/main/java/com/codahale/metrics/InstrumentedExecutorService .java
我没有发现任何对 Spring AsyncTaskExecutors 一样好的东西:/
自从我使用 Executor 已经有一段时间了,您是在使用 Java、Spring 的内置执行器之一,还是在滚动您自己的?Spring 有很多,我认为 Java 为您提供了两三个具体的实现。
无论如何,我认为答案是推出某种监控服务,比如如果你有可用的 JMX 的话。如果你想自动连接你的 Executors,你可以使用ApplicationContextAware接口来获取对ApplicationContext的引用,它有一个名为getBeansOfType()的方法。如果你想采用更直接的方法,那么你可以简单地编写你的监控服务来直接将执行器注入其中。
另一种选择是获取外部监控框架/应用程序。像 Dynatrace 之类的东西,它附加到 JVM 进程并监视事物,或者,如果您不介意切换应用程序服务器,SpringSource 的 tcServer,它具有可选的检测 Spring JAR 并提供大量开箱即用的监视。