Web服务客户端,我应该保持服务或端口实例?(Webservice client, should i

2019-06-26 04:50发布


我正在开发Web服务客户端代码生成CXF和它产生类MyService extends Service的客户端部分。
我现在的问题是,当我创建客户端,应为MyService对象创建每次我要发送请求,或者保持它每一次创建端口? 或者,我可以保持端口呢? 是什么力量让客户的最佳方式是什么?

谢谢

Answer 1:

围绕保持端口绝对是最好的执行选项,但请记住线程安全方面的内容:

http://cxf.apache.org/faq.html#FAQ-AreJAXWSclientproxiesthreadsafe%3F



Answer 2:

要创建Service类的每个请求被发送将是非常低效的方法时间。 正确的方法来创建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

希望这可以帮助。



文章来源: Webservice client, should i keep service or port instance?