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

时间:2010-04-11 14:20:39

标签: java web-services axis

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

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

现在的问题是:当用户调用jsp时,webservice的响应时间差异很大,就像一个用户花了不到10秒而另一个用户在同一个网络中花了不到一分钟。

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

最后有一种有效的方式来调用webservice(Yahoo天气)。通常我会收到来自用户的大约200个同时请求。

3 个答案:

答案 0 :(得分:4)

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

对于你和雅虎而言,这都是非常有效的,而JSP只需要查找本地对象(几乎是即时的)而不是连接到Web服务。

修改

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

似乎不仅天气不仅经常变化,而且对每个用户来说也是如此,网络服务还要求其他数据,如航班数据。

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

作为要求的基础,我会使用一些简单的东西:

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

通过在本地拥有数据,无论是瞬态(保存在bean中)还是持久性(本地数据库),最好地实现对用户的快速数据访问。这可以通过定期从远程源请求数据并使用JSP中的缓存数据来完成。这也可以让你明白第三点。

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

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

答案 1 :(得分:1)

我会使用Google工具来监控对网络服务的调用时间。

这里有几件事情发生了:

  1. 将Java bean映射到XML请求。
  2. 将XML请求发送到Web服务。
  3. 在Web服务端解组XML请求。
  4. Web服务处理请求
  5. Web服务编组XML响应
  6. Web服务向Java客户端发送XML响应
  7. 解组XML响应并在客户端上显示。
  8. 你无法在雅虎网络服务中看到,但要突破你在客户端看到的内容,看看花费的时间。

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

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

答案 2 :(得分:1)

我建议使用本地缓存和数据池。运行后台线程而不是发送200个相似/相同位置的单独请求,而后台线程仅为用户感兴趣的位置提取天气并在本地缓存它们,此缓存每分钟更新一次。当用户请求他们的个人偏好时,如果位置是新的或者缓存中的数据是陈旧的,则请求到达缓存并重新获取。通过这种方式,用户将获得更加无缝的体验,您将无法获得雅虎限制并获得拒绝服务。