2009-10-21 12 views
7

Mam aplikację Rails, w której niewielka liczba akcji wymaga znacznego czasu obliczeń. Zamiast przechodzić przez złożoność zarządzania tymi działaniami jako zadania w tle, odkryłem, że mogę podzielić przetwarzanie na wiele wątków i używając JRuby z serwerem wielordzeniowym, mogę zapewnić, że wszystkie wątki będą kompletne w rozsądnym czasie. (Klient już wyraził silne zainteresowanie utrzymaniem tego podejścia w porównaniu z uruchomionymi zadaniami w tle).Logowanie wewnątrz wątków w aplikacji Railsowej

Problem polega na tym, że zapisywanie do dziennika Rails nie działa w tych wątkach. Nic nie pojawia się w pliku dziennika. Znalazłem kilka odniesień do tego problemu, ale bez rozwiązań. Nie miałbym nic przeciwko wstawianiu puts w moim kodzie, aby pomóc w debugowaniu, ale stdout wydaje się być zjedzony przez serwer aplikacji gem glassfish.

Czy ktoś z powodzeniem wykonał logowanie wewnątrz wątku ruby ​​Rails bez tworzenia nowego dziennika za każdym razem?

+0

Aktualizacja: Stwierdziłem, że wątki pojawiają się w pliku dziennika Glassfish. Nie jestem pewien, dlaczego wcześniej tego nie widziałem; Mogłem pierwotnie przetestować go w wątku zainicjowanym przez inny (inny niż główny) wątek. W każdym razie, dla celów debugowania, widzę zapisy do STDOUT w pliku dziennika, więc jestem szczęśliwy. –

Odpowiedz

4

Drapałam głowę z tym samym problemem. Dla mnie odpowiedź była następująca:

Thread.new do 
    begin 
    ... 
    ensure 
    Rails.logger.flush 
    end 
end 
+0

Wygląda dobrze! Dzięki! –

+0

Nie działa dla mnie, używając EM – skrat

0

Rozumiem twoje obawy dotyczące zadań wykonywanych w tle, ale pamiętaj, że wyrzucanie wątków w Railsach może być przerażające. Ramy nie zawierają żadnych przepisów dotyczących wielowątkowości, co oznacza, że ​​wszystkie obiekty Railsów muszą być traktowane jako nieprzechodzące do wątku. Nawet połączenie z bazą danych staje się trudne.

Co do rejestratora: standardowa klasa logi Ruby powinna być bezpieczna dla wątków. Ale nawet jeśli Railsy używają tego, nie masz kontroli nad tym, co robi aplikacja Railsowa. Na przykład mechanizm analizy porównawczej "uciszy" rejestrator, zmieniając poziomy.

Unikałbym używania rejestratora szyn. Jeśli chcesz używać wątków, utwórz nowy rejestrator wewnątrz wątku, który rejestruje komunikaty dla tej operacji. Jeśli nie chcesz tworzyć nowego dziennika dla każdego wątku, możesz również spróbować utworzyć w swoim środowisku wykonawczym jeden obiekt do rejestrowania wątków bezpieczny dla każdego wątku.

W twoim miejscu prawdopodobnie będę miał inne spojrzenie na rozwiązania w tle pracy. Podczas gdy DRb wygląda jak koszmar, "bj" wydaje się ładny i łatwy; chociaż wymagało to trochę pracy, aby uruchomić go z JRuby. Istnieje również alternatywa do używania harmonogramu Javy z JRuby, zobacz http://www.jkraemer.net/2008/1/12/job-scheduling-with-jruby-and-rails

+0

Dzięki za informacje i sugestie, ale w tym momencie będę trzymać się podejścia do wątków, ponieważ działa dobrze, z wyjątkiem logowania. Nie używam żadnych wątpliwych klejnotów/wtyczek w żadnym z wątków i uważam, aby używać muteksów, aby zapobiegać wyścigom. Moje zainteresowanie używaniem logów Railsowych było po prostu ułatwieniem debugowania i udało mi się ominąć to, używając wątków tylko wtedy, gdy zdefiniowano JRUBY_VERSION i w inny sposób uruchamiałem ten sam kod sekwencyjnie. Dzięki i tak! –

Powiązane problemy