Cześć.
Mam taki mały problem, jest sobie stronka, ludki wrzucają na nią 2 pliki eksport z jakiegoś programu napisanego specjalnie dla tej firmy.
Napisałem parser tego eksportu tylko że on zabiera dość dużo czasu dlatego jak kliknę przez stronkę żeby sparsowało te pliki i wrzuciło do bazy trwa to ładną chwilkę i zamraża stronę na ten czas, więc chciał bym jakąś kręcącą się grafikę wrzucić no i oczywiście żeby strona się przeładowała po zrobieniu eksportu.
Problem teraz mam taki że żeby było widać tą kręcącą się grafikę trzeba wrzucić proces parsujący w tło. To już osiągnąłem korzystając z http://wrath.rubyonrails.org/pipermail/rails/2005-March/004592.html takiej klasy. Tylko problem polega na tym że nie wiem jak sprawdzić kiedy zakończy się proces który uruchamia parsowanie i kiedy przeładować stronę.
Jeśli ktoś miał by pomysł jak wrzucić eksport w tło przeładować stronkę żeby widać było grafikę a później po zakończeniu procesu przeładował stronkę ponownie to był bym wdzięczny.
Jeśli chodzi tylko o “obracający się cudak”, a nie o kwestię blokowania się procesu, to najprościej zrobić to w taki sposób, że:
- w momencie kliknięcia/wysłania formularz, javascriptem pokazujesz w przeglądarce jakiś indykator (przeglądarka dopóki nie dostanie odpowiedzi od serwera będzie dalej pokazywać starą stronę)
- Ty sobie spokojnie dane przemielisz i normalnie odeślesz odpowiedź
(tak kiedyś zrobiłem upload pliku i działało, baa, nawet podczas uploadu pliku możesz ajaxem wysyłać requesty do serwera :)).
Jesli natomiast samo blokowanie się serwera jest dla Ciebie problemem, to albo obsługuj aplikację za pomocą kilku (co najmniej 2) procesów, albo skorzystaj z takiego narzędzia, które się nazywa “BackgroundRb” (http://backgroundrb.rubyforge.org/). Dobry artykuł możesz przeczytać tu: http://www.infoq.com/articles/BackgrounDRb.
EDIT:
Przypomniałem sobie że ktoś na forum pisał o swoim własnym pluginie, alternatywie do BackgroundRb: http://trix.pl/blog/ruby-on-rails/running-long-background-tasks-in-ruby-on-rails-made-dead-simple. Możesz przetestować :).
[quote=radarek]Jeśli chodzi tylko o “obracający się cudak”, a nie o kwestię blokowania się procesu, to najprościej zrobić to w taki sposób, że:
- w momencie kliknięcia/wysłania formularz, javascriptem pokazujesz w przeglądarce jakiś indykator (przeglądarka dopóki nie dostanie odpowiedzi od serwera będzie dalej pokazywać starą stronę)
- Ty sobie spokojnie dane przemielisz i normalnie odeślesz odpowiedź
(tak kiedyś zrobiłem upload pliku i działało, baa, nawet podczas uploadu pliku możesz ajaxem wysyłać requesty do serwera :)).[/quote]
No niestety to nie jest takie proste. Muszę utworzyć nowy proces ponieważ jeśli proces główny (czyli aplikacja) na serwerze działa zbyt dług to jakiś skrypt zabija ten proces i eksport nie idzie do końca (nie pytajcie dlaczego tak jest tam jest plesk i coś jeszcze …) dlatego potrzebny jest drugi wątek.
No i to właśnie chcę osiągnąć tylko nie wiem jak powiadomić główny proces o tym że nowy proces oderwany całkowicie ma przekazać informację o tym że się zakończył. Kolega zrobił tak że zapisuje co jakiś czas postęp do pliku a później javascriptem co 5 sekund sprawdza co i jak ale dla mnie to nie jest odpowiednie rozwiązanie.
Niestety drugi link nie działa (przynajmniej u mnie)
[quote=radarek]EDIT:
Przypomniałem sobie że ktoś na forum pisał o swoim własnym pluginie, alternatywie do BackgroundRb: http://trix.pl/blog/ruby-on-rails/running-long-background-tasks-in-ruby-on-rails-made-dead-simple. Możesz przetestować :).[/quote]
Ten link też mi nie działa.
Dziękuję za szybką poprzednią odpowiedź
Już poprawię linki, zauważ że załapało razem z “.”.
Poprawne: http://www.infoq.com/articles/BackgrounDRb , http://trix.pl/blog/ruby-on-rails/running-long-background-tasks-in-ruby-on-rails-made-dead-simple .
Tak więc postanowiłem wypróbować BackgrounDrb ale niestety pojawił się problem którego nie potrafię rozwiązać.
Postępuję według instrukcji README
[quote]script/plugin install svn://rubyforge.org//var/svn/backgroundrb
rake backgroundrb:setup
rake backgroundrb:start[/quote]
i tu następuje problem bo dostaję
[quote]rake backgroundrb:start
(in /home/users/zajac/workspace_rails/dominic_winter)
/usr/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/dependencies.rb:263:in load_missing_constant': uninitialized constant Background::BlankSlate (NameError) from /usr/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/dependencies.rb:452:in
const_missing’
from /home/users/zajac/workspace_rails/dominic_winter/config/…/script/backgroundrb/…/…/config/…/vendor/plugins/background_fu/lib/background_fu.rb:132
from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in gem_original_require' from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in
require’
from /usr/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/dependencies.rb:495:in require' from /usr/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/dependencies.rb:342:in
new_constants_in’
from /usr/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/dependencies.rb:495:in require' from /home/users/zajac/workspace_rails/dominic_winter/config/../script/backgroundrb/../../config/../vendor/plugins/background_fu/init.rb:3:in
load_plugin’
… 12 levels…
from /usr/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/dependencies.rb:495:in require' from /usr/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/dependencies.rb:342:in
new_constants_in’
from /usr/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/dependencies.rb:495:in require' from /home/users/zajac/workspace_rails/dominic_winter/config/../script/backgroundrb/start:68 /usr/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/dependencies.rb:263:in
load_missing_constant’: uninitialized constant Background::BlankSlate (NameError)
from /usr/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/dependencies.rb:452:in const_missing' from /home/users/zajac/workspace_rails/dominic_winter/config/../script/backgroundrb/../../config/../vendor/plugins/background_fu/lib/background_fu.rb:132 from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in
gem_original_require’
from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in require' from /usr/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/dependencies.rb:495:in
require’
from /usr/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/dependencies.rb:342:in new_constants_in' from /usr/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/dependencies.rb:495:in
require’
from /home/users/zajac/workspace_rails/dominic_winter/config/…/script/backgroundrb/…/…/config/…/vendor/plugins/background_fu/init.rb:3:in load_plugin' ... 12 levels... from /usr/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/dependencies.rb:495:in
require’
from /usr/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/dependencies.rb:342:in new_constants_in' from /usr/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/dependencies.rb:495:in
require’
from /home/users/zajac/workspace_rails/dominic_winter/config/…/script/backgroundrb/start:68[/quote]
i przy próbie wystartowania
[quote]./script/backgroundrb/start
/usr/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/dependencies.rb:263:in load_missing_constant': uninitialized constant Background::BlankSlate (NameError) from /usr/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/dependencies.rb:452:in
const_missing’
from ./script/backgroundrb/…/…/config/…/vendor/plugins/background_fu/lib/background_fu.rb:132
from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in gem_original_require' from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in
require’
from /usr/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/dependencies.rb:495:in require' from /usr/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/dependencies.rb:342:in
new_constants_in’
from /usr/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/dependencies.rb:495:in require' from script/backgroundrb/../../config/../vendor/plugins/background_fu/init.rb:3:in
load_plugin’
… 12 levels…
from /usr/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/dependencies.rb:495:in require' from /usr/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/dependencies.rb:342:in
new_constants_in’
from /usr/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/dependencies.rb:495:in `require’
from ./script/backgroundrb/start:68[/quote]
jakieś sugestie co robię źle? Czego mi brakuje?
Zdaje się backgroundrb ma nowy homepage: http://backgroundrb.devjavu.com/. Tam jest inny link do svna. Spróbuj z tamtym.
Okazało się że z activesupport-1.4.2 nie chciał współpracować zainstalowałem nowego 2.0.2 i teraz z nowym poszło walczę dalej.
Poradziłem sobie z instalacją Backgroundrb i uruchomieniem mojego procesu na nim wszystko ładnie śmiga, teraz tylko mam pytanie w jaki sposób, poprawny sposób miał bym odpalać ./script/backgroundrb/start na produkcji?
Jest taki gem palmtree, kt. m.in ma taski do backgroundrb. Mozna na na piechote rake backgroundrb:start/stop/restart lub dorzucic sobie linijke do deploy.rb
after "deploy:update_code", "backgroundrb:restart"
[quote=pawel]Jest taki gem palmtree, kt. m.in ma taski do backgroundrb. Mozna na na piechote rake backgroundrb:start/stop/restart lub dorzucic sobie linijke do deploy.rb
after "deploy:update_code", "backgroundrb:restart"
[/quote]
Dziękuję za odpowiedź tylko mam parę pytań.
Czy plik deploy.rb należy stworzyć samemu czy są może jakieś gemy? generatory? No i jak w ogóle tego używać? (pytam bo google odmówiły mi pomocy albo ja źle zadaje pytania)
deploy.rb to plik generowany przez Capistrano - narzędzie zalecane do obsługi “deploymentu” Ruby on Rails.
Witam,
Jestem autorem wspomnianego wyżej plugina:
https://svn.trix.pl/public/background_fu/
Z tego co widzę w tym wątku (i znam trochę z autopsji) BackgrounDRb bywa zbyt przerośnięte dla większości zastosowań. W tych wszystkich sytuacjach idealnie sprawdza się BackgroundFu. Instalacja prosta, gotowe taski dla capistrano, koncepcja banalna, itp itd. Zachęcam do wypróbowania. W razie problemów proszę pisać w komentarzach pod:
http://trix.pl/blog/ruby-on-rails/running-long-background-tasks-in-ruby-on-rails-made-dead-simple
Odpowiem na 100%.
Pozdrawiam,
Jacek