java - spring boot app中的多线程问题,是什么问题?
问题描述
我有一个 Spring Boot 应用程序,在控制器中我有一个注入的服务类,并且该服务类中的一个方法从线程调用。我的应用程序有一个索引页面,用户可以在其中设置值并开始一些计算,设置值发生在该服务类中,开始计算,用户单击一个按钮,该按钮将启动控制器中的线程,该线程调用服务类中的方法. 结果将显示在不同的页面中,该页面有一个按钮可以返回索引页面以开始具有不同值的计算。
当我在计算后返回索引页面时,我需要一个新的注入 bean,否则我将修改并使用前一个,这会给我错误的结果。
我的服务等级需要什么范围?
我尝试了原型、请求和会话,最后两个在运行我的代码之前给我错误,首先给我错误的结果。
或在原始接收线程之外处理请求?如果您实际上是在 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”实例。
解决方案
RequestContextListener
您的弹簧配置中似乎缺少 a :
@Bean
public RequestContextListener requestContextListener(){
return new RequestContextListener();
}
如果没有这个 bean,您将无法创建请求范围的 bean(参见此处)。
推荐阅读
- kotlin - Kotlin 中的 min 函数
- c# - 如何从富文本框中打开链接
- isabelle - 当证明已经完成但给出“未能完善任何未决目标”错误时,为什么我不能在 Isabelle 中明确说明我的案例?
- javascript - 如何让我的本地 JavaScript 项目使用本地库?
- javascript - 使用 jQuery 验证表单字段并删除错误
- html - SVG 路径不适合容器视图框
- php - BlockChain 钱包支付 API 是否支持将金额从 Marchent 钱包发送到外部比特币钱包地址?
- python - TicTacToe 不适用 Win-Conditions && Minimax 上的错误动作
- c++ - 卤化物与 GPU 时间表产生黑色图像
- javascript - 如何更改表格单元格的颜色