Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中调用外部Web服务最有效的方法是什么?_Java_Web Services_Axis - Fatal编程技术网

在Java中调用外部Web服务最有效的方法是什么?

在Java中调用外部Web服务最有效的方法是什么?,java,web-services,axis,Java,Web Services,Axis,在我们的一个应用程序中,我们需要调用Yahoo Soap Web服务来获取天气和其他相关信息 我使用axis1.4中的wsdl2java工具生成了所需的存根,并编写了一个客户端。我使用jsp的UseBean包含客户端bean和在客户端中定义的调用方法,这些方法调用yahoo webservice inturn 现在的问题是:当用户调用jsp时,Web服务的响应时间差别很大,比如一个用户的响应时间不到10秒,而同一网络中的另一个用户的响应时间超过一分钟 我只是想知道Axis1.4是否会对请求进行排

在我们的一个应用程序中,我们需要调用Yahoo Soap Web服务来获取天气和其他相关信息

我使用axis1.4中的wsdl2java工具生成了所需的存根,并编写了一个客户端。我使用jsp的UseBean包含客户端bean和在客户端中定义的调用方法,这些方法调用yahoo webservice inturn

现在的问题是:当用户调用jsp时,Web服务的响应时间差别很大,比如一个用户的响应时间不到10秒,而同一网络中的另一个用户的响应时间超过一分钟

我只是想知道Axis1.4是否会对请求进行排队,即使JSP是多线程的


最后,还有一种调用Web服务(Yahoo weather)的有效方法。通常我会同时收到200个来自用户的请求。

我会使用谷歌工具来监控对web服务的调用需要多长时间

这里发生了几件事:

  • 将Java bean映射到XML请求
  • 将XML请求发送到web服务
  • 在web服务端解组XML请求
  • Web服务处理请求
  • Web服务封送XML响应
  • Web服务向Java客户端发送XML响应
  • 在客户端上解组XML响应和显示
  • 你看不到Yahoo web服务的内部,但一定要把你能在客户端看到的东西拿出来,看看时间花在了哪里

    还要检查内存。如果Axis正在生成.class文件,则可能正在占用您的perm空间。您可以使用JDK使用Visual VM。将其附加到客户端上的PID,以查看应用程序服务器内存中发生的情况


    也许这是一个进行AJAX调用的好地方。如果您可以在用户做其他事情时在后台获取天气信息,那么这将是一个很好的解决方案。

    为什么不安排一个线程每隔一分钟左右获取一次天气信息,并将其公开给JSP,而不是让每个JSP获取自己的天气报告

    这对您和Yahoo来说都要高效得多,JSP只需查找本地对象(几乎是即时的),而无需连接到web服务

    编辑

    本答案评论中的一些新要求表明了选择解决方案的不同方式

    web服务似乎不仅请求天气,而且还请求其他数据,如飞行数据。天气不仅不会经常变化,而且对每个用户来说都是相同的

    对飞行数据检索的要求与对气象数据的要求大不相同。因此,我认为您应该定义几种类型的(远程)数据,并选择不同的解决方案 对于每个类别

    作为需求的基础,我将使用一些简单的方法:

    • 用户喜欢他们的信息及时,他们不喜欢等待
    • web服务器上存储的数据量是有限的
    • 远程web服务有各种各样的EULA,可能对同一源(您)对相同数据的200个并发请求不满意
    对用户的快速数据访问最好是通过让数据在本地实现的,无论是暂时的(保存在bean中)还是持久的(本地数据库)。这可以通过定期从远程源请求数据并使用JSP中的缓存数据来实现。这也会让你明白第三点

    web服务上存储的数据量有限,这意味着并非所有数据都可以缓存。每个用户不同的数据,或可能在短时间内变化的大型数据集,都不能很容易地缓存。在美国所有机场的所有航班上每隔一分钟左右加载数据并不是一个好主意。在必要时运行特定的web服务查询可以更好地满足此类请求


    现在的诀窍是确定何时可以缓存数据。如果可行,请执行该操作,否则在后台运行web服务查询。这可以通过现在展示JSP并在后台启动web服务查询来实现。JSP可以有一个AJAX脚本,用于查询web服务器数据是否准备就绪,并在准备就绪时将该数据插入页面。

    我建议使用本地缓存和数据池。与其发送200个类似/相同位置的单独请求,不如运行一个后台线程,只为用户感兴趣的位置提取天气信息,并在本地缓存它们,该缓存大约每分钟更新一次。当用户请求其个人首选项时,如果位置是新的或缓存中的数据过时,则请求会命中缓存并重新蚀刻。这样,用户将有一个更无缝的体验,您将不会遇到Yahoo节流和拒绝服务。

    Yahoo weather service是我们使用的几种服务之一,我们也经常使用其他服务,如获取航班可用性等。在这种情况下,我无法安排事情:)然后分解请求,你网站的部分加载速度会比其他部分慢,显示经典的搜索动画。你不能对第三方“免费”服务提出要求。如果您为航班可用性服务付费,请让他们加快游戏进度。@Sudheer将请求分为三类。对于所有客户机和每个客户机,数据量都是相同的。所有人(美国的天气)都可以这样做。数据量有限(每个州的天气情况)而且,您只有51条记录,而不是1条缓存记录。每个客户机(从洛杉矶国际机场起飞的航班)都可以通过Ajax完成。最初的JSP加载速度很快,Ajax请求通过一个有限的JSP加载,这个JSP加载速度可能很慢,但只有页面的一部分加载速度慢,并且有一个漂亮的指示器。比等待页面出现更令人沮丧。