Zagadka projektowa 2

Kolejna zagadka najpierw jednak rozwiązanie poprzedniej zagadki.

Który listener lepszy

Oba są dobrym rozwiązaniem. Wybór powinien nastąpić w wyniku analizy polegającej na odpowiedzi na pytanie:

Kto powinien decydować o tym, że dane zdarzenie zakończyło się sukcesem albo porażką?

Jeżeli decyzję powinien podjąć klient to lepszym jest listener z listingu 1. Jeżeli to my decydujemy to oczywiście rozwiązanie z listingu 2.
Istnieją jednak dwa wyjątki. Pierwszy to duże zróżnicowanie protokołów (zdarzeń powodujących wywołanie listenera) w tym przypadku lepszym rozwiązaniem jest druga wersja listenera. Działa ona wtedy jak adapter. Jeżeli jednak protokół jest jeden i jest dobrze zdefiniowany to pierwszy z listenerów jest wystarczający. Jego użycie upraszcza nasz kod.
Drugi wyjątek to sytuacja w której nie interesuje nas treść zdarzenia, ale tylko fakt jego zaistnienia. Jest to typowa sytuacja dla listenerów o których mówił Daniel w swoim komentarzu – loggerów, ale też np. listenerów audytowych czy listenerów związanych z bezpieczeństwem.

Zagadka właściwa

Dzisiejsza zagadka jest trochę trudniejsza. Mamy do wykonania pewne długotrwale zadanie. Wiemy, że będzie ono wykonywało się bardzo długo w stosunku do oczekiwań użytkownika. Pytanie brzmi:

Poniższa lista zawiera kilka modeli wykonania zadania. Czym będziesz kierować się przy wyborze konkretnego modelu?

  • Wywołanie synchroniczne EJB albo usługi działającej w ramach tego samego procesu JVM wraz ze zmianą konfiguracji aplikacji webowej tak by nie groził błąd HTTP 408 request timeout.
  • Wywołanie synchroniczne usługi działającej w ramach innego procesu JVM.
  • Wywołanie asynchroniczne EJB albo usługi działającej w ramach tego samego procesu JVM.
  • Wywołanie asynchroniczne usługi działającej w ramach innego procesu JVM.

Od razu mówię, ze wszystkie punkty mają sens. Twoim zadaniem jest wskazanie przykładowych sytuacji, w których zastosowanie poszczególnych rozwiązań jest najlepsze.

Napisz odpowiedź

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax