我想知道是否使用 singleton 模式来获取 SOAP客户端实例?
singleton 模式是解决该问题的好方法。我不想为每个 WS 调用创建一个新客户端。
我有两个应用程序,我遇到了同样的问题。 一个是用JSF编写的Web应用程序。其他是使用EJB编写的Enterpise应用程序。
目前的简化实施:
网络应用程序:
public final class ClientWs {
private WS port;
public ClientWs(String wsdlAddress) throws ClientWsException {
setPort(wsdlAddress);
}
...
}
@Named
@ApplicationScoped
public class ClientBean {
...
public ClientWs getClient() {
return new ClientWs(URL);
}
...
}
Enterpise应用程序:
public final class ClientWs {
private WS port;
public ClientWs(String wsdlAddress) throws ClientWsException {
setPort(wsdlAddress);
}
...
}
@Singleton(name = "clientBean")
public class ClientBean {
...
public ClientWs getWsClient() {
return new ClientWs(URL);
}
...
}
获取实例客户端的解决方案是什么?您会为这些类型的应用程序使用不同的方法吗?
答案 0 :(得分:0)
如果你保持客户无国籍并让你的D.I.管理它,我不认为你真的需要担心它是单身人士吗?框架/容器(例如Spring,CDI或诸如此类)。您可以使用Spring-WS并从applicationcontext中获取实例。默认情况下它是一个单身人士,但你通常不知道,也不关心。
编辑:如上所示的实施不是无国籍的。它取决于创建时提供的URL。因此,一个vanilla单例实现会遇到这样的问题:您不能再使用客户端类来访问任何其他Web服务。如果你想继续这条路线,你可以创建一个工厂,在内部管理每个URL的每个客户端的单个实例,可能在Map中。
但是,正如我所提到的,我建议将生命周期管理的这一部分留给框架而不是自己编写。