使用Sinatra web服务处理客户端超时



我是一个Ruby和Sinatra的初学者,但我已经设法想出了一个运行在Heroku上的web服务,运行得很好。我从Salesforce.com访问这个web服务。

我在Salesforce/Apex中使用的HTTPRequest类的最大超时时间为60秒。如果我达到了这个超时(或者,当我达到了用于测试目的的1秒超时),我就会在Salesforce端得到一个异常,我可以很容易地处理它。我感兴趣的是Sinatra这边怎么处理这个问题。

如果我的客户端获得超时,并以某种方式关闭连接,是否有一种方法来"感知"这在我的Sintra应用程序?我想注意客户端超时,继续做应用程序已经开始的工作,然后发送电子邮件让用户知道超时后工作已经完成。

我应该注意到,当我现在得到超时时,Sinatra应用程序愉快地完成了它正在做的事情,并且,我猜,返回它应该返回的JSON数据。只是客户端没有任何东西可以获取这些数据。

任何想法吗?

有趣的问题。作为一种无状态协议,我不认为HTTP包含一种"感知"客户端何时关闭连接的方法。我真的不知道SalesForce是做什么的,但这里有一些标准的HTTP解决方案(我假设Web Sockets已经过时了)。

最容易,但容易误报

既然知道了最大超时时间,就为Sinatra请求计时。如果时间超过60秒,就假定超时了,然后发送邮件。显然,这很容易在59-61秒之间出错,并且可能会得到一些假阳性和假阴性。

更努力,但更倾向于完美

你可以实现一个"读取收据"。您的JSON响应将包含一个UID。如果您的SalesForce请求没有超时,则将UID作为收据发送回去。这样Sinatra就会知道一切都好了。

如果Sinatra应用程序在n秒/分钟内没有收到收据(因为SalesForce超时而您从未获得UID), Sinatra应用程序可以在n秒/分钟后发送电子邮件(或其他)。

这可以通过几种方式实现。最简单的可能包括数据库、脚本和cron。最困难的可能涉及HTTP流(现在在Sinatra 1.3中微不足道)和可能的多线程或事件服务器,如Thin或Zbattery。我很乐意详细说明

最新更新