繁体   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