2011-10-03 69 views
2

我是Ruby和Sinatra的初级用户,但是设法在Heroku上运行的Web服务运行良好。我从Salesforce.com访问此Web服务。使用Sinatra网络服务处理客户端超时

我在Salesforce/Apex中使用的HTTPRequest类的最大超时时间为60秒。如果我遇到了这个超时(或者当我用于测试目的的1秒超时),我会在Salesforce端获得一个例外情况,我可以轻松应对。我感兴趣的是如何在Sinatra方面处理这个问题。

如果我的客户端得到超时,并以某种方式关闭连接,是否有办法在我的Sintra应用程序中“感知”这种方式?我想要注意客户端超时,继续执行应用程序启动的工作,然后发送电子邮件让用户知道超时后完成作业。

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

有什么想法?

回答

0

有趣的问题。作为一个无状态的协议,我不认为HTTP包含一个客户关闭连接时“感知”的方法。我真的不知道什么是SalesForce,但是这里有一些标准的HTTP解决方案(我假设Web套接字已经出来)。

最简单,但容易出现误报

既然你知道最大超时时间您西纳特拉的要求。如果花费时间超过60秒,则假定超时并发送电子邮件。很显然,这在59-61秒左右的时间里很容易出错,你可能会得到一些误报和误报。

困难,但容易产生完美

你可以实现一个 “阅读回执”。你的JSON响应将包含一个UID。如果您的SalesForce请求不是超时,请将UID作为收据发回。然后西纳特拉会知道一切都很好。

如果西纳特拉应用程序并不n秒内没有收到该收据/分钟(因为Salesforce的超时,你从来没有得到的UID),该西纳特拉应用程序可以在n秒/分钟后发送电子邮件(或其他)。

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

+0

很好的反馈。谢谢。事实证明,Salesforce的60年代超时并不相关,因为Heroku强加了30秒的超时时间(除非你在Cedar堆栈上并且觉得发送保持活跃的ping,我不知道)。鉴于30秒超时,以及我们大多数用户将以需要大量时间的方式参与此项服务这一事实,我们只需每次都马上发送一封电子邮件,让Heroku完成重大提升延期工作。 –