Vă mulțumim pentru susținere

Frecvent SystemExit în Ruby atunci când efectuați apeluri HTTP

Am un site web Ruby on Rails care face apeluri HTTP către un serviciu Web extern.

Aproximativ o dată pe zi, primesc un e-mail de eroare SystemExit (stacktrace de mai jos) unde un apel la serviciu a eșuat. Dacă apoi încerc exact aceeași interogare pe site-ul meu momente mai târziu, acesta funcționează bine. Se întâmplă de când site-ul a intrat live și nu am avut noroc să urmăresc ce-i provoacă.

Ruby este versiunea 1.8.6 iar șinele este versiunea 1.2.6.

Oricine altcineva are această problemă?

Aceasta este eroarea și stacktrace.

Sa produs un SystemExit   /usr/local/lib/ruby/gems/1.8/gems/rails-1.2.6/lib/fcgi_handler.rb:116:in   Ieșire'   /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 apel "   /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:in 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 solicitarea "   /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:inceputul "   /usr/local/lib/ruby/1.8/net/http.rb:379:in get_response '

0
adăugat editat

7 răspunsuri

Veți găsi acest lucru adesea, atunci când încercați să construiți ceva de pe rafturi care repetă un produs existent, aproape întotdeauna doar piesele vor costa mai mult decât produsul existent. Motivul este că aceștia își pot produce în mod obișnuit produsul, cumpărau piese în vrac în reduceri ale costurilor etc.

Priviți cu atenție panourile "serial-over-Bluetooth", unele dintre ele susțin, de fapt, profile diferite. Ceea ce căutați este un modul care acceptă profilul Bluetooth HID (dispozitivul de interfață umană, mouse-ul, tastatura, joystick-ul, telecomanda wii etc.).

Check out această întrebare anterioară , listează câteva module bluetooth, pe care le puteți cumpăra singur cantități pentru prețuri destul de rezonabile, unele sau toate acestea ar trebui să sprijine HID.

11
adăugat
Pentru a afla care dintre ele: faceți clic pe fiecare dintre ele și citiți pagina și vedeți dacă se afișează "HID" oriunde pe ea. Apoi, dacă doriți să știți cât de mult ar fi de lucru: citiți foaia de date pentru modul și a vedea cât de mult trebuie să faci pentru a inițializa, a trimite evenimente, etc Multe dintre modulele pe care le puteți comunica prin intermediul UART, care este de obicei destul de simplu de la un microcontroler, cu comenzi "AT", asemănătoare cu modul în care modemurile funcționau în zilele vechi. Din nou, foaia de date ar trebui să prezinte comenzile disponibile.
adăugat autor Marcel
O.K. Dar care dintre ele, în mod specific, și cât de mult este implicată munca pentru ai ajuta să o susțină?
adăugat autor Lehane
adăugat autor Lehane

Nu este probabil soluția pe care o căutați, dar m-am gândit că este relevantă la întrebarea:

https://serverfault.com/questions/ 43615/configurare-a-linux-computer-act-as-a-bluetooth-tastatura-mouse-ul

2
adăugat

Cel mai bun pariu este să distrugi o combinație tastatură Bluetooth/mouse și să-i inversezi așa cum ai descris. Puneți un domeniu de aplicare pe liniile mouse-ului înainte de să îl distrugeți pentru a vedea ce trebuie să faceți.

Problema cu cumpărarea unui modul (cea mai mare parte va scoate profilurile SPP/DUN din cutie și va acționa ca un port serial) este că nu puteți obține mâinile pe SDK-urile necesare reprogramării acelor jetoane pentru a face altceva. Aveți nevoie de un modul cu firmware-ul HCI ("Host Controller Interface"). Acest lucru va expune teancul Bluetooth la microcontroler printr-o interfață serială bine specificată. Veți avea nevoie de o bună înțelegere a Bluetooth deoarece obținerea modulului de a face ceva va necesita interpretarea evenimentelor primite prin intermediul HCI și mutarea mașinii de stat înainte prin invocarea următorului pas prin HCI. Vestea bună este că există o mulțime de exemple de analizat deoarece interfețele Bluetooth de la partea gazdă expun acest lucru la sistemul de operare.

Un modul ideal (dacă există un astfel de lucru) ar fi un modul Bluetooth 4.1 cu suport BLE care expune HOGP (HID pe protocolul GATT) la un microcontroler. HOGP vă permite să utilizați descriptorii de raport USB HID și este foarte aproape de a fi "USB wireless". Din păcate, suportul BT4.1/HOGP nu este încorporat până la foarte recentul Android și Windows 8. Un modul care a vorbit cu un microcontroler și l-a lăsat să stabilească descriptorii de rapoarte și apoi să trimită rapoarte ar fi un lucru foarte util.

2
adăugat

Utilizarea fcgi cu Ruby este cunoscută a fi foarte buggy.

Practic, toată lumea sa mutat la Mongrel din acest motiv și vă recomand să faceți același lucru.

0
adăugat

Mă voi arunca o privire la Călător . Este mult mai ușor să mergeți decât soluția tradițională de Apache / nginx + Mongrel.

0
adăugat

A trecut o vreme de când am folosit FCGI, dar cred că un proces FCGI ar putea arunca un SystemExit dacă firul a durat prea mult. Acesta ar putea fi serviciul web care nu răspunde sau chiar o interogare DNS lentă. Unele rezultate ale Google arată o eroare similară cu Python și FCGI, astfel că mișcarea în mongrel ar fi o idee bună. Acest post este referința mea pe care am folosit-o pentru a stabili mongrel și mă refer în continuare la acesta.

0
adăugat

Obișnuiau să le obțin mereu pe Apache1 / fastcgi. Cred că este provocată de închiderea rapidă înainte ca Ruby să se termine.

Trecerea la mongrel este un prim pas bun, dar mai sunt multe de făcut. Este o idee proastă de a elimina serviciile web pe paginile live, în special de la Rails. Rails nu este sigură în legătură cu firul. Numărul de conexiuni concurente pe care le puteți sprijini este egal cu numărul de mongrels (sau procese de pasageri) din cluster.

Dacă aveți un mongrel și cineva accesează o pagină care solicită un serviciu web care durează 10 secunde în timp, fiecare solicitare de pe site-ul dvs. va expira în acel moment. Cea mai mare parte a balancerilor de sarcină doar ciclu prin mongrels orbește, deci dacă aveți două mongrels, fiecare altă cerere va timeout.

Orice lucru care poate fi imprevizibil lent trebuie să se întâmple într-o coadă de locuri de muncă. Primul hit la / lent / acțiune adaugă lucrarea la coadă, iar / slow / action continuă să se actualizeze prin reîmprospătarea paginilor sau interogările prin ajax până când lucrarea este terminată, iar apoi obțineți rezultatele din coada de așteptare. Există câteva cozi de locuri de muncă pentru Rails în zilele noastre, dar cea mai veche și probabil cea mai utilizată este BackgroundRB .

O altă alternativă, în funcție de natura aplicației dvs., este de a elimina serviciul la fiecare N minute prin cron, cache-ul de date la nivel local și de a vă citi pagina live din memoria cache.

0
adăugat