Java 异步URL获取(如果失败而不阻塞,请重试)

Java 异步URL获取(如果失败而不阻塞,请重试),java,multithreading,google-app-engine,Java,Multithreading,Google App Engine,我使用异步url获取调用从外部服务器访问信息,同时执行其他处理。如果原始异步url获取调用失败,我希望能够重试该调用,或者将url更改为备份url,而不返回原始(主)线程,因为它忙于执行其他操作。这样做的最佳方式是生成一个执行同步url获取的辅助线程(我猜要想实现这一点,我必须暂停/恢复以在两个线程之间切换,因为应用程序引擎不是多核的)?或者,在重试url获取操作之前,等待主线程完成它所做的一切是否更好 谢谢 在您的用例中,使用运行同步URLFetch的辅助线程会很好。从开发人员的角度来看,拥有

我使用异步url获取调用从外部服务器访问信息,同时执行其他处理。如果原始异步url获取调用失败,我希望能够重试该调用,或者将url更改为备份url,而不返回原始(主)线程,因为它忙于执行其他操作。这样做的最佳方式是生成一个执行同步url获取的辅助线程(我猜要想实现这一点,我必须暂停/恢复以在两个线程之间切换,因为应用程序引擎不是多核的)?或者,在重试url获取操作之前,等待主线程完成它所做的一切是否更好


谢谢

在您的用例中,使用运行同步URLFetch的辅助线程会很好。从开发人员的角度来看,拥有非多核CPU不会影响线程的操作,因为JVM和/或操作系统会为您处理这一问题

一个小警告,由于GAE是一个沙盒环境,您需要通过Google的API创建线程。如果您还没有,您可以看到一个关于如何在中生成应用程序引擎线程的简短文档


请注意,派生线程的生存期仅限于原始请求的生存期。(即,对于前端实例请求为60秒)另一个好主意是在进行第二次URLFetch调用之前,在辅助线程上使用定期检查剩余可用时间,因此,如果没有足够的剩余时间,您可以调整超时限制或让请求正常终止。

在您的用例中,使用运行同步URLFetch的辅助线程就可以了。从开发人员的角度来看,拥有非多核CPU不会影响线程的操作,因为JVM和/或操作系统会为您处理这一问题

一个小警告,由于GAE是一个沙盒环境,您需要通过Google的API创建线程。如果您还没有,您可以看到一个关于如何在中生成应用程序引擎线程的简短文档


请注意,派生线程的生存期仅限于原始请求的生存期。(即,对于前端实例请求为60秒)另一个好主意是在进行第二次URLFetch调用之前,在辅助线程上使用定期检查剩余可用时间,因此,如果剩余时间不足,您可以调整超时限制或让请求正常终止。

如果请求时间过长,我是否可以将第一个请求重定向到另一个请求,而该请求将尝试第二个url(这是否会重置60秒计时器?)还是使用备份实例更好?@cowmix:重定向请求不会重置计时器,它从应用程序收到请求时开始计算。如果请求占用的时间超过60秒,请考虑将任务推送到TaskQuew的处理程序中进行处理。前端任务队列的截止时间为10分钟。如果10分钟仍然少于您需要的时间,您可以将TaskQueue中的任务定向到后端实例,以达到24小时的截止时间。但是任务队列无法将响应传递给用户,对吗?那么,我是否必须将任务队列响应保存到数据存储中,并让用户客户端不断轮询数据存储以检查值?@cowmix:这是一种方法。另一种方法是使用将响应从服务器推送到客户端,或者使用您喜爱的推送消息服务。回顾过去,最简单的方法可能是设置一个后端并在那里处理请求,这将自动为面向用户的请求提供无限期限的好处。但是,这种方法是不可伸缩的,因为单一后端将成为您的瓶颈。根据您的使用情况,这可能是可以接受的。请澄清,如果第一个servlet执行url获取,但失败,则不会执行诸如response.sendRedirect(“/serlvetThatUsesURL2Instead”)之类的操作重置60秒计数器,因为重定向是一个有效的响应?如果请求时间过长,我可以将第一个请求重定向到另一个将尝试第二个url的请求(这会重置60秒计时器吗?)还是使用备份实例更好?@cowmix:重定向请求不会重置计时器,它从应用程序收到请求时开始计算。如果请求占用的时间超过60秒,请考虑将任务推送到TaskQuew的处理程序中进行处理。前端任务队列的截止时间为10分钟。如果10分钟仍然少于您需要的时间,您可以将TaskQueue中的任务定向到后端实例,以达到24小时的截止时间。但是任务队列无法将响应传递给用户,对吗?那么,我是否必须将任务队列响应保存到数据存储中,并让用户客户端不断轮询数据存储以检查值?@cowmix:这是一种方法。另一种方法是使用将响应从服务器推送到客户端,或者使用您喜爱的推送消息服务。回顾过去,最简单的方法可能是设置一个后端并在那里处理请求,这将自动为面向用户的请求提供无限期限的好处。但是,这种方法是不可伸缩的,因为单一后端将成为您的瓶颈。根据您的使用情况,这可能是可以接受的。为了明确第一个servlet是否执行url提取,并且失败,您不会执行响应之类的操作。sendRedirect(“/serlvetThatUsesURL2Instead”)重置60秒计数器,因为重定向是有效的响应?