当前位置: 首页 > 知识库问答 >
问题:

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

丌官坚秉
2023-03-14

我有一个Spring引导应用程序,在控制器中,我有一个注入的服务类,并且有一个来自该服务类的方法从一个线程调用。我的应用程序有一个索引页面,用户可以设置值并开始一些计算,设置值发生在服务类中,要开始计算,用户点击一个按钮,将启动控制器中调用服务类中的方法的线程。结果将显示在不同的页面,该页面有一个按钮,该按钮返回到索引页面,以开始不同值的ne计算。

我需要一个新的注入bean,当我在计算后返回到索引页面时,我猜,如果没有注入bean,我将修改并使用前一个注入bean,这将给我错误的结果。

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

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

“上下文初始化期间遇到异常-取消刷新尝试:org.springframework.beans.factory.unsatifiedpendencyException:创建名为'schedulerController'的bean时出错:通过方法'setA'参数0表示的未满足依赖项;嵌套异常为org.springframework.beans.factory.BeanCreationException:Error正在创建名为“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”实例。

共有1个答案

督宏旷
2023-03-14

您的spring配置中似乎缺少RequestContextListener

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

如果没有这个bean,您将无法创建请求范围的bean(请参阅此处)。

同样相关:在SpringBoot中配置RequestContextListener

 类似资料:
  • 我的问题类似于这个(带有apache轴的Spring Boot应用程序),但我正在运行Spring Boot v2.2.6。当我执行命令时 我明白了 我还有相关的build.gradle片段 我确认文件 /Users/xxxx/workspace/myjar/build/libs/myjar-0.0.1-SNAPSHOT.jar!/BOOT-INF/lib/addressing-1.6.3-cla

  • 根据这篇基于尤里卡服务发现的博客https://spring.io/blog/2015/07/14/microservices-with-spring,服务发现在这里正常工作。 但是当切换到使用Consul而不是Eureka时,服务发现不起作用,并出现以下错误: 更新:在通过提供正确的运行状况检查endpoint(请参阅下面的答案)修复上一个错误后,在bootstrap.yml中正确提供Consu

  • 我目前正在尝试制作一个网页,但我不知道为什么我的html不能看到提供的css文件。我在SpringBoot有一个应用程序。我有以下文件:索引。html 风格css

  • 如图所示, 位置 2 和位置3 为什么可以访问 位置1 (也就是主线程)的 point 局部变量 ? 毕竟 位置 2 和位置3 是另外两个线程啊 !! 当我加上 第10行代码后,thread1 和 thead2 中都不能访问主线程中的point 了。我知道这是内部类的“事实最终变量” 的限制。 如下图所示,就是我不理解的地方。(在 “栈内存” 层面) 我的猜测:之所以 thread1 和 trea

  • 1):单线程应用程序只会在用户的CPU上使用1个线程吗?提供更多的线程会使用多个CPU内核吗?如果声明的线程比用户的CPU多,会发生什么?