webservice_您真的了解@WebService吗?

webservice

webservice

SOAP Web服务无论如何都不是最先进的技术-尽管它仍然存在,但是基于REST的Web服务却提供了激烈的竞争。 无论如何–这绝对不是REST vs SOAP帖子!我观察到了一些实例,至少可以说,以不理想的方式使用基于Java的SOAP Web服务。 我认为,这是由于缺乏对JAX-WS (基于SOAP的Web服务的Java EE规范)的某些基本知识的了解而引起的。

这篇文章中提到的是与使用JAX-WS构建的基于SOAP的Web服务相关的非常基本的东西。 讨论的一些要点是:

  • @WebService批注的POJO的生命周期是多少?
  • 线程安全吗? 如果在您的Web服务上触发并发客户端请求会怎样?

@WebService批注

从技术上讲,@ WebService批注是将POJO转换为SOAP端点所需的全部。 不足为奇的是,这就是我们通常要做的全部工作–用@WebService和其他辅助注释(如@ WebMethod,@ WebParam等)注释类,部署WAR,启动SoapUI ,运行一些测试并荣耀一下!

您应该了解有关使用@WebService注释的POJO的注意事项

  • Web容器提供在WAR中部署的带有@WebService批注的POJO(这很重要)
  • 生命周期– POJO的单个实例服务于客户端的请求。 非常类似于Servlet。
  • 并发方面(线程安全)–它们不是线程安全的。 Bean的同一实例可以由多个线程同时访问。 尽管如果您的服务是无状态的,即不使用实例变量来存储状态,这不是问题,但是您仍然可能会遇到可伸缩性问题(毕竟,它只是一个实例!)。 如果您的POJO使用实例变量存储状态,那么您将陷入困境,并且肯定会遇到由于并发线程访问Web服务类的单个实例而导致行为不一致的问题。
// is this robust enough ?

@WebService
public class POJO_WS{
    @WebMethod
    public String getDate(){
        System.out.println("hashCode -- "+ this.hashCode());
        return new Date().toString();
    }
}

  • 人们应该使Web服务成为无状态–抛弃式风格。 不要最终将状态存储在实例变量中
  • 如果您确实选择使用实例变量–请确保您是开发人员,以线程安全的方式对Web服务进行编码。 这里有多个选项,其中一些选项包括使用良好的旧同步(虽然远非理想!),线程安全集合(ConcurrentHashMap)等。
  • 最佳解决方案IMO –如果使用的是Java EE兼容应用程序服务器(例如Weblogic),则应始终将Web服务部署为EJB (我在这里不打算深入探讨EJB的细节!您可以参考我以前的文章如果有兴趣)。
  • 你会从中得到什么? (1)EJB默认线程安全的。 您无需担心将并发性和线程安全性作为业务逻辑的一部分-您可以免费获得它! (2) EJB是池化组件–容器将实例缓存在内存中,并根据请求将其分配给客户端。 免费的可伸缩性(注意– EJB池配置是特定于容器的,并且每个服务器都定义了实现此目的的特定方式)(3) EJB默认是跨国的–如果您将后端数据库作为Web服务逻辑的一部分进行访问,EJB是理想的(事务的细节最好由真正了解它们的人来处理!我不会试图表现得好像我知道它们是端到端一样让自己感到尴尬)
  • 如何“弹出”我的Web服务? (1)仅使用@Stateless批注–这将使您纯粹的POJO变成一个成熟的EJB ,它现在可以享受所有容器服务(2)将您的Web服务部署为不是作为WAR,而是作为打包在EAR中的EJB-JAR 。 这将确保EJB容器抓住您的POJO,并编织出我一直吹牛的所有魔力!
//not perfect - but better than just @WebService
//will recieve free services from the EJB container, courtsey @Stateless !

@Stateless
@WebService
public class POJO_EJB_and_SOAP {
    public String fetchDate(){
        System.out.println("hashCode -- "+ this.hashCode());
        return new Date().toString();
    }
}

测验

我不是测试专家,但是JMeter这样的工具可以让我看起来更聪明! 为自己和用户JMeter提供一个方便,以简化SOAP Web服务测试过程。 没那么难。 下面的琐碎示例

pojo_ws

客户角度

  • 就从现有的WSDL生成存根而言,我肯定会选择Java SE本身内标准功能。 我只是在说明这一点,因为过去它对我来说是完美无缺的,而不是尝试其他的实现(例如Axis 2或Apache CXF)
  • 我并不是要破坏它们,但是当JDK本身有一个有据可查的标准工具时,我看不到浪费时间研究其他东西的价值! 只需跳到JAVA_HOME / bin ,寻找wsimport命令并破解即可。
  • 提供存根生成功能的大多数IDE都利用此工具

这只是种快速的咆哮。 希望有道理

干杯!

翻译自: https://www.javacodegeeks.com/2015/02/do-you-really-understand-webservice.html

webservice

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值