Kısa EJB Eğitimi: Netbeans’de EJB Geliştirme – I: Sunucu
Bu yazıda, Netbeans üzerinde hızlıca bir EJB geliştirip Glassfish’e kuralım. Daha sonra da, local ve remote arayüzlerini kullanacak şekilde test kodlarını yazıp çalıştıralım.
Önce Netbeans üzerinde sol taraftaki Projects sekmesinde sağ tık => New Project‘i seçin ve çıkan pencerede solda Java EE‘yi sağda da EJB Module‘ü seçip Next‘e tıklayın.
Gelen pencerede Project Name kısmına SelamEJB yazın ve diğer kısımları olduğu gibi bırakın ve Next‘e tıklayın.
Gelen pencerede sadece “Enable Contexts and Dependency Injection”‘u seçip, diğer kısımları olduğu gibi bırakarak, yani projemizi bir Enterprise Application‘a eklemeyip, sunucu olarak da varsayılan Glassfish‘i kullanacak şekilde oluşturup, Finish‘i tıklayalım.
Bu şekilde içinde EJB’ler barındıracak SelamEJB isimli bir proje oluşturduk fakat projemizde henüz bir EJB yok.
Bu yüzden şimdi de bir EJB oluşturmalıyız. SelamEJB projesinin üzerine gelip sağ tık => New Session Bean‘i seçin ve gelen pencerede aşağıdaki gibi değerlerinizi girin.
Bu şekilde Selam isminde bir session bean oluşturduk öyle ki bu EJB’nin biri yerel (local) biri de uzak (remote) olmak üzere iki tane arayüzü var. Bu arayüzlerin isimleri sırasıyla SelamLocal ve SelamRemote
Yukarıdaki resimden de anlaşılacağı gibi arayüzlere henüz metot eklemedik, bu yüzden Selam session beanini hiç bir metotu yok, yani arayüzü boş. Bu yüzden her iki arayüze de birer metot ekleyelim:
SelamLocal arayüzüne
public String selamSoyleLocal(String isim);
metotunu, SelamRemote arayüzüne de
public String selamSoyleRemote(String isim);
metotunu ekleyelim. Sonra da Selam.java içinde bu metotları gerçekleştirelim:
package selam; import javax.ejb.Stateless; @Stateless public class Selam implements SelamRemote, SelamLocal { @Override public String selamSoyleRemote(String isim) { return "Selam " + isim + " from remote."; } @Override public String selamSoyleLocal(String isim) { return "Selam " + isim + " from local."; } }
Daha sonra da dosyaları kaydedip, projemizi derleyelim. (Proje üzerinde sağ tık => build ya da en üstteki ikonlardan çekiç şeklinde olanı tıklayın ya da ya da CTRL+F11. )
Yukarıdaki resimden de anlaşılacağı üzere Selam beanimiz iki arayüzü gerçekliyor (implements): SelamLocal ve SelamRemote. Bu iki arayüz, kendilerine ait, isimleri sırasıyla SelamLocal.java ve SelamRemote.java olan 2 Java kaynak dosyası içinde tanımlanmış durumda.
Burada kısa teorik bilgiler verelim: EJB’ler, sunucu tarafındaki iş bileşenleridir (server-side business components). EJB’lerin 2 türünden birisi olan session beanler (diğer çeşidi olan message-driven beanleri (MDB) şimdilik konumuz dışında tutuyoruz), istemcilere (clients) hizmet veren iş metotlarına sahiptirler, yani istemciler adına sunucuda transactional olsun olmasın belli işleri yerine getirirler. Session beanleri, en genelde arayüzler üzerinde çalışır. Her session beanin ya yerel ya uzak ya da her ikisi de olmak üzere 1 ya da 2 tane arayüzü vardır. 2009 Aralık’ında yayımlanan Java EE 6’daki EJB 3.1 sürümüne göre bir session bean oluşturmak için artık yerel olsun uzak olsun herhangi bir arayüze gerek kalmadı. Ama biz bu projede geliştirdiğimiz Selam session beaninin iki tane arayüzünü oluşturduk ki EJBmiz, hem yerel hem de uzak istemcilere hizmet verebilsin.
Yerel istemcilerden kasıt, aynı JVM içinde çalışan ve Selam beanına ulaşan, yani ondan hizmet alan diğer uygulamalardır. Bunlar aynı JVM’de çalışan diğer EJB’ler olabilecği gibi web katmanındaki servlet, JSP, JSF’lerin managed beanleri vb. bileşenler olabilir. Bu tip EJB istemcileri aynı proje içinde olsun ya da olmasın, aynı JVM’de olduğu müddetçe, Selam’a yerel arayüzünden ulaşabilir. Açıktır ki servlet, JSP ya da JSF bileşenleri bir başka, muhtemelen bir web projesinde bulunacaklardır.
Uzak istemcilerden kasıt ise farklı JVM’de çalışan Java uygulamalarıdır. Örneğin başka bir JVM’e kurulmuş (deployed) EJB, servlet, JSP, JSF vb. yapılar içeren herhangi bir Java kodu, Selam için bir uzak istemcidir.
Biz bu örneğin istemcilerini geliştirirken, bir servlet yerel istemcisi ile main metotlu bir Java SE istemcisi geliştirip her iki şekilde de Selam’a ulaşacağız. Burada farkedilmesi gereken şey yerel istemcilerin SelamLocal üzerinden, uzak istemcilerin ise SelamRemote üzerinden Selam’a ulaşacak olmaları, dolayısıylada farklı metotları çağırabilecek olmalarıdır. (Burada yerel istemcilerin de sanki uzak istemciymiş gibi Selam’a SelamRemote üzerinden ulaşmaları söz konusudur.) Bu da bir EJB’nin bir yerel bir de uzak olmak üzere iki farkli istemci görünümünün (view) olduğunu ifade eder. Eğer her iki arayüzüne de aynı metotları koyarsanız bir iki görünüm de aynı olacaktır. Bu iki görünümün hangi durumlarda ve nasıl farklı olması gerektiğini sonraya bırakarak yolumuza devam edelim.
Selam session beanına neden arayüzler ile ulaşıyoruz diye bir soru sorulacak olursa, dağıtık nesnelerin (distributed objects) dışarıya ancak arayüzleri üzerinden hizmet verdiğini, bu nesneleri içinde barındıran uygulama sunucularının (application server), bu bileşenlere hiç bir istemcinin direk olarak ulaşmasına izin vermediklerini ve bu karmaşık yapının yönetimini üstlendiklerini belirterek, hızlıca cevap vermiş olalım.
Şimdi sıra hatasız bir şekilde derlediğimiz Selam EJB’mizi, SelamEJB projesiyle birlikte Glassfish uygulama sunucusuna kurmaya geldi. Bunun için SelamEJB projesi üzerinde sağ tık => Deploy seçmek yeterli. Netbeans’e ayrı bir uygulama sunucusu tanıtmadığınız müddetçe o, varsayılan Glassfish’i kullanacaktır. (Ben bu yazı için i5 işlemcili bir makinada çalışan 64-bit Win7 üzerinde, Netbeans 6.9.1 ve Glassfish 3.0.1 çalıştırıyorum.)
Yukarıdaki resimde, solda Services sekmesini tıklayıp sırasıyla Servers, Glassfish Server 3 ve Application “+”larını açında, kurulmuş olan SelamEJB uygulamamızı görüyoruz. Ayrıca sağ alttaki konsolda da Glassfish bize kurduğu SelamEJB projesinde var olan Selam session beanına nasıl ulaşacağımızı gösteren bilgiler veriyor.
Benzer bilgilere, Glassfish’in admin konsolu olan http://localhost:4848 adresinden de ulaşabilirsiniz. (Ya da Glassfish üzerinde sağ tık => View Admin Console)
Bu şekilde bir EJB projesi geliştirip Glassfish üzerine kurmuş olduk. Şimdi sıra, bu projede var olan Selam beanından hizmet alacak istemcileri geliştirmeye geldi. Onu da bir sonraki yazıda ele alalım.
Toplam görüntülenme sayısı: 2982
ahmet
27 Haziran 2011 @ 05:29
merhaba,
çok güzel ve anlaşır bir makale yazmışsınız.
ben SelamEJB dosyasını deploy edince “server cannot operate in current Locale. Locale switched to en_US for the process.” diyor daha sonra “GlassFish Server 2.1 Start failed” diyor.
bu hataları nasıl düzeltebilirim.
Akin
27 Haziran 2011 @ 11:39
Sanırım Glassfish’i çalıştırdığınız makinanızın locale ayarları Türkiye ve Türkçe, yani tr_TR. Bunun için ya bu ayarları en_US yapın ya da Glassfish’İn düzgün bir şekilde ayağa kalkması için gerekli settingleri ilgili dosyada yapın.
Ayrıca Glasfish pek çok sebepten dolayı “GlassFish Server 2.1 Start failed” diyebilr. Önc çalıştığı portu kontrol edin, 8080’i kullanan başka bir uygulama olmadığından emin olun. Exceptiona ve Glassfish’in loglarına bakın ve tam olarak problemin en olduğunu anlayın. Uygulamayı yüklemeseniz de Glassfish ayağa kalkmıyor mu? Belki de uygulamadan dolayı bir problem çıkıyordur.
ahmet
29 Haziran 2011 @ 00:55
teşekkürler sizin sayenizde sorunu çözdüm, sorun locale en_US’den kaynaklanmıyormuş. 8080 portunu kullanan başka bir uygulama varmış onu kapatınca sorunsuzca çalıştı
ahmet
30 Haziran 2011 @ 09:01
merhaba, glassfish kullanarak veritabanı kullanan bir web service yapmaya çalışıyorum. veritabanı bağlarken “JNDI name” soruyor bunu nerden bulabilirim.
Akin
30 Haziran 2011 @ 11:00
DataSource’un JNDI ismini soruyordur. Glassfish’de DataSource tanınıtp bunu yaparken belirlediğiniz JNDI ismini gerekli yerde kullanmanız lazım.
ahmet
30 Haziran 2011 @ 13:29
jndi’yi data source tanımlarken soruyor. oraya kendimiz mi isim veriyoruz yoksa başka biyerden mi buluyoruz.
Akin
30 Haziran 2011 @ 14:42
İsmi siz veriyorsunuz ki daha sonra JNDI lookup yaparken o JNDI ismini kullanı DataSource’unuza ulaşabilesiniz. Genel olarak “jdbc/MyDataSource” gibi bir isim verirsiniz.
ahmet
30 Haziran 2011 @ 15:31
kendim isim verip bağlantı kurdum. hata vermedi fakat veritabanından çektiğim veriler gelmiyor. bu neyden kaynakalnıyor olabilir.
Akin
30 Haziran 2011 @ 16:49
Valla bu durumun o kadar çok sebebi olabilir ki…
Tolga
13 Eylül 2011 @ 05:11
Gayet güzel ve anlaşılır bir anlatım olmuş bilginize sağlık. Makalelerinizin devamını bekliyoruz…