网站建设新闻中心,云服务器 多个网站,网站内容被攻击该怎么做,做文案选图片素材的网站SOAP Web服务无论如何都不是最先进的技术-尽管它仍然存在#xff0c;但是基于REST的Web服务却提供了激烈的竞争。 无论如何–这绝对不是REST vs SOAP帖子#xff01; 我观察到了一些实例#xff0c;至少可以说#xff0c;使用基于Java的SOAP Web服务的方式不太理想。 我认… 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{WebMethodpublic String getDate(){System.out.println(hashCode -- this.hashCode());return new Date().toString();}
}。 人们应该使Web服务成为无状态的 –忘却风格。 不要最终将状态存储在实例变量中 如果您确实选择使用实例变量请确保您是开发人员以线程安全的方式对Web服务进行编码。 这里有多个选项其中一些选项包括使用良好的旧同步 虽然还不理想 线程安全集合 ConcurrentHashMap等。 最佳解决方案IMO –如果使用的是与Java EE兼容的应用服务器例如Weblogic则应始终将Web服务部署为EJB 在这里我不会深入探讨EJB的详细信息您可以参考我以前的文章如果有兴趣。 你会从中得到什么 1EJB 默认是线程安全的 。 您无需担心将并发和线程安全作为业务逻辑的一部分–您可以免费获得它 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服务测试过程。 没那么难。 下面的琐碎示例 客户角度 至于从现有的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