Java 从Web应用程序并行调用多个不同的Web服务

Java 从Web应用程序并行调用多个不同的Web服务,java,web-services,concurrency,Java,Web Services,Concurrency,在我进一步说明之前,我想向您保证,我已经做了尽职调查,并在网上搜索了建议/答案。我特别关注了以下帖子: 在上面的文章中,您将看到user1669664必须“从一个方法中进行大约15个不同的webserivce调用” 我已经阅读了matt b提供的最佳答案。这个答案基本上需要为每个不同的Webservice调用编写一个Callable 问题是 我有一个更大范围的类似问题——我需要打大约230个Web服务电话 如能听取意见/建议,我将不胜感激。我不想写230个Callables 谢谢。卡亚曼说了什

在我进一步说明之前,我想向您保证,我已经做了尽职调查,并在网上搜索了建议/答案。我特别关注了以下帖子:

在上面的文章中,您将看到user1669664必须“从一个方法中进行大约15个不同的webserivce调用”

我已经阅读了matt b提供的最佳答案。这个答案基本上需要为每个不同的Webservice调用编写一个Callable

问题是

我有一个更大范围的类似问题——我需要打大约230个Web服务电话

如能听取意见/建议,我将不胜感激。我不想写230个Callables

谢谢。

卡亚曼说了什么:)

时间要求是什么?您是否需要在X秒内成功执行所有230?Web服务器如何控制默认超时?是否所有请求都需要生成
200
?如果单个请求失败,会发生什么情况?您必须重试直到成功吗?如果某个百分比失败,您是否必须使所有其他请求无效?退避呢

如果不能以串行方式执行请求,则会留下某种并发代码。并发代码比同步代码更难。有太多的代码路径变体需要考虑,同步内存访问或w/e

如果您必须在web请求的上下文中执行请求,通常最好将并发性(线程池)限制在一定的范围内

如果存在硬编码230,则为设定量,但仍可能过大。如果这是一个公开可用的端点,没有任何东西可以阻止某人对您的服务器发起10000个并发请求,如果您可以针对230个URL服务所有这些2300000个并发请求!!!!!!!!因此,所有资源都应该有某种理智的界限。如果从数据库中提取URL,任意用户可能会添加无边界且不好的URL

一种简单的方法是通过使用线程池来限制并发性

这种架构可以由一个有界线程池和一个队列组成。当每个web请求进入时,它会将URL排队,线程池可以处理它们。如果需要返回值,可以使用返回值队列。我喜欢的是,生产者(web请求处理程序)和消费者(线程池)都是以同步方式编写的,并发性是由运行时通过在线程池上执行抓取器来实现的


Kayaman谈到了一种常用的解决方法:将长时间运行的进程从web请求的上下文中移除。这种体系结构看起来很像内部线程池和队列,但它是进程间的。队列将是一个外部流程作业/消息队列,使用者将从中提取。然后web请求将发出230条消息并返回到客户端。并且异步地,使用者将不断地从队列中提取并发出请求:)

如果它们除了url之外没有变化,则可以在循环中写入它们。您需要提供的是一个包含所有230个url的数组。一个请求究竟需要如何进行230个Web服务调用?您好,kism3t…您说得对,只有url会有所不同。你能详细说明你的答案吗。目前,我的代码是通过一个循环运行的,每次调用一个Web服务。这种方法的问题是耗时太长。嗨,Kayaman…我能说的就是我在一个有很多地方的大型组织工作。我需要向每个位置发送一条消息。只要你能帮上忙就好了。谢谢。听起来你的问题比你能解决的还大。用你自己的解决方案来解决这样的问题是错误的1,让没有经验的人试图改进是错误的2。您不需要Web服务,只需一个简单的发布子消息队列就可以了。哇……感谢您提供了如此详细的答案,dm03514!正如在前面的评论中提到的,我对我能做的事情非常受限……遗憾的是,我不能使用队列。但是我确实喜欢查看web服务器,也许可以使用默认超时来做一些事情。您应该能够在web请求的上下文中在内部使用队列。