Java EE 6’da EJB’er İçin JNDI Adresleri

Java EE kullananların sıkıntı yaşadığı en temel konulardan birisi de, EJB’lerin JNDI adreslerinin ne olduğu konusudur. Bu konu Java EE 6’ya kadar bir standart üzerine oturtulmamış olduğundan, uygulama sunucusu (application server) üreticilerinin farklı yaklaşımlarını bilmek ve ona göre JNDI erişimleri yapmak söz konusudur. (Gerçi Java EE 5 ile başlayan bağımlılık  zerketme (dependency injection, DI) sayesinde yönetilen nesnelerde EJB erişimi çok kolaylaşmıştı ama yine de örneğin uzaktan erişimler için JNDI arama  (lookup) çağrıları gerekmekteydi.) Yani, her uygulama sunucusu için geçerli bir genel geçer adresleme mekanizması yoktu. Yoktu diyorum çünkü bu konu Java EE 6 ile gelen EJB 3.1’de çözüme kavuşturuldu.  Aşağıda standart hale getirilmiş JNDI’ın EJB isimlendirme yapısını kısaca aktaracağım.

Java EE 6, JNDI’a kaydedilmiş olan EJB’lere ulaşım konusunda 3 farklı erişim alanı için 3 farklı adres standardına sahiptir. Bu 3 farklı erişim alanı, “module”, “application” ve “global”dır. Aynı zamanda beanlere erişim için gerekli adresin de iki farklı türü vardır: bean arayüzünün paketiyle birlikte tam ismini kullanarak ya da kullanmadan.

“module” erişim alanı ya da java:module contexti, bir modülden, aynı modül içerisindeki bir kaynağa erişim halinde kullanılabilir. Bu durumda mümkün olan 2 JNDI adresi şöyle olacaktır:

  • java:module/<bean-name>!<fully-qualified-intf-name>

ya da

  • java:module/<bean-name>

Örneğin aynı modül içinde deploy edilmiş olan EJB’leriniz birbirlerine, eğer injection kullanmıyorsanız, bu şekilde, java:module contexti üzerinden ulaşabilir.

Erişmeye çalıştığınız bean ile aynı moülde olmadığınız halde aynı uygulamadaysanız, bu durumda java:app contextini kullanabilirsiniz.

  • java:app/<module-name>/<bean-name>!<fully-qualified-intf-name>

ya da

  • java:app/<module-name>/<bean-name>

java:app contextini, aynı EAR içinde deploy edilmiş olan bir web modulünden örneğin, EJB’lerin bulunduğu modüldeki beanlere ulaşmakta kullanabilirsiniz.

Yok eğer birden fazla uygulamanız varsa, yani birden fazla EAR dosyanız deploy edilmişse ve bu uygulamalar birbirlerindeki beanlere ulaşmak istiyorlarsa, ya da örneğin EAR uygulamanıza bir uzak istemciden (remote client) ulaşmak istiyorsanız, bu durumda en geniş isimlendirmeyi kullanmanız gerekecektir. Bu durumda context artık java:global‘dır ve erişim şu şekildedir:

  • java:global/[<application-name>]/<module-name>/<bean-name>!<fully-qualified-bean-interface-name>

ya da

  • java:global/[<application-name>]/<module-name>/<bean-name>

Bu şekilde belirlenmiş JNDI erişimlerinde hiyerarşinin module => app => global olarak gittiğine ve java:app contextinde modül adının, en taşınabilir context olan java:global‘de uygulama adının da bulunması gerektiğine dikkat edin.

Java EE 6’da EJB’lerin kullanımı çok kolaylaştı, deneyin.

Bu yazı toplam 1798 defa görüntülenmiştir.