在Spring Webservice中创建新线程

时间:2016-03-09 17:32:40

标签: java spring multithreading spring-mvc tomcat

我目前正在维护一个大型的Spring MVC应用程序,该应用程序位于大型企业Java应用程序之上。我所在领域的Spring MVC的目的是显示以支持应用程序的当前状态 - 它通过将健康检查发送到应用程序的各个不同模块来实现此目的。

我目前想要为此安装超时,方法是在单独的线程中启动运行状况测试,并使用ExecutorService执行计时并在线程花费的时间超过x秒时进行终止。我跟着this excellent answer并将我的HealthCheckRunner(其中包含HealthCheck)封装到我称为Runnable的{​​{1}}类中。目前的实现如下:

HealthCheckWorker

但是,我收到 HealthCheckWorker hcw = new HealthCheckWorker(healthCheck,runner); Thread thread = new Thread(hcw); final ExecutorService executor = Executors.newSingleThreadExecutor(); final Future future = executor.submit(thread); executor.shutdown(); future.get(60, TimeUnit.SECONDS); 错误。我该如何解决这个问题?

3 个答案:

答案 0 :(得分:0)

使用@Async。您获得Future cancel方法。

答案 1 :(得分:0)

根据你的问题,这里是你如何实现这个目标

@Configuration
public class ListenerConfig {

    @Bean
    public RequestContextFilter requestContextFilter() {
        RequestContextFilter requestContextFilter = new RequestContextFilter();
        requestContextFilter.setThreadContextInheritable(true);
        return requestContextFilter;
    }
}

答案 2 :(得分:0)

在这个问题上,答案非常复杂。我的第一个建议是,如果你想使用一些与网络线程相关的数据更加正确,请使用这些数据并将健康服务构建为对Web上下文的松散复制服务,以便根据需要进行扩展。如果你能够以一种方式设计你的HealthChecker,你可以使用一个Spring Integration管道,在网关上有超时,使用消息系统作为ActiveMq,Rabit等,或者使用multi thead approch作为在你的问题中,但关键点是如果热量过程的过程很复杂,因为我不知道你必须汇总来自更多数据源的某些数据或者像这样的情绪,但如果你的服务被数据化为你只有你的网络请求本地的thrad不应该像你一样有问题,你可以从许多选项中获益,以扩展您的服务

我希望这种反思可以帮助您找到解决方案