在进行HTTP调用时,在Ruby中经常使用SystemExit

我有一个Ruby on Rails的网站,让HTTP调用外部Web服务。

大约每天一次,我收到一个SystemExit(stacktrace below)的错误邮件,其中对服务的调用失败了。如果我随后在我的网站上尝试完全相同的查询,则可以正常工作。 自从网站上线以来,这种情况一直在发生,我没有找到导致它发生的原因的运气。

Ruby是版本1.8.6,rails是版本1.2.6。

任何人都有这个问题?

这是错误和堆栈跟踪。

发生SystemExit   /usr/local/lib/ruby/gems/1.8/gems/rails-1.2.6/lib/fcgi_handler.rb:116:in   出口'   /usr/local/lib/ruby/gems/1.8/gems/rails-1.2.6/lib/fcgi_handler.rb:116:in   exit_now_handler”   /usr/local/lib/ruby/gems/1.8/gems/activesupport-1.4.4/lib/active_support/inflector.rb:250:in   to_proc'/usr/local/lib/ruby/1.8/net/protocol.rb:133:in call'   /usr/local/lib/ruby/1.8/net/protocol.rb:133:in sysread'   /usr/local/lib/ruby/1.8/net/protocol.rb:133:in rbuf_fill'   /usr/local/lib/ruby/1.8/timeout.rb:56:in timeout'   /usr/local/lib/ruby/1.8/timeout.rb:76:in timeout'   /usr/local/lib/ruby/1.8/net/protocol.rb:132:in rbuf_fill'   /usr/local/lib/ruby/1.8/net/protocol.rb:116:在readuntil'   /usr/local/lib/ruby/1.8/net/protocol.rb:126:in readline'   /usr/local/lib/ruby/1.8/net/http.rb:2017:in read_status_line'   /usr/local/lib/ruby/1.8/net/http.rb:2006:in read_new'   /usr/local/lib/ruby/1.8/net/http.rb:1047:in request'   /usr/local/lib/ruby/1.8/net/http.rb:945:in request_get'   /usr/local/lib/ruby/1.8/net/http.rb:380:in get_response'   /usr/local/lib/ruby/1.8/net/http.rb:543:in start'   /usr/local/lib/ruby/1.8/net/http.rb:379:in get_response'
0
额外 编辑
意见: 1

7 答案

您会发现,通常情况下,当您尝试从现有产品的现成零件中构建某些零件时,几乎总是只有零件会比现有产品花费更多。原因是他们可以大量生产他们的产品,大量购买零件可以降低成本等。

仔细看看'串口蓝牙主板',其中一些实际上支持不同的配置文件。您正在寻找的是支持蓝牙HID配置文件(人机界面设备,又称鼠标,键盘,操纵杆,wii遥控器等)的模块。

查看上一个问题,它列出了几个蓝牙模块,您可以单独购买数量相当合理的价格,部分或全部应支持HID。

11
额外
要特别找到哪一个:点击它们中的每一个,然后阅读该页面,看它是否在其上的任何地方显示“HID”。然后,如果你想知道它会做多少工作:阅读模块的数据表,看看你需要做些什么来初始化它,发送事件等等。你可以通过UART与许多模块进行通信,这通常是微控制器非常简单,带有“AT”命令,类似于以前调制解调器的工作方式。数据表再次列出可用的命令。
额外 作者 Marcel,
好。但是具体哪些,以及需要多少工作才能让他们支持它?
额外 作者 Lehane,
所以这样? sparkfun.com/products/10253
额外 作者 Lehane,

这不太可能是你正在寻找的解决方案,但我认为它与这个问题有关:

https://serverfault.com/questions/ 43615 /设置-A-Linux的计算机到ACT-作为一种蓝牙键盘鼠标

2
额外

您最好的选择是拆解蓝牙键盘/鼠标的组合并按照您所描述的进行反向工程。将范围放在之前的鼠标线上摧毁它,以便您可以看到需要执行的操作。

购买模块(其中大部分将开箱即用,并且像串口一样)的问题在于,您无法使用重新编程这些芯片来执行其他操作的SDK。您需要一个带有HCI(“主控制器接口”)固件的模块。这将通过指定的串行接口将蓝牙堆栈暴露给您的微控制器。您需要对Bluetooth有一个很好的理解,因为让模块做任何事情都需要解释通过HCI接收到的事件,并通过HCI调用下一步来移动状态机。好消息是有很多例子需要考虑,因为主机端的蓝牙接口将这些接口暴露给操作系统。

一个理想的模块(如果存在这样的情况)将是一个支持BLE的蓝牙4.1模块,它将HOGP(基于GATT协议的HID)暴露给微控制器。 HOGP允许您使用USB HID报告描述符,并且非常接近“无线USB”。不幸的是,直到最近的Android和Windows 8,BT4.1/HOGP支持都不是内置的。与微控制器交谈并让它设置报告描述符然后发送报告的模块将非常方便。

2
额外

使用fcgi与Ruby是众所周知的错误。

由于这个原因,几乎每个人都转向 Mongrel ,我建议你也这样做。

0
额外

我还会看看乘客。比传统的Apache / nginx + Mongrel解决方案更容易开展。

0
额外

我使用FCGI已经有一段时间了,但如果线程耗时太长,我认为FCGI进程可能会抛出SystemExit。这可能是Web服务没有响应,甚至是DNS查询缓慢。一些谷歌的结果显示与Python和FCGI类似的错误,所以搬到杂种是一个好主意。 这篇文章是我用来设置杂种的参考文献,我仍然参考它。

0
额外

我曾经一直在Apache1 / fastcgi上得到这些。我认为这是由于Ruby完成之前fastcgi挂起造成的。

转向杂种是第一步,但还有更多的事情要做。在活页上从Web服务中剔除,特别是来自Rails的是一个糟糕的主意。 Rails不是线程安全的。可以支持的并发连接数等于群集中的杂类(或Passenger进程)数。

如果您拥有一部杂种,并且有人访问调用Web服务的页面,该页面需要10秒才会超时,那么在此期间您网站的每个请求都会超时。大多数负载平衡器只是盲目地循环通过你的杂种,所以如果你有两个杂种,其他请求都会超时。

任何可能无法预测的缓慢需要在工作队列中发生。 / slow / action的第一个命令将作业添加到队列中,并且/ slow / action通过页面刷新或通过ajax进行查询来持续刷新,直到作业完成,然后从作业队列中获得结果。现在Rails有一些工作队列,但是最古老和可能使用最广泛的工作队列是 BackgroundRB

另一种方法是根据应用程序的性质,每隔N分钟通过cron选择服务,在本地缓存数据,并从缓存中读取实时页面。

0
额外