簡體   English   中英

在Java Web應用程序中循環調用Web服務

[英]Calling a web-service in a loop in Java web application

我們有一個基於SOAP的外部Web服務,當提供ID時,該服務提供有關客戶的禮品卡余額的信息。 此ID存儲在我們的數據庫中。

要求是找出所有帶有此ID標記的此類客戶的余額,然后向他們發送電子郵件。 該邏輯應該每隔一天作為計划作業運行一次。

當查詢數據庫時,我們發現有超過5000個帶有此ID標記的此類客戶。 不幸的是,該Web服務將不接受ID列表,並且只能在一個網絡呼叫中提供有關單個客戶的信息。

現在,我們的疑問是,遍歷5000個Id並在此循環中多次調用Web服務是否是一個好主意。 作為測試運行,當我們調用500 Ids的Web服務時,它在3.7分鍾內完成,而1000 Ids在7.25分鍾內完成。 通過這種方法,我們可以估算出,對於5000個ID,大約需要40分鍾。

我們的Web應用程序是JavaEE 6堆棧,數據庫是Oracle。

有一個更好的方法嗎 ? 歡迎任何建議。 謝謝。

不幸的是,該Web服務將不接受ID列表,並且只能在一個網絡呼叫中提供有關單個客戶的信息。

您確實應該與服務提供商聯系以獲得合適的解決方案。

解決方法是,如果SOAP WS允許進行多個並發調用,則可以通過多個線程對WS進行多次調用。
為此,創建一個RunnableCallable實現,該實現執行具有特定ID的WS的調用。

例如,要使用Callable和ExecutorService並發執行WS的10次調用,您可以執行以下操作:

MyWs myWs = ...; // web service stub
List<Long> ids = ...; // ids to search

List<Callable<Double>> callables = ids.stream()
                                      .map(id -> (Callable<Double>) () -> myWs.getBalance(id))
                                      .collect(Collectors.toList());

ExecutorService executorService = Executors.newFixedThreadPool(10)
List<Future<Double>> balanceFutures = executorService.invokeAll(callables);

當然,可以根據運行JVM的計算機的CPU來調整調用次數。

如果您可以編寫一個確定性函數來接受客戶ID的輸入,並為您提供一個介於0到47之間的數字(代表發送這些電子郵件警報的2天周期中的小時數),則可以將電子郵件分片並進行轉換到每小時運行的工作。

我知道這會稍微改變需求,但是每兩天發送一次批次與每小時發送一次較小的批次之間沒有太大區別。 仍留在您列表中的每個客戶將繼續每2天收到一封電子郵件。

另一種可能性是以多線程方式將查詢發送到Web服務。
Web服務提供商應該真正考慮更改其界面。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM