gpt4 book ai didi

java - 如何使 Java Spring 组件类线程安全?

转载 作者:行者123 更新时间:2023-12-02 08:40:38 24 4
gpt4 key购买 nike

我有一个 spring 类,当您调用 httpDatastoreFacade.getDatastore() 时,它应该为您提供 REST 请求线程安全数据存储:

@Component
public class HttpDatastoreFacade {
private Boolean useAttribute = Boolean.FALSE;

public String getDatastore() {
HttpServletRequest request = ((ServletRequestAttributes)RequestContextholder.currentRequestAttributes()).getRequest();
String datastore = request.getParameter("datastore");

if(useAttribute) {
datastore = String.valueOf(request.getAttribute("datastore"));
}

return datastore;
}

public void setDatastore(String datastore, Boolean useAttribute) {
HttpServletRequest request = ((ServletRequestAttributes)RequestContextholder.currentRequestAttributes()).getRequest();
request.setAttribute("datastore", datastore);
this.useAttribute = useAttribute;
}

public Boolean getUseAttribute() {
return useAttribute;
}
}

有时在我的代码中,我需要更改该数据存储,但在我以不同方式调用需要数据存储的任何代码后,我想立即将其更改回来:

 @Component
public class someClass() {
@Autowired
private HttpDatastoreFacade datastoreFacade;

@Autowired
private OtherClass otherClass;

public void someMethod() {
String savedDatastore = datastoreFacade.getDatastore();
String savedUseAttribute = datastoreFacade.getUseAttribute;

//setDatastore to new settings
datastoreFacade.setDatastore("newStore", true);

//this is where I call my method's or methods that need this new datastore
otherClass.callSomeMethod();

//set the datastore back to old value
datastoreFacade.setDatastore(savedDatastore , savedUseAttribute );
}
}

我的问题是,我遇到了线程问题,其中 useAttribute 为 true,但 datastore 未在请求属性中设置。

我正在寻找一种更好的java模式,我可以在执行otherClass.callSomeMethod()或我需要进行的任何其他调用时锁定HttpDatastoreFacade我将 HttpDatastoreFacade 设置回正常状态。 otherCalss.callSomeMethod 可能会调用其他使用 HttpDatastoreFacade 的方法,并且他们可能希望按照自己的需要进行设置。那么也许我需要一些线程安全的 datastore 堆栈?

最佳答案

似乎 @RequestScope 中的 bean 可以解决您的问题。

@Component
@RequestScope
public class X {
//
}

您不必像清除 ThreadLocal 那样考虑清除请求范围的 bean。当对应的ServletRequest被清理时就会被收集。

关于java - 如何使 Java Spring 组件类线程安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61411333/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com