私はWebサービスクライアントを開発していて、クライアント部分のcxf-codegen-plugin
クラスを生成しています。
私の質問は、クライアントを作成しているときに、リクエストを送信または保持するたびに、またポートを作成するたびに、オブジェクトを作成する必要があるかどうかです。または、ポートも保持できますか?クライアントを作るための最良の方法は何ですか?MyService extends Service
MyService
ありがとう
私はWebサービスクライアントを開発していて、クライアント部分のcxf-codegen-plugin
クラスを生成しています。
私の質問は、クライアントを作成しているときに、リクエストを送信または保持するたびに、またポートを作成するたびに、オブジェクトを作成する必要があるかどうかです。または、ポートも保持できますか?クライアントを作るための最良の方法は何ですか?MyService extends Service
MyService
ありがとう
ポートを維持することは間違いなく最高のパフォーマンスのオプションですが、スレッドセーフの側面に留意してください。
http://cxf.apache.org/faq.html#FAQ-AreJAXWSclientproxiesthreadsafe%3F
Service
リクエストが送信されるたびにクラスを作成することは、非常に非効率的な方法です。Webサービスクライアントを作成する適切な方法は、最初のアプリケーションの起動時です。たとえば、WebアプリケーションからWebサービスを呼び出し、WebサービスのServletContextListener
初期化に使用します。CXF Webサービスクライアントは、次のように作成できます。
private SecurityService proxy;
/**
* Security wrapper constructor.
*
* @throws SystemException if error occurs
*/
public SecurityWrapper()
throws SystemException {
try {
final String username = getBundle().getString("wswrappers.security.username");
final String password = getBundle().getString("wswrappers.security.password");
Authenticator.setDefault(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(
username,
password.toCharArray());
}
});
URL url = new URL(getBundle().getString("wswrappers.security.url"));
QName qname = new QName("http://hltech.lt/ws/security", "Security");
Service service = Service.create(url, qname);
proxy = service.getPort(SecurityService.class);
Map<String, Object> requestContext = ((BindingProvider) proxy).getRequestContext();
requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, url.toString());
requestContext.put(BindingProvider.USERNAME_PROPERTY, username);
requestContext.put(BindingProvider.PASSWORD_PROPERTY, password);
Map<String, List<String>> headers = new HashMap<String, List<String>>();
headers.put("Timeout", Collections.singletonList(getBundle().getString("wswrappers.security.timeout")));
requestContext.put(MessageContext.HTTP_REQUEST_HEADERS, headers);
} catch (Exception e) {
LOGGER.error("Error occurred in security web service client initialization", e);
throw new SystemException("Error occurred in security web service client initialization", e);
}
}
そして、アプリケーションの起動時に、このクラスのインスタンスを作成し、それをアプリケーションコンテキストに設定します。また、Springを使用してクライアントを作成するための優れた方法があります。こちらをご覧ください:http://cxf.apache.org/docs/writing-a-service-with-spring.html
お役に立てれば。