2010-04-11 47 views
2

在我们的应用程序中,我们需要调用Yahoo Soap Web服务来获取天气和其他相关信息。在Java中调用外部Web服务的最有效方法?

我使用了axis1.4的wsdl2java工具,生成了所需的stub并写了一个客户端。我使用jsp的use bean来包含客户端bean和调用客户端中定义的调用yahoo webservice inturn的方法。

现在的问题是:当用户打电话给jsp的时候,web服务的响应时间差别很大,就像一个用户那样用了不到10秒,另一个用户在同一个网络上花了不止一分钟。

我只是想知道即使jsps是多线程的,Axis1.4队列请求也是如此。

终于有一种调用web服务(雅虎天气)的有效方式。通常,我可以从我的用户那里获得约200个同时请求

回答

4

为什么不安排一个线程每分钟获得一次天气,并将其暴露给JSP,而不是让每个JSP都得到它自己的天气报告?

对于您和雅虎来说,这样做效率更高,JSP只需查找本地对象(几乎是瞬间的),而不必连接到Web服务。

编辑

在这个答案的评论一些新的要求提出解决方案,选择一个不同的方式。

似乎不仅天气不仅不会经常改变,而且对每个用户来说都是一样的,但是网络服务还需要其他数据,比如飞行数据。

飞行数据检索的要求与天气数据的要求非常不同。所以我认为你应该定义几种类型的(远程)数据,并为每个类别选择不同的解决方案 。

至于我会使用一些简单的要求依据:

  • 用户喜欢他们的信息及时,他们不喜欢等待存储在Web服务器上的数据
  • 的量是有限的
  • 远程Web服务具有各种EULA,并且可能不满意来自同一个源的相同数据的200个并发请求(您)

对用户的快速数据访问是最好的通过在本地获取数据来获取信息,无论是暂时的(保存在bean中)还是持久的(本地数据库)。这可以通过定期从远程源请求数据并使用JSP中的缓存数据来完成。这也会让你清楚地知道第三点。

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

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

+0

+1 - 伟大的一点。天气没有那么快变化。 – duffymo 2010-04-11 14:30:37

+0

雅虎天气服务是我们使用的几种服务之一,我们也经常使用其他服务,例如获得航班等的可用性,在这种情况下,我不能安排东西:) – Sudheer 2010-04-11 14:32:47

+0

然后分解请求,您的网站的部分将加载比其他人慢,显示经典搜索动画。您无法对第三方“免费”服务提出要求。如果您正在为航班可用性服务付费,请让他们加强游戏。 – whatnick 2010-04-11 14:35:36

1

我会使用Google工具来监视对Web服务的调用所花费的时间。

有几件事情怎么回事:

  1. 地图的Java bean到XML请求。
  2. 发送XML请求到Web服务。
  3. 解除Web服务端的XML请求。
  4. Web服务流程请求
  5. Web服务marshalles XML响应
  6. Web服务发送到Java客户端上的客户端
  7. 和解组XML响应和显示XML响应。

您无法在雅虎网页服务中看到内容,但会发现您可以在客户端看到的内容,看看时间花在哪里。

检查内存。如果Axis正在生成.class文件,可能是您的烫发空间正在被消耗。 Visual VM可以通过JDK使用。将它附加到您的客户端上的PID,以查看您的应用服务器上的内存中发生了什么。

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

1

我会推荐本地缓存和数据池。不是发送200个针对相似/相同位置的单独请求,而是运行后台线程,该线程仅为用户感兴趣的位置提供天气并将其缓存到本地,此缓存每分钟更新一次。当用户请求他们的个人偏好时,如果位置是新的或者缓存中的数据是陈旧的,则这些请求将命中缓存并重新获取。通过这种方式,用户将拥有更加无缝的体验,并且不会遇到雅虎节流并获得拒绝服务。