Spring Boot应用程序中的多线程问题,这是什么问题?

时间:2019-05-06 08:30:14

标签: java spring multithreading spring-boot

我有一个spring boot应用程序,在控制器中有一个注入的服务类,那里有一个从线程中调用的服务类方法。 我的应用程序有一个索引页面,用户可以在其中设置值并开始一些计算,设置值发生在该服务类中,然后才开始计算,用户单击一个按钮即可启动控制器中的线程,该线程在服务类中调用方法。结果将显示在不同的页面中,此页面上有一个按钮,可返回到索引页面以使用不同的值开始新的计算。

我想在计算后返回索引页时需要一个新注入的bean,否则,我将修改并使用前一个将给我虚假结果的豆子。

我的服务类别需要什么范围?

我尝试过原型,请求和会话,最后两个在运行代码之前给我错误,首先给我错误的结果。

“上下文初始化期间遇到异常-取消刷新尝试:org.springframework.beans.factory.UnsatisfiedDependencyException:创建名称为'schedulerController'的bean时出错:通过方法'setA'参数0表示的不满意依赖性;嵌套异常为org.springframework .beans.factory.BeanCreationException:创建名称为“ scheduler”的bean时出错:当前线程的作用域“ request”未激活;如果要从单例中引用该bean,请考虑为其定义作用域代理;嵌套异常是java.lang.IllegalStateException:找不到线程绑定的请求:您是在实际的Web请求之外引用请求属性,还是在原始接收线程之外处理请求?如果您实际上是在Web请求中操作并仍然收到此请求消息,您的代码可能正在DispatcherServlet外部运行:在这种情况下,请使用RequestContextListener或RequestContextFilter公开当前请求。西方。”

如何解决问题?

在我的控制器中:

@Autowired
    public void setA(Scheduler schedulerObject) {
        this.schedulerObject = schedulerObject;
    }

    static class thread extends Thread
    {
        public void run()
        {
            try {
                schedulerObject.setRun(true);
                schedulerObject.check();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        public void kill() {
            schedulerObject.setRun(false);
        }
    }

控制器中的此方法将开始计算:

static thread x;

@RequestMapping(value="start")
    public String start() throws InterruptedException
    {
        x=new thread();
        x.start();
        Thread.sleep(1*1000);       
        return "index";
    }
@RequestMapping(value="stop")
    public String stop() throws InterruptedException
    {
        x.kill();   
        x.interrupt();
        return "index";
    }

还有其他控制器方法可以在“ schedulerObject”中进行一些修改,而用户调用的最后一个方法是“ start”和“ stop”

因此,每次用户返回索引页面时,都需要一个新的“ schedulerObject”实例。

1 个答案:

答案 0 :(得分:1)

您的春季配置中似乎缺少RequestContextListener

@Bean
public RequestContextListener requestContextListener(){
    return new RequestContextListener();
}

没有该bean,您将无法创建请求范围的bean(请参阅here)。

也相关:Configuring RequestContextListener in SpringBoot