EJB

EJB 5 – Message Driven Beans

Merhabalar arkadaşlar. Persistence konusunu işlediğimiz önceki yazımızın ardından bu yazımızda Message Driven Beans konusunu öğreneceğiz.

Message Driven Bean’ler de önceki yazıalrda gördüğümüz Session Bean’ler ve Entity Bean’ler gibi bir Enterprise Java Bean çeşididir. Görevi asenkron bir şekilde bir görevi yerine getirmektir. Örneğin siz bir işiniz için birisine mail attığınızda karşı tarafın anında okuması ve cevap vermesi çoğu zaman mümkün değildir. Bu nedenle mail sistemi asenkron bir yapı üzerinde yürür. İşte Message Driven Bean’ler de böyle bir şekilde yani asenkron bir şekilde işlemleri gerçekleştirirler.

Bu yazıda yapacağımız örnek Glassfish Uygulama Sunucusunu kullanacağımız için ayarlamalarımız da ona göre olacak. Şimdi adımlarınızın ne olması gerektiğine ve örnek uygulamamıza bakalım.

  • İlk olarak IDE’nin içinden ya da terminal (ya da cmd) üzerinden GlassFiash sunucunuzu başlatın ve localhost:4848 adresine gidin.
  • Açılan sayfada sol menüden Resources sekmesine tıklayın.
  • Resources altında açılan menüden JMS (Java Message Service) Resources sekmesine tıklayın.
  • Karşınıza Connection Factories ve Destination Resources adında iki link çıkacak. Önce Connection Factories’e tıklayın ve New butonu ile yeni bir Connection Factory oluşturun. Connection Factory oluştururken JNDI Name kısmını istediğiniz bir şey verebilirsiniz fakat Resource Type kısmına bu örnek için dikkat etmelisiniz.  Bu örnekte javax.jms.QueueConnectionFactory öğesini seçmeniz gerekiyor.
  • Daha sonra bir Destination Resource bir oluşturmanız gerekiyor. Önceki sayfadan Destination Resource linkine akabinde New butonuna tıklayıp yeni bir JMS Destination Resource oluşturun. Açılan saydaki textBoxlara dolduracağınız bilgiler yine size kalmış ancak Resource Type kısmından javax.jms.Queue seçin bu örnek için.
  • Ayrı ayrı her iki işlem için de sağ üstteki OK butonu ile kayıt işlemini tamamlayın. Şimdi kod kısmına geçelim. Benim oluşturduğum Connection Factory ve Destination Resource şu şekilde:
jms/BlogProjesiFactory kısmını yukarıdaki işlemleri uygulayarak oluşturdum.

jms/BlogProjesiFactory kısmını yukarıdaki işlemleri uygulayarak oluşturdum.

Yukarıdaki adımları uygulayarak bir Destination Resource oluşturdum.

Yukarıdaki adımları uygulayarak bir Destination Resource oluşturdum.

IDE’nizde bir JSF projesi açtıktan sonra Source Packages altında bir paket oluşturup ona sağ tıklayın ve New kısmından Message-Driven Bean’i seçin.  Eğer göremezseniz Other kısmına tıklayıp Enterprise JavaBeans menüsünden seçebilirsiniz. Aşağıdaki resime ve altyazısına dikkat edeniz.

Message-Driven Bean'i oluştururken Destinations kısmına dikkat etmemiz gerekiyor. Biz az önce Glassfish sunucusu içinde oluşturduğumuz Destination Resource'u kullanacağız. Bunun için Server Destinations radio butonunu işaretleyip içinden sunucu içinde tanımadığımız öğeyi seçiyoruz.

Message-Driven Bean’i oluştururken Destinations kısmına dikkat etmemiz gerekiyor. Biz az önce Glassfish sunucusu içinde oluşturduğumuz Destination Resource’u kullanacağız. Bunun için Server Destinations radio butonunu işaretleyip içinden sunucu içinde tanımadığımız öğeyi seçiyoruz. Altta görünen kırmızı hata sınıfın zaten mevcut olmasından kaynaklanıyor.

Daha sonra Next butonuna tıklayıp akabinde de Finish butonuna tıklayarak işlemimizi bitirebiliriz. Şimdi bu ve diğer sınıflardaki kodlarımızı inceleyelim.

MessageDrivenBeanClass.java

Bir Java sınıfının Message-Driven Bean özelliği kazanabilmesi için @MessageDriven notasyonu ile sınıf işaretleniyor.  Bu notasyona  @ActivationConfigProperty notasyonu ile 2 parametre [email protected] notasyonu da propertyName ve propertyValue adında iki parametre alıyor. Bu parametreler Sunucu içinde tanımladığımız Destination Resource’un Java koduna tanıtılması yapılıyor burada.

@EJB notasyonu ile EJB Interface’i implement sınıftaki metodu çağıracağız. Önceki derslerden hatırlayacağınız gibi direk EJB sınıfını değil EJB Interface’i kullanıyoruz.

Bu yazımız içinde bel kemiği özelliği taşıyan kısım ise onMessage metodur. Dışarıdan bir mesaj işlemi tetiklenmesi durumunda devreye girecek olan metot onMessage metodur. onMessage metodunu MessageListener arabirimini(interface) implement ettiğimiz için override ettik.Metot içinde öncelikle işlemler sırasında bir hata meydana gelmemesi için Message tipinde gelen parametreyi ObjectMessage tipinde elde ediyoruz. Daha sonra da String tipinde elde ediyoruz. Elde ettiğimiz String’i EJB sınıfındaki metodumuza yolluyoruz.

EJBRemoteInterface.java

Interface’imiz içinde iş yapacak metodumuzu tanımlıyoruz.

EJBClass.java

Interface içinde tanımadığımız metodun EJB sınıfı içinde gövdesini yazıyoruz.

JSFManagedBean.java

Managed Bean sınıfımız içinde MessageDrivenBeanClass sınıfı içinde yazdığımız onMessage metodunun çağırılma işleminin nasıl yapıldığını göreceğiz.

İlk olarak @Resource notasyonları ile ConnectionFactory ve Queue nesneleri tanımlıyoruz. Bu nesneleri tanımlarken notasyonlara birer lookup parametresi veriyoruz. Parametreler gördüğünüz üzere sunucu içinde tanımadığımız Connection Factory ve Destination Resource.

Kullanıcının gireceği mesajı tutacak bir message nesnesi ve bu nesnenin get-set metotlarını tanımlıyoruz.

  • onMessage metodunu çağırma işleminin yapıalcağı sendMessage metodunun içinde, try-catch bloğunun içinde javax.jms.Connection tipinde bir nesneyi connectionFactoryObject nesnesini ve createConnection metodunu kullanarak oluşturuyoruz.
  • Akabinde oluşturduğumuz con nesnesini kullanarak bir Session nesnesi oluşturuyoruz. createSession metodunu kullanırken iki parametre veriyoruz. Parametrelerin görevi temel olarak mesajın nasıl iletileceğini belirlemek. Eğer birinci parametre true olursa ikinci parametre ihmal ediliyor ve local bir transaction mekanizması devreye giriyor. Oraacle’daki dökümantasyona göre bu tavsiye edilen bir durum değil. Tavsiye edilen durum birinci parametreyi false, ikinci parametreyi Session.AUTO_ACKNOWLEDGE olarak vermek. Böylece mesaj alımı bir otomatik mekanizmaya alınmış oluyor. Mesaj iletim talebi geldiğinde mesaj otomatik iletilmiş oluyor.
  • Sonraki adımda mesaj iletiminde kullanacağımız MessageProducer nesnesini session nesnesini ve createProduces metodunu kullanarak oluşturuyoruz. Metoda parametre olarak Queue nesnesini veriyoruz.
  • Daha sonra gönderilecek mesajı koyacağımız bir ObjectMessage nesnesini session.createObjectMessage(); ifadesini kullanarak oluşturuyor ve setObject ile mesajı ObjectMessage nesnesine koyuyoruz.
  • Son olarak producer.send(msg) ifadesi ile mesajımızı Message-Driven Bean’e ulaştırmış oluşturuyoruz.
  • catch lie hata yakalaması ve finally lie Connection nesnesinin kapatılma işlemlerini gerçekleştiriyoruz.

index.xhtml

Index kodumuz içinde bir inputText ile kullanıcıdan mesajı alıyoruz ve butonun action özelliği sayesinde sendMessage metodunu çağırıyoruz.

Ekran Çıktıları

Screen Shot 2015-09-30 at 20.43.52

Uygulamayı çalıştırınca ana sayfa bizi karşılıyor.

Bir metin girip GÖNDER butonuna tıklıyorum ve akabinde konsola bakacağım.

Bir metin girip GÖNDER butonuna tıklıyorum ve akabinde konsola bakacağım.

Mesaj başarılı bir şekilde Message-Driven Bean'den geçti ve EJB sınıfına ulaştı. Ardından ekrana yazdırıldı.

Mesaj başarılı bir şekilde Message-Driven Bean’den geçti ve EJB sınıfına ulaştı. Ardından ekrana yazdırıldı.

Bu yazıda da bu kadar arkadaşlar. EJB teknolojisi içinde Message-Driven Bean’in kullanımını öğrenmiş olduk. Gelecek yazıda görüşmek üzere sağlıcakla kalın.