gpt4 book ai didi

Java并发: Making webservice access threadsafe

转载 作者:行者123 更新时间:2023-12-02 00:54:59 25 4
gpt4 key购买 nike

我想知道使用 Axis2 Web 服务处理并发的正确/最佳方法。

例如,给出以下代码:

public class MyServiceDelegate
{
@Resource
UserWebService service; // Injected by spring

public CustomerDTO getCustomer()
{
String sessionString = getSessionStringFromCookies();
service.setJSESSIONID(sessionString);
CustomerDTO customer = service.getCustomerFromSessionID();
}
}

请注意,上面的 UserWebService 是第 3 方 API。该服务要求在进行调用时,我们传递一个带有经过身份验证的 session 的 JSESSIONID 的 cookie。

我是否正确地假设该语句不是线程安全的?即,给定两个线程,是否有可能发生以下情况?

  • 线程A:service.setJSESSIONID("threadA")
  • ThreadB:service.setJSESSIONID("threadB")
  • ThreadA : service.getCustomerFromSessionID//service.sessionID == "threadB"

如果是这样,处理这种情况最合适的方法是什么?我应该使用资源池来提供服务吗?或者我应该将服务声明为同步的?

    public CustomerDTO getCustomer()
{
synchronized( service ) {
service.setJSESSIONID(sessionString);
CustomerDTO customer = service.getCustomerFromSessionID();
}
}

或者,还有其他更合适的方法来处理这个问题吗?

最佳答案

每个线程是否都有自己的 Delegate 对象,从而拥有自己的 UserWebService 服务?

在简单的情况下,如果在堆栈上创建委托(delegate),则线程将是独立的。

如果创建成本很高,则拥有一个委托(delegate)对象池。从泳池里拿一个相对便宜。您需要非常小心地进行内务处理,但实际上这是通过数据库连接完成的。某些环境具有用于管理此类池的实用程序类 - 往往比您自己的池更可取。

关于Java并发: Making webservice access threadsafe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1221353/

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