Struktura aplikace - JAVA / EJB rubrika: Návrh

8 tdvorak
položil/-a 11.6.2015

Zdravím,
starám se o jednu rozsáhlejší aplikaci v Javě (Wildfly 8.2, Java 8, Oracle 12, EJB 3.1., Hibernate 4.3.7). Aplikace si sebou nese zhruba 8 let vývoje a spousta věcí je tak nutně zastaralých a složitějších, než by bylo nutné. Mnoho věcí se řeší zbytečně ručně, přestože by to mohl zastat framework nebo kontejner.

Systém v zásadě poskytuje několik různých webových služeb napojených na externí systémy. Ze systémů dostává (push) notifikace, ty transformuje a přeposílá na vstupy dalším systémům. K tomu poskytuje webové rozhraní pro správu a administrátorské zásahy (Wicket).

Aplikace je multi-tenant. Jedna databáze drží několik schémat, pro každého tenanta jedno. Každý tenant je připojen k řadě "svých" systémů, kterým zprostředkovává zprávy. Informace o dostupných tenantech je zaznamenána v tabulce v master schematu. Logika přepínání entity managerů v závislosti na tenantu je implementovaná ručně. EntityManager se pak získává voláním statické metody, informace o tenantu se drží v ThreadLocal proměnné a využívá se Proxy (java.lang.reflect) pro životní cyklus transakce.

Každý tenant má při startu vytvořen svůj MBean(jmx), který si pak řeší vlastní logování, statistiky, naplánované úlohy. Tyto MBeany pro tenanta žijí po celou dobu aplikace.


Já bych teď rád vyhodil co nejvíc té na míru psané logiky, správy konexí a využil co nejvíc služeb kontejneru, standardů EJB. Z Hibernate můžu snadno použít Multi-tenancy. Jde mi hlavně o to, jak přepracovat vznik objektů pro tenanty a jak vhodně vyřešit dependency injection. Při startu kontejneru mi služba (@Startup a @Singleton) z databáze načte informaci o tenantech. Jak tedy nejlépe vytvořit pro každého tenanta objekt (obsahuje dále reference na plánované úlohy, logování, statistiky, konfiguraci)? Objekt by měl být živý po celou dobu běhu aplikace, sám si řešit naplánované úlohy a poskytovat další služby. Objekt tenanta dál obsahuje odkazy na další DAO a věci, které by měly být nainjektovány.

Jak byste takovou architekturu poskládali? Kde a jak vytvořit objekty tenantů? Jak je nainjektovat službami, které potřebují?

Díky za tipy a komentáře.

Pro plný přístup na Devel.cz se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.