EJB

EJB 3 – Session Beans

Merhaba arkadaşlar. Bu yazıda EJB’nin bean çeşitlerinden biri olan Session Bean’leri öğreneceğiz. Öncelikle Session Bean hakkında bilgi vereceğim ve akabinde örnek uygulama yaparak yazımızı sonlandıracağız.

Session Bean’ler kendi içinde 3’e ayrılır arkadaşlar. Stateful Session Bean, Stateless Session Bean ve Singleton Session Bean.

Singleton Session Bean

javax.ejb paketindeki Singleton ile işaretlenen Singleton Session Bean yazdığımız uygulama sunucu üzerinde çalıştığı sürece var olan ve sadece bir kez oluşturulan session bean çeşididir. Gelen tüm istemcilere aynı bean cevap verir çünkü elde sadece 1 tane bean örneği ( instance ) vardır.

Stateless Session Bean

javax.ejb altındaki Stateless ile işaretlenen Stateless Session Bean adından da anlayacağınız üzere durumsuz session bean’dir. Durumsuz ile kastedilen şey bu session bean çeşidinin gelen istemci hakkında bilgi tutmamasıdır. Stateless Session Bean örnekleri (instance) sadece bir metot çağırımı için istemciye hizmet eder ve bean havuzuna döner. İstemcinin sonraki metot çağırımı için aynı Stateless Bean örneğinin hizmet vereceğinin garantisi yoktur. Bu neden Stateless Session Bean içinde instance variable tanımlaması yapılmaması gerekmektedir. Ayrıca istemciye özel hizmet vermemesinden ve genele hizmet veren yapısından ötürü çalıştırıldıklarında iki faklı istemci aynı şeyi  aynı şeyi görürler. Singleton Bean’e benzeyen yapısı vardır fakat ondan farklı olarak bir havuz içinde birden fazla bean örneği tutulur ve gelen istemciye herhangi bir tanesi cevap verir.

Stateful Session Bean

javax.ejb altındaki Stateful ile işaretlenen Stateful Session Bean adından da anlayacağınız üzere durumlu session bean’dir. Durumlu olması demek gelen istemciye özel olması ve o istemci için özel bilgiler tutabilmesi demektir. Gelen her istemci için ona has bir instance (örnek) oluşturulur. Böylece bu bean türünde instance variable tanımlanabilir ve bu değişkenlerin bilgi tutması beklenebilinir. Bir oturum boyunca bu bean’ler yaşarlar ve oturum bittiğinde de JVM’deki Garbage Collector tarafından silinirler.

Örnek Uygulama

Şimdi bu bean çeşitlerini ve önceki yazıda da gördüğümüz Interface yapısını kullanarak bir örnek yapalım. Örneğimizi JSF kullanarak yapacağız.

index.xhtml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
      xmlns:f="http://xmlns.jcp.org/jsf/core">
   <h:head>
       <title>JSF Ve EJB Kullanımı</title>
   </h:head>

    <h:body>
        <h:form>
            <h:inputText value="#{jSFBean.name}"/>
            <h:commandButton value="Selamla" action="sayHello?faces-redirect=true"/>
        </h:form>
    </h:body>
</html>

Index sayfamız içindeki inputText’ten isim alacağız ve managed bean içindeki setName  metodu ile EJB’ye yollayacağız. Butonumuz da sayHello sayfasına yönlendirme yapıyor.

JSFBean.java

import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

/**
 * Created by ilkaygunel on 07/09/15.
 */
@ManagedBean
@SessionScoped
public class JSFBean {
    @EJB
    EJBInterface ejbInterfaceObjesi;

    String name;

    public String getName() {
        return ejbInterfaceObjesi.getName();
    }

    public void setName(String name) {
        ejbInterfaceObjesi.setName(name);
    }
}

Managed bean içindeki değişkenimizin get-set metotları var. Değişkenin set metodunda EJB’ye bağlanılıp değer gönderiliyor. Burada aynı zamanda EJB’ye nasıl bağlanıldığını da görmekteyiz. Dikkat ederseniz bir EJBInterface değişkeni tanımlanmış ve değişken @EJB notasyonu ile işaretlenmiş. Önceki yazıda da bahsettiğim üzere EJB’ye direk erişilmez. Onun yerine Interface üzerinden erişilir. Biz de bu sebeple Interface’mizden bir nesne tanımlıyoruz ve onu @EJB ile işaretliyoruz.

EJBInterface.java 

import javax.ejb.Local;

/**
 * Created by ilkaygunel on 07/09/15.
 */
@Local
public interface EJBInterface {
    public String sayHelloMessage();
    public String getName();
    public void setName(String name);
    }

Managed bean içinde değişken tanımladığımız Interface içinde 3 metot tanımladık. Bu metotlar az sonra EJB sınıfı içinde kullanılacaklar.

EJBBean.java

import javax.ejb.Singleton;

/**
 * Created by ilkaygunel on 07/09/15.
 */
@Stateless
public class EJBBean implements EJBInterface{

    String name;

    @Override
    public String getName() {
        if(isim==null)
        {
             return "";
        }
        else
        {
             return "Merhaba "+name;
        }
    }

    @Override
    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String sayHelloMessage()
    {
        return "Merhaba "+name;
    }
}

EJB sınıfımız içinde gördüğünüz gibi ilk olarak sınımızı gerekli olan session bean tipinde işaretliyoruz. Bu örnek için 3 session bean tipini de deneyeceğimiz için değişen tek kod EJB sınıfındaki bean çeşidi olacak.

Akabinde yazmış olduğumuz Interface’den EJB sınıfımızı implement ediyoruz ve Interface içindeki tüm metotları Override ediyoruz. JSF sayfasından girilen isim managed bean içinden EJB’ye geliyor ve set metodu ile değer atanıyor. İsmi almak istediğimizde de managed bean içindeki kod EJB’deki get metodunu çağırıyor ve dönen ismi JSF sayfasına veriyor.

Session Bean’in çeşidi Singleton iken uygulamayı çalıştıralım.

Screen Shot 2015-09-09 at 01.14.38

Bir isim girip Selamla butonuna tıklıyorum.

Girilen isme Merhaba deniliyor.

Girilen isme Merhaba deniliyor.

Şimdi index ve SayHello sayfasını Chrome tarayıcıdan açalım.

EJB Singleton olduğu için herkese aynı bilgi dönüyor. An önce girilen isim tutuluyor.

EJB Singleton olduğu için herkese aynı bilgi dönüyor. An önce girilen isim tutuluyor.

sayHello sayfasında da durum aynı.

sayHello sayfasında da durum aynı.

Şimdi EJB sınıfımızı Stateless ile işaretleyip isim girelim ve hemen diğer tarayıda sayfaları kontrol edelim.

Screen Shot 2015-09-09 at 01.29.31

Gördüğünüz gibi Singleton ile benzer şekilde bize aynı bilgi döndü. Singleton uygulama için bir tane iken Stateless bir havuzda bir kaç tanedir ve yapıları çok benzerdir.

Şimdi Stateful yapalım ve isim gönderip diğer tarayıcda bakalım.

Firefox tarayıcıdan isim girip gönderdim ve Chrome tarayıcıdan açınca inputText boş geldi. Gelen her istemci için yeni bir örnek (instance) oluşturuluyor.

Firefox tarayıcıdan isim girip gönderdim ve Chrome tarayıcıdan açınca inputText boş geldi. Çünkü Stateful Bean tipinde gelen her istemci için yeni bir örnek (instance) oluşturuluyor.

Session Beans konusu da bu şekilde arkadaşlar. Gelecek yazıda EJB’nin başka bir kısmı olan Persistence konusuna değineceğiz. Sağlıcakla kalın.

2 Yorum

  • ejbInterfaceObjesi oluşturma kısmında nesneyi Interface üzerinden oluşturmanız doğru mu? EJBBean sınıfı üzerinden oluşturmamız gerekmiyor mu?

Yunus Emre için bir yanıt yazın X