创建一个线程以在Spring Webserver中以超时运行任务

Evi*_*ine 8 java spring multithreading spring-mvc

我正在尝试创建一个运行一组任务的线程,如果它没有在特定时间内完成(例如100秒),则抛出异常.目前我试图通过将任务封装到runnable对象中并使用ExecutorServiceFuture类来执行超时执行来实现此目的.但是,当我启动Webservice时,我得到了以下异常:

java.util.concurrent.ExecutionException: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'scopedTarget.localhostInterpolatorHealthCheck': Scope 'request' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton; nested exception is java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.
at java.util.concurrent.FutureTask.report(FutureTask.java:122)
at java.util.concurrent.FutureTask.get(FutureTask.java:202)
Run Code Online (Sandbox Code Playgroud)

我在网上看到它并不像定义你自己的线程那么简单并且开始它们在Spring上启动一个线程,所以我想知道如何做到这一点?我错过了什么?

Ahm*_*mad 3

尝试这个 :

   /**
     * Executes a task with a specified timeout.
     */
    public final class TimeoutController {

        /**
         * Do not instantiate objects of this class. Methods are static.
         */
        private TimeoutController() {
        }

        /**
         * Executes <code>task</code>. Waits for <code>timeout</code>
         * milliseconds for the task to end and returns. If the task does not return
         * in time, the thread is interrupted and an Exception is thrown.
         * The caller should override the Thread.interrupt() method to something that
         * quickly makes the thread die or use Thread.isInterrupted().
         * @param task The thread to execute
         * @param timeout The timeout in milliseconds. 0 means to wait forever.
         * @throws TimeoutException if the timeout passes and the thread does not return.
         */
        public static void execute(Thread task, long timeout) throws TimeoutException {
            task.start();
            try {
                task.join(timeout);
            } catch (InterruptedException e) {
                /* if somebody interrupts us he knows what he is doing */
            }
            if (task.isAlive()) {
                task.interrupt();
                throw new TimeoutException();
            }
        }

        /**
         * Executes <code>task</code> in a new deamon Thread and waits for the timeout.
         * @param task The task to execute
         * @param timeout The timeout in milliseconds. 0 means to wait forever.
         * @throws TimeoutException if the timeout passes and the thread does not return.
         */
        public static void execute(Runnable task, long timeout) throws TimeoutException {
            Thread t = new Thread(task, "Timeout guard");
            t.setDaemon(true);
            execute(t, timeout);
        }

        /**
         * Signals that the task timed out.
         */
        public static class TimeoutException extends Exception {
            /** Create an instance */
            public TimeoutException() {
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)