在我们的一个应用程序中,我们需要调用Yahoo Soap Webservice来获取天气和其他相关信息。
我使用axis1.4的wsdl2java工具并生成了所需的存根并编写了一个客户端。我使用jsp的use bean来包括客户端bean和在客户端中定义的调用方法,这些方法依次调用yahoo Webservice。
现在的问题是:当用户调用jsp时,Web服务的响应时间差异很大,例如,对于一个用户而言,它花费不到10秒,而在同一网络中的另一用户则花费了超过一分钟。
我只是想知道即使jsps是多线程的,Axis1.4是否也将请求排队。
最后,还有一种有效的方法来调用Web服务(雅虎天气)。通常,我从用户那里收到大约200个同时请求。
最佳答案
为什么不安排一个线程每分钟左右获取一次天气,并将其暴露给JSP,而不是让每个JSP获得自己的天气报告?
对于您和Yahoo来说,这都效率更高,而且JSP只需查找本地对象(几乎是即时的)即可代替连接到Web服务。
编辑
此答案的注释中的一些新要求提出了选择解决方案的另一种方法。
Web服务不仅请求天气变化,不仅天气变化不那么频繁,而且对于每个用户来说都是相同的,而且航班数据等其他数据似乎也是如此。
飞行数据检索的要求与天气数据有很大不同。因此,我认为您应该定义几种(远程)数据类型并选择其他解决方案
对于每个类别。
作为要求的基础,我将使用一些简单的方法:
用户迅速喜欢他们的信息,他们不喜欢等待
Web服务器上存储的数据量是有限的
远程Web服务具有某种EULA,并且可能对同一来源(您)对200个并发的相同数据的并发请求不满意。
对用户的快速数据访问最好通过将数据存储在本地来实现,无论是临时数据(保留在Bean中)还是持久性数据(本地数据库)。这可以通过定期从远程源请求数据并使用JSP中的缓存数据来完成。这也可以使您清楚地知道第三点。
Web服务上存储的数据量有限,这意味着不能缓存所有内容。每个用户不同的数据,或者可能在短时间内变化的大数据集,都无法轻易缓存。每分钟左右在美国所有机场的所有航班上加载数据并不是一个好主意。通过在必要时运行特定的Web服务查询,可以更好地满足此类请求。
现在的诀窍是确定何时可以缓存数据。如果可行,请执行此操作,否则在后台运行Web服务查询。可以通过现在显示JSP并在后台启动Web服务查询来完成。 JSP可以具有AJAX脚本,该脚本查询Web服务器数据是否已准备好,并在数据准备好后将其插入页面中。