2010-04-11 63 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個針對相似/相同位置的單獨請求,而是運行後臺線程,該線程僅爲用戶感興趣的位置提供天氣並將其緩存到本地,此緩存每分鐘更新一次。當用戶請求他們的個人偏好時,如果位置是新的或者緩存中的數據是陳舊的,則這些請求將命中緩存並重新獲取。通過這種方式,用戶將擁有更加無縫的體驗,並且不會遇到雅虎節流並獲得拒絕服務。