【发布时间】:2019-01-02 17:23:48
【问题描述】:
我正在尝试在我的 Spring 应用程序中使用并行流,但出现“未找到线程绑定请求”异常。
我的代码如下所示:
@Controller
@RequiredArgsConstructor(onConstructor = @__(@Inject)) // yes, I'm using lombok
public class controllerClass {
private final someOtherComponent;
@RequestMapping(value = "/test", method = RequestMethod.Get)
public Map<String, String> doParallelStream() {
List<String> testStrings = Arrays.asList("one", "two", "three");
return testStrings.parallelStream()
.map(testStrings -> someOtherComponent.someCall(testStrings))
.collect(Collectors.toConcurrentMap(
returnedString, returnedString, (p1, p2) -> p1
));
}
}
我的猜测是,因为我在并行流内的映射中使用 someOtherComponent,线程启动的线程不再具有访问它的上下文。
我得到的完整错误是:
执行控制器时出错 { java.lang.IllegalStateException: java.lang.IllegalStateException: 未找到线程绑定请求:您是指实际 Web 请求之外的请求属性,还是在原始接收线程之外处理请求?如果您实际上是在 Web 请求中操作并且仍然收到此消息,则您的代码可能在 DispatcherServlet/DispatcherPortlet 之外运行:在这种情况下,请使用 RequestContextListener 或 RequestContextFilter 来公开当前请求。
关于如何解决这个问题的任何建议?
【问题讨论】:
-
您不必依赖 Spring 的线程绑定魔法。例如,您的
someOtherComponent.someCall可能使用请求属性自动连接 - 您需要手动连接这些。 -
不相关,但对于必需的参数,自 Spring 4.1 或 4.2 以来不需要
@Inject或@Autowired,这可以清理您的 lombok 使用。由于使用了 parallelStreams,您的假设是正确的。
标签: java spring multithreading