您真的了解@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{@WebMethodpublic 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360822.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全局使用dva dispatch

// 第一种 这个umi2还可以 umi3就不可以了 window.g_app._store.dispatch({type: login/logout,});// 第二种 调用dispatch(所有models都可以) getDvaApp()._store.dispatch({type: login/logout,});

[转]JQuery.Ajax之错误调试帮助信息

本文转自:http://blog.csdn.net/lampsunny/article/details/8053967 下面是Jquery中AJAX参数详细列表: 参数名 类型 描述 url String (默认: 当前页地址) 发送请求的地址。 type String (默认: "GET") 请求方式 ("POST&quo…

将策略插入JBoss Apiman

JBoss apiman项目 本周刚刚发布了1.0.3.Final 。 它主要是一个错误修复版本,仅进行了一些相对较小的改进。 自从我上次写博客以来,其中的一个特殊功能就是对插件的支持。 这些插件可以轻松添加到系统中,以提供其他功能。 将策略添加为插件 当…

Error: Module “xxx“ does not exist in container. / antd pro v5启用qiankun报错 / 同时使用mfsu和qiankun报错

一、问题描述 我们用antd pro v5搭建前端项目,启用qiankun微前端模式,终端报错如下: Uncaught (in promise) Error: Module “xxx” does not exist in container. while loading “xxx” from webpack/container/reference/mf 经过排查&…

双链表

问题:在分配空间时,遇到问题 定义一个结构体: typedef struct dLinkListNode{ int data; struct dLinkListNode *prior; struct dLinkListNode *next;}*dLinkList,dListNode; dList(dLinkList)malloc(sizeof(dListNode));与dList(dLinkList)m…

paip.C#.NET多线程访问 toolStripStatusLabel

paip.C#.NET多线程访问 toolStripStatusLabel 作者Attilax , EMAIL:1466519819qq.com toolStripStatusLabel控件比较特殊,无法定义invoke来线程调用。。只好使用原生委托..代码稍微多一些.. delegate void clsC417(); xxx() { …

antd Table/ProList中rowClassName用法(补充记录)

rowClassName{setRowClassName}const setRowClassName (record) > {return record.id currentRecord ? styles.checkstyle : ;};

每个客户使用Jersey处理的Cookie

许多REST服务会将cookie用作身份验证/授权方案的一部分。 这是一个问题,因为默认情况下,旧的Jersey客户端将使用单例CookieHandler.getDefault ,大多数情况下,该示例将为null,如果不为null,则在多线程服务器…

domino从Excel导入数据

HTML部分—————————————————————————————————————————————— 1 <table style"WIDTH: 99%; BORDER-COLLAPSE: collapse" class"linkeytable"> 2 <tbody> 3 <tr> 4 <td width"15%&qu…

uniapp 微信小程序打包 vendor.js过大 导致打包超过2M

1、分包加载&#xff0c;小程序限制一个包2M&#xff0c;可以分9个子包&#xff0c;整包共计不能超出20M&#xff0c;这一步很简单&#xff0c;如果看文档感觉枯燥的可以参考uview框架的demo&#xff0c;因为这个demo就使用了小程序的分包机制&#xff0c;demo链接&#xff08;…

JVMTI标记如何影响GC暂停

这篇文章分析了为什么Plumbr Agents在某些情况下以及如何延长GC暂停的时间。 对基本问题进行故障诊断揭示了有关在GC暂停期间如何处理JVMTI标记的有趣见解。 发现问题 我们的一位客户抱怨说&#xff0c;附加了Plumbr代理后&#xff0c;应用程序的响应速度明显降低。 通过分析G…

[置顶] 状态压缩DP 简单入门题 11题

1.每一行用一个二进制数表示&#xff0c; 有些二进制数是题目中不合法的状态&#xff0c;我们可以预处理出一行合法状态的个数&#xff0c;在递推的过程中复杂度就会大大降低。 POJ 3254 Corn Fields codePOJ 3311 Hie with the Pie codeHDU 4539…

Css fade()函数降低颜色变量透明度

primary-color颜色变量 background-color: fade(primary-color, 20%);

使用Apache Hadoop计算PageRanks

目前&#xff0c;我正在接受Coursera的培训“ 挖掘海量数据集 ”。 我对MapReduce和Apache Hadoop感兴趣已有一段时间了&#xff0c;通过本课程&#xff0c;我希望对何时以及如何MapReduce可以帮助解决一些现实世界中的业务问题有更多的了解&#xff08;我在这里介绍了另一种解…

React 解决鼠标移入子元素触发父元素的mouseout事件

方法一、 用mouseleave/mouseenter代替mouseover/mouseout【最佳方法】 mouseover 与 mouseenter: mouseover > 不论鼠标指针穿过被选元素或其子元素&#xff0c;都会触发 mouseover 事件。 mouseenter > 只有在鼠标指针从元素外穿入被选元素&#xff08;到元素内&#…

分享一篇关于奇异值分解的文章[Eng]

原文地址&#xff1a;http://www.igvita.com/2007/01/15/svd-recommendation-system-in-ruby/ One day, a bunch of friends, who happened to be big Family Guy fans, decided to put together a site to rank and share their thoughts on the show. Soon thereafter they h…

Java 8陷阱–提防Files.lines()

Java8中有一个非常不错的新功能&#xff0c;它允许您在一个衬里中从文件中获取字符串流。 List lines Files.lines(path).collect(Collectors.toList());您可以像对待任何其他Stream一样操作Stream&#xff0c;例如&#xff0c;您可能想要filter&#xff08;&#xff09;或ma…

为雅安祈福

四川是个多灾多难的省份&#xff0c;更是个多地震的省份&#xff0c;十年之内发生了两次大地震。我们能做的就是为雅安的人们祈福。 淘宝给互联网带头了&#xff1a; 天猫也跟着祈福了&#xff0c;因为他们都属于阿里巴巴&#xff0c;这里就不上图了。 百度作为国内互联网企业的…

在运行时打开GC日志记录

总是有下一个JVM表现不佳。 而且&#xff0c;您内心深知&#xff0c;如果您只有少数启动选项可以公开一些有关正在发生的事情的信息&#xff0c;那么您可能就有机会真正修复该死的东西。 但是不&#xff0c;您需要的标志&#xff08; -XX&#xff1a; HeapDumpOnOutOfMemoryErr…