2012-04-16 12 views
7

Mam replikowaną pamięć podręczną działającą na wielu węzłach weblogicznych, które również obsługują OSB. Pamięć podręczna jest uruchamiana z serwerem jako klasa startowa. Ma bardzo prosty bufor obiektów, który po prostu śledzi, czy są one używane, czy nie, z atrybutem boolean "dostępny".Koherencja Oracle: jak ustawić limit czasu dla wywołania invoke w replikowanej pamięci podręcznej?

Od OSB wykonuję objaśnienia java do tej samej klasy, która wywołuje "wywołanie" w pamięci podręcznej z procesorem, który oznacza obiekt jako niedostępny, a następnie uruchamia Thread.sleep (31000). Jest to element zastępczy dla długiego przetwarzania, który chcę dodać później.

To, co chcę zrobić, to jeśli wywołanie invoke() trwa zbyt długo, proces powinien przerwać działanie i zwrócić lub wyrzucić wyjątek. Próbowałem przetestować czas oczekiwania na żądanie wynoszący 30000 milisekund. Niestety nie mogę wymyślić, jak sprawić, by ten czas się wydarzył.

Próbowałem:

  • Owijanie procesor w PriorityProcessor i nazywając setRequestTimeout (30000) przed invoke()

  • Dodawanie <request-timeout> 30000 </request-timeout> do <replicated-scheme/> elementu w pamięci podręcznej config

  • Dodawanie <tasktimeout> 30000 </tasktimeout> do <replicated-scheme/> e lement w config cache

  • Dodawanie <guardian-timeout> 30000 </guardian-timeout> do <replicated-scheme/> element konfiguracji cache

  • Tworzenie firm Tangosol-koherencji-override.xml i dodawania opiekuna-timeout <init-param> do <service > element, którego "typ" pasuje do usługi "nazwa" w konfiguracji z pamięcią podręczną

  • Zmiana wywołania sleep() na Thread.sleep (310000) tylko po to, aby sprawdzić, czy domyślne ustawienie zostanie uruchomione po 5 minuty.

Żadne z powyższych nie powoduje żadnego przekroczenia limitu czasu, procesor po prostu śpi tak długo, jak mu kazałem, a następnie wraca bez błędu.

Czy ktoś wcześniej zrobił coś podobnego i może udzielić mi porady? Byłoby to bardzo docenione.

Dzięki

James

Odpowiedz

2

Ok, więc mam odpowiedź, z pewną pomocą Tim Middleton.

Zasadniczo zreplikowana pamięć podręczna nie obsługuje limitów czasu i okazuje się, że i tak nie był to właściwy wybór dla mojego systemu!

Rozwiązaniem jest:

  1. Przełączanie się <distributed-cache> schemat w config cache.
  2. Dodaj element <thread-count> do schematu z liczbą> 1 (wybrałem 10, ale jest to tylko wiele równoległych wystąpień, które chcesz obsłużyć).
  3. Użyj PriorityProcessor, aby owinąć EntryProcessor i ustawić limit czasu za pomocą metody setRequestTimeoutMillis() przed wywołaniem invoke(). (Uwaga: to pierwsza rzecz, którą próbowałem, ale z nieprawidłowym rodzajem pamięci podręcznej, jak się okazuje)
Powiązane problemy