我是Ruby和Sinatra的初学者,但已经设法提供了一个运行良好的Web服务,在Heroku上运行。我从Salesforce.com访问此Web服务。
我在Salesforce / Apex中使用的HTTPRequest类的最大超时时间为60秒。如果我达到了超时(或者,当我用于测试目的的1秒超时)时,我在Salesforce端得到一个例外,我可以轻松处理。我感兴趣的是如何在Sinatra方面处理这个问题。
如果我的客户端超时,并以某种方式关闭连接,有没有办法在我的Sintra应用程序中“感知”这个?我想注意客户端超时,继续执行应用程序启动的工作,然后发送电子邮件让用户知道作业已在超时后完成。
我应该注意,当我现在获得超时时,Sinatra应用程序很乐意完成它正在做的事情,并且,我猜,它返回它应该的JSON数据。只有客户端没有任何东西可以获取这些数据。
有什么想法吗?
答案 0 :(得分:0)
有趣的问题。作为无状态协议,我不认为HTTP包括客户端关闭连接时“感知”的方法。我真的不知道SalesForce做了什么,但这里有一些标准的HTTP解决方案(我假设Web套接字已经用完了)。
最容易,但容易出现误报
因为您知道最大超时,所以Sinatra请求的时间。如果花费的时间超过60秒,则假设超时并发送电子邮件。显然这在59-61秒左右容易出错,你可能会得到一些误报和漏报。
更难,但更容易完美
您可以实施“阅读回执”。您的JSON响应将包含UID。如果您的SalesForce请求没有超时,请将UID作为收据发回。然后Sinatra会知道一切都很好。
如果Sinatra应用程序在n秒/分钟内未收到收据(因为SalesForce超时并且您从未获得UID),Sinatra应用程序可以在n秒/分钟后发送电子邮件(或其他)。
这可以通过多种方式实施。最简单的可能涉及数据库,脚本和cron。最困难的可能是HTTP流(现在在Sinatra 1.3中很简单),可能还有像Thin或Zbattery这样的多线程或事件服务器。我很乐意详细说明。