Java 在SpringWebService中创建新线程

Java 在SpringWebService中创建新线程,java,spring,multithreading,spring-mvc,tomcat,Java,Spring,Multithreading,Spring Mvc,Tomcat,我目前正在维护一个大型SpringMVC应用程序,它位于一个大型企业Java应用程序之上。我所在区域的SpringMVC的目的是显示以支持应用程序的当前状态——它通过对应用程序的各个不同模块进行运行状况检查来实现这一点 我目前想为此安装一个超时,方法是在一个单独的线程中启动运行状况测试,并使用ExecutorService进行计时,如果线程花费的时间超过x秒,则执行终止。我遵循并封装了我的HealthCheckRunner(它接受HealthCheck)到一个Runnable类中,我称之为Hea

我目前正在维护一个大型SpringMVC应用程序,它位于一个大型企业Java应用程序之上。我所在区域的SpringMVC的目的是显示以支持应用程序的当前状态——它通过对应用程序的各个不同模块进行运行状况检查来实现这一点

我目前想为此安装一个超时,方法是在一个单独的线程中启动运行状况测试,并使用
ExecutorService
进行计时,如果线程花费的时间超过x秒,则执行终止。我遵循并封装了我的
HealthCheckRunner
(它接受
HealthCheck
)到一个
Runnable
类中,我称之为
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);

但是,我得到了一个
java.lang.IllegalStateException:未找到线程绑定的请求:您是在实际web请求之外引用请求属性,还是在最初接收线程之外处理请求?如果您实际上在web请求中操作,但仍然收到此消息,则代码可能在DispatcherServlet/DispatcherPortlet之外运行:在这种情况下,请使用RequestContextListener或RequestContextFilter公开当前请求。
错误。如何解决此问题?

使用。您可以使用
取消
方法。

根据您的问题,这里是如何实现这一点的

@Configuration
public class ListenerConfig {

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

正确回答这个问题是非常复杂的。我的第一个建议是,如果您想使用一些与web线程相关的数据,那么就更正确地使用这些数据,并将healt服务构建为与web上下文相关的松散copled服务,以便根据您的需要进行扩展。如果您能够以一种您有许多扩展选项的方式设计您的HealthChecker,那么您可以使用网关上带有超时的Spring集成管道,使用消息传递系统ActiveMq、Rabit等,或者使用您所问的多线程方法,但关键是,如果热交换过程很复杂,因为我不知道你必须从更多的数据源或类似的地方收集一些数据,但是,如果您的服务被分解为您仅在web请求的thrad本地中拥有的数据,您就不会有像您这样的问题,并且您可以受益于许多扩展您的服务的选项


我希望这个反思能帮助你找到一个解决方案

你是在使用tomcat还是像jboss/wildfly这样的应用程序?@ValerioVaudi是的,它是tomcatok,这似乎仍然是我的问题,但举个例子,最近的应用程序服务器没有手动注册实例thread@ValerioVaudi让我们假设你是对的。我如何让tomcat制作一个新线程?我很新,正如您所说:)您很可能正试图从您的后台线程访问一个请求范围的bean,该bean与请求无关。只是不要。将后台线程所需的状态传递给可运行构造函数。但这并不能解决问题。@JB Nizet-没错。@Async注释的方法需要预先提供所有需要的信息(作为方法参数),类似于您在问题下的注释所建议的。我错过了那部分。