Merhaba Değerli Java Dostları,
Daha önce değindiğim gibi session bean ihtiyaca yönelik yazılmış ve özel ifadeler kullanan Java sınıflarıdır. Kendi içerisinde stateless ve stateful olmak üzere iki alt başlığa ayrılır. Stateless bean, istemci hakkında bilgi tutmaz. Stateful bean ise tam tersi istemci hakkında bilgi tutar ve gerektiğinde istemcinin bir kopyası sunucu üzerinde tutulur. Bu yazıda daha çok stateless bean üzerinde duracağım.
Stateless bean iki parçadan meydana gelir. İlki istemcinin görmesini istediğimiz metotları içeren bir arayüz, ikinci parça ise bu arayüzü uygulayan ve dolayısıyla metotlarını override eden sınıf. EJB’ de mantık biraz farklıdır. İstemci kodlara direkt sınıf üzerinden değil de, arayüz üzerinden ulaşır. Yani aslında istemci kodlamada arayüzü görür. Örnek üzerinde daha iyi anlaşılacaktır. Örneğe geçmeden önce bir kaç terime değinmek istiyorum.
@EJB: Bean olarak kullanılacak örneği belirtir.
@Stateless: Arayüzü uygulayan ve metotları override eden sınıfın başına bu tag eklenir. Böylece sunucu otomatik olarak bunun bir stateless EJB olduğunu algılar.
@Local: Metotların tanımlandığı arayüzün giriş kısmına eklenir.
@Remote: Metotların tanımlandığı arayüzün giriş kısmına eklenir.
Yukarıdaki iki tag da arayüzlerin üzerine uygulanır. Aralarındaki fark istemci ve EJB’ nin çalıştığı JVM’ lerden kaynaklanır. Eğer istemci ile EJB aynı JVM üzerinde çalışıyorsa @Local ile tanımlı arayüz kullanılır, farklı JVM üzerinde çalışıyorlarsa @Remote ile tanımlı arayüz kullanılır. Farklı JVM, aynı bilgisayar üzerinde de bulunabilir. Yani bir bilgisayardaki farklı iki JVM aynı ortam kabul edilmez.
Yukarıdaki taglardan sonra iki geri çağrımlı tagımız daha var. Bunlar otomatik olarak tetiklenir.
@PostConstruct: Bu tagı sınıfta tanımlı herhangi bir metot üzerine koyabiliriz. Böylece EJB’ nin bir örneği oluştuktan ve varsa gerekli bağımlılıklar ayarlandıktan sonra bu metot otomatik olarak çağrılır ve içeriği işletilir.
@PreDestroy: @PostConstruct ile uygulanışı aynıdır; yalnız EJB’ nin örneği sunucudan kaldırılmadan önce işletilir.
Şimdi küçük bir örnek vererek devam edelim. Şöyle bir senaryo düşünelim. Bize devamlı öğrenci numarası ve notu gelmekte. Biz bu notları kontrol edip 45′ ten düşük alan öğrencileri kalan listesine eklemek istiyoruz. Bunun için şu kodlar gerekecektir. Önce metotlarımızın olduğu arayüzü görelim.
package com.farukbozan.ornekler.ejb;import java.util.Vector;import javax.ejb.Local; public void ogrenciNotKontrolu(int ogrenciNo, int dersNotu); } |
Arayüzümüz local olarak çalışmaktadır. İçerisinde iki metot var. Bu iki metodu override edecek sınıfımızı tanımlıyoruz.
package com.farukbozan.ornekler.ejb;import java.util.Vector;import javax.annotation.PostConstruct; private Vector kalanOgrenciler; @PostConstruct @PreDestroy public void ogrenciNotKontrolu(int ogrenciNo, int dersNotu) public Vector getOgrenciListesi() } |
Şimdi önemli kısma geldik. Teorik bilgilerimizi burada satır satır tekrar edelim. Gerekli import kısmının ardından görüldüğü gibi EJB’ miz stateless olacak ve dolayısıyla başına @Stateless ifadesini getirdik, arayüzümüzü uyguladık. Arayüzde bulunan iki metodu override ettik. Not kontrolü metodunda senaryomuza uygun olarak not kontrolü yapıyor ve 45′ ten düşük alan öğrencilerin numaralarını listeye ekliyoruz. İkinci metot ile de bu listeyi elde ediyoruz ki üzerinde işlem yapalım. Peki sınıf içerisinde, arayüzde tanımlanmamış iki metot daha var, bunlar da neyin nesi diyebilirsiniz. Önce liste oluşturma metoduna bakıyoruz. Başında @PostConstruct tagı var. Bu durumda EJB örneğimiz sunucuda oluştuktan sonra bu metot çağrılacaktır. Metot içerisinde öğrencileri tuttuğumuz yapı oluşturuluyor. Böylece çalışma sırasında NullPointerException hatası almayı engellemiş oluyoruz. @PreDestroy tagı olan metotta ise bean örneği silinmeden önce listemizi boşaltıyoruz. Aslında burdaki örnek olayın daha da soyutlanması yolunda oldukça elverişli. Yoksa gerçek uygulamalar da tabiki durum böyle değil :D.
Bu kod adımlarını tamamladıktan sonra sıra geldi EJB’ den örnek oluşturup kullanmaya. Bir servlet sayfasına aşağıdaki kodları eklemeniz halinde olayın işleyişini rahatlıkla göreceksiniz.
@EJB
private OrnekSessionBeanLocal bean;
private Random rastgele = new Random();for(int i = 10; i < 15; i++)
bean.ogrenciNotKontrolu(i, rastgele.nextInt(65));
out.println(“Başarılı Öğrenciler”);
for(int i = 0; i < bean.getOgrenciListesi().size(); i++)
out.println(bean.getOgrenciListesi().elementAt(i) + “”);
@EJB ifadesi bizim bir bean örneği kullanmak istediğimizi belirtiyor. Burada iki nokta oldukça önemli. Birincisi dikkat edersiniz tipimiz sınıf değil arayüz. Diğer önemli nokta new anahtar kelimesi ile örnek oluşturma ihtiyacı duymadık. Daha sonra da metotları kullanarak işlemlerimizi tamamladık. Ayrıca listeyi oluşturma ve silme metotlarını kendimiz harici olarak çağırmadık. Sunucumuz bu işi kendisi yapacaktır.
Bu basit örnek EJB giriş kısımlarında oldukça tutulur örnek tipidir ve gerekli mantığın oturmasında oldukça faydalı. Olayların aslında ne kadar basit ve bir saat gibi 😀 işlediği örneklerle daha iyi anlaşılıyor. Umarım faydalı bir yazı olmuştur.
Bol Java’ lı günler dileğiyle…
Yazan: Faruk BOZAN (Yazılım Mimarı / Software Architect)