m i.c o
dil
Hacettepe Üniversitesi Bilgisayar Mühendisliği Bölümü
CORBA
ww w. ja
va
(Common Object Request Broker Architecture)
2006, Ankara
Hacettepe Üniversitesi Bilgisayar Mühendisliği
E-Posta Tarih
[email protected] 01.12.2006
[email protected] 20.11.2005
ww w. ja
va
dil
1. Ekip
İsim - Soyisim Doğukan DOĞAN Yusuf KARTAL Emre ÇAĞLAR
i.c o
Ekip 2. Ekip
m
HAZIRLAYANLAR
İçindekiler
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
[email protected]
1
Hacettepe Üniversitesi Bilgisayar Mühendisliği
ww w. ja
va
dil
i.c o
m
İçindekiler......................................................................................................................................... 1 1- OMG......................................................................................................................................... 2 2- CORBA Mimarisi .................................................................................................................... 3 2.1 IDL ..................................................................................................................................... 4 2.2 OMA................................................................................................................................... 4 3- ORB .......................................................................................................................................... 5 4- Dağıtık nesnelerde standart olarak CORBA ............................................................................ 6 4.1 IIOP .................................................................................................................................... 6 4.2 Java RMI ............................................................................................................................ 7 5- CORBA Servisleri .................................................................................................................... 8 6- CORBA Ürünleri...................................................................................................................... 9 7- CORBA ile Örnekler ................................................................................................................ 9 7.1 Gereksinimler ve Kurulumlar............................................................................................. 9 7.2 Hello World Uygulaması ................................................................................................. 11 7.3 Banka Uygulaması ........................................................................................................... 21 8- Kaynaklar ............................................................................................................................... 29
1- OMG
OMG (Object Management Group) çeşitli bilgi sistemleri üreticileri, yazılım geliştiricileri ve kullanıcılarının oluşturduğu, kar amacı gütmeyen uluslararası bir kuruluştur. OMG 1989 yılında kurulmuştur ve su anda Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
[email protected]
2
Hacettepe Üniversitesi Bilgisayar Mühendisliği
m
600’ü askın üyesi vardır. OMG, dağıtık, ölçeklenebilir, yeniden kullanılabilir, taşınabilir özelliklerde, yaygın çapta açık bir uygulama çatısı sunar.
2- CORBA Mimarisi
i.c o
CORBA (Common Object Request Broker Architecture), OMG’nin (Object Management Group) internet üzerinden birlikte çalışan uygulamalar için tasarladığı alt yapıdır. CORBA Nesne Yönetim Grubu'nun (OMG) Nesne Yönetim Mimarisi'nin (OMA) ana bileşenlerinden birisidir. Nesne Yönetim Mimarisi Nesne Modeli ve Referans Modelinden oluşur. Nesne Modeli heterojen bir ortamda dağılmış nesnelerin nasıl tanımlanabileceğini belirler. Referans Modeli ise nesneler arası etkileşimleri tanımlar. Dolayısıyla Nesne Yönetim Mimarisi heterojen ortamlara dağılmış beraber isleyebilen dağıtık nesnelerin geliştirilmesine ve konuşlandırılmasına yardımcı olur. Herhangi bir satıcının, herhangi bir işletim sistemi üzerinde çalışan, herhangi bir dille yazılmış CORBA tabanlı bir uygulaması, IIOP protokolü üzerinden; başka herhangi bir satıcının, herhangi bir işletim sistemi üzerinde çalışan, herhangi bir dille yazılmış bir başka CORBA tabanlı uygulaması ile iş birliği içinde çalışabilir.
dil
Dağıtık işlemler, bilgisayar alanında pek çok çözümde iyi bir yol sağlamaktadır. Paralel ve hızlı bir şekilde işlem yapmaları; hataya karşı daha dirençli olmaları gibi sebepler de dağıtık işleyen yapılara yönelmeye sebep olmuştur. Dağıtık işlemi sağlamak için kimi çözümler çıkmıştır. Bunlara soketler ve dağıtık işlem yapmak için tasarlanmış dilleri örnek verebileceğimiz gibi, daha üst seviyede CORBA ve RPC gibi yapıları da örnek verebiliriz. CORBA, RPC ile pek çok benzerliğe sahiptir. Yalnız RPC daha çok yapısal dillere yönelik iken; CORBA temel olarak nesneye yönelik dillere göre tasarlanmıştır.
va
Dağıtık nesnelerin iki yönü vardır. Bunlar sunucu ve istemci yönüdür. En basit haliyle bu ilişki söyle gerçekleşir: Sunucu uzak bir ara yüz (remote interface) sağlar ve istemci de sağlanan uzak ara yüzü çağırır. Bu ilişki RMI ve CORBA gibi birçok dağıtık nesne standartlarında benimsenen bir yaklaşımdır. Bu bağlamda, sunucu ve istemci terimlerinden kastedilen uygulama düzeyindeki etkileşimlerden ziyade nesne düzeyindeki etkileşimlerdir. Yani bir uygulama, herhangi bir nesne için sunucu olabilirken başka bir nesnenin istemcisi olabilir.
ww w. ja
Aşağıda bu tanımı özetleyen, dağıtık nesnelerin, bir CORBA istemci ve sunucusu üzerinden bir metodu nasıl paylaştıklarını gösteren klasik bir “Hello World” uygulaması görünmektedir.
İstemci tarafında, uygulama uzak nesnenin bir referansını içerir. Bu nesne referansı, uzaktan çağrılan nesne metodunun bir vekil metoduna sahiptir. Sunucu tarafından ise, ORB (Object Request Broker), uzaktan çağrıyı, yerel nesne üzerinde bir metot çağrısıymış gibi yapmak için bir kod gövdesi (çatı) kullanır. Bu gövde, mevcut çağrıyı ve uygulamaya özel Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
[email protected]
3
Hacettepe Üniversitesi Bilgisayar Mühendisliği
m
formattaki parametreleri çevirir ve metodu çağırır. Yordam dönüşünde, gövde, sonuçları ve hataları çevirerek çağrının geldiği istemciye tekrar, ORB’ yi kullanarak gönderir.
i.c o
ORB’ler arasında iletişim, paylaşılan ortak bir protokol üzerinden (IIOP-Internet Inter ORB Protocol) üzerinden sağlanır. IIOP, standart TCP/IP internet protokolü temel alınarak oluşturulmuş, ORB’ler arasında bilgi aktarımını sağlamak için oluşturulmuş bir protokoldür. Tıpkı CORBA ve IDL gibi IIOP de OMG tarafından tanımlanmış bir standarttır.
2.1 IDL
CORBA dil bağımsızlığını sağlar. Bir dilde yazılan CORBA nesnesi, başka bir dilde yazılan CORBA nesnesine istem gönderebilir. Nesneye yönelik bir dilde yazılan CORBA nesnesi(örneğin Java veya Smalltalk), C veya COBOL’da yazılan bir nesneyle konuşabilir, tersi de doğrudur.
dil
CORBA'nın temelinde nesneye yönelimli dillerin uzaktan yordam çağırısı yapmasını sağlayan yapı yatmaktadır. Bu çağrıyı yapabilmesi için hem sunucu tarafın hem de istemci tarafın ortak bir arayüzde anlaşması lazımdır. Bu arayüzü dillerden ve platformlardan bağımsız bir şekilde tanımlayabilmek için, CORBA bir tanımlama dili kullanmaktadır. Bu dile Interface Definition Language (IDL) denmektedir. Bu dil sayesinde nesnenin arayüzü tanımlanır. IDL derleyicileri, bu tanımı, istemci tarafında "stub" oluşturmak için, sunucu tarafta "skeleton" oluşturmak için kullanırlar. Üretilen bu kodları kullanarak, yapılan yordam çağırıları, sanki yereldeki bir nesneden çağrı yapılıyor gibi kullanılabilir.
va
İşte bu yüzden, IDL, CORBA için anahtar özelliklerden birisidir. CORBA’yı destekleyen her dil, kendi IDL eşleştirmesine sahiptir. Bu eşleştirmeler, OMG IDL’de tanımlanan CORBA türleri ile Java dilinin türleri arasında gerçekleşir. Hazırlanan idl dosyaları, bu eşleştirmeler temel alınarak, Java'da “idlj” (idltojava) derleyicisi ile Java kodlarına çevrilir. Ardından da elde edilen Java arayüzlerini gerçekleştiren kodlar ile arayüzleri çağıracak olan kodlar yazılır. Bu sayede sunucu tarafında gövde kısmı bulunan kodlar, istemci tarafındaki iskeletleri aracılığıyla işletilir.
ww w. ja
Her CORBA satıcısı IDL tanımlarını özel bir dile çeviren derleyici sağlarlar. Oracle8i JServer, idl2java derleyicisi kullanırlar. Idl2java derleyicisi, IDL ara yüzler tanımlarını Java sınıflarına çevirir.
2.2 OMA
IDL gerçekte bir alfabe vazifesi görmektedir. Bu sayede ortak bir dil oluşturarak CORBA karşılıklı işlerliğini kurmak ve parça yazılımların modüler olarak kullanılmasını sağlar. OMG’nin OMA’sı IDL alfabesinden türetilen ortak dili ifade eder. OMA karşılıklı işlerliği sistem seviyesinden uygulama seviyesine indirgeyen bir ortam sağlar. OMA’nın amacı uygulamaların getirdiği servisleri olası kullanıcılara standart bir arayüzle sağlamaktadır. CORBA Servisleri herhangi bir nesnenin ihtiyaç duyabileceği tüm temel servisleri belirler. Bu servisler çok daha evvelden gerçekleştirilmiş olup CORBA Üst Servisleri uygulamalar için orta seviyede servisler sağlamaktadır ve daha yeni yeni tanımlanmıştır. En üst seviyedeki uygulama nesneleri OMG tarafından değil yazılım geliştirici firmalarca gerçekleştirilmektedir. OMG OMA’nın her parçası için ayrı bir formal tanımlama sağlamaktadır. Bu tanımlama • •
Nesne işlemcilerinin nasıl çağrılacağını (OMG IDL’de hazırlanmış sözdizimi dokümanı) ve Her işlemin ne yaptığını içerir (İngilizce olarak hazırlanmış olan anlambilim dokumanı)
OMA uyumlu sistem geliştiricileri gerekli servisleri gerçekleştirerek kullanıma sunarlar. Ancak firmaların her servisi gerçekleştirme zorunluluğu yoktur, sadece OMG tanımlamalarına uyma zorunlulukları vardır. Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
[email protected]
4
Hacettepe Üniversitesi Bilgisayar Mühendisliği
m
3- ORB
i.c o
ORB (Object Request Broker) nesneler arasında veri değişimi ve iletişimini sağlayan bir orta katman teknolojisidir. ORB dağıtık nesnelerin veri değişim ve bunları kullanabilme kapasitelerinin arttırıldığı bir teknolojidir çünkü kullanıcıların birlikte olan nesneleri bölüp ORB’ler üzerinden haberleşebilecek şekilde sistem geliştirmelerine olanak verirler. ORB‘nin gerçekleştirim ayrıntıları, dağıtık sistem geliştirenler tarafından genellikle önemli değildir. Geliştiricilerin sadece nesne ara yüzleriyle ilgilenmeleri yeterlidir. Bilgi gizlemenin bu yolu sistemin daha kaliteli olmasına neden olur çünkü nesne iletişim ayrıntıları geliştiricilerden saklanır ve ORB içinde izole edilir. ORB teknolojisi makine, yazılım ve satıcı kısıtları arasında nesne iletişimini amaç edinerek ilerler. ORB teknolojisini ilgili fonksiyonları şunlardır; • Ara yüz tanımı • Uzak nesnelerin muhtemel aktivasyonları ve konumlandırmaları • İstemci ve nesne arasındaki iletişim
dil
ORB bir telefon santrali gibi davranır. Servisin dizinini sağlar ve bu servisler ile istemci arasında bir bağlantı kurulmasına yardım eder. ORB, sürekli ve etkili olarak birçok fonksiyonu desteklemek zorundadır. Fakat bu fonksiyonların çoğu ORB kullanıcılarından gizlenmiş haldedir. Bu yer ilizyonunu sağlamak ORB’nin sorumluluğundadır. Başka bir deyişle, geliştirici başka bir işlem ya da makine üzerinde sanki yerelde (local) çalışıyormuş gibi işlemlere devam etme saydamlığına sahiptir. Bu yüzden ORB nesneler arasındaki cross - system iletişimi için bir çatı sağlar. Bu, nesne sistemlerinin bilgilerini değiştirme ve kullanabilme yolundaki ilk teknik adımdır.
va
Nesne sistemleri bilgi değiş tokuşuna karsı diğer bir teknik adım da, platformlar arası nesne iletişimidir. ORB, nesnelerin, gerçekleştirim detaylarını, istemcilerden gizlemesine izin verir. Bu, programlama dilini, işletim sistemini, yerel donanım yapısını ve nesne konumunu kapsayabilir. Bütün bunlar “şeffaflık” olarak düşünülebilir ve farklı ORB teknolojileri, farklı saydamlıkları destekleyebilir.
ww w. ja
ORB kavramını uygulamanın birçok değişik yolu vardır. Örneğin, fonksiyonlar, istemciler için derlenebilir, işlemlere dağıtılabilir veya bir işletim sisteminin çekirdeğine dâhil olabilir. Bu temel tasarım kararları tek bir ürün içinde tanımlanabileceği gibi ORB uygulamacısının kararlarına bağlı olarak bir yelpaze içinde de yer alabilir. Ana olarak iki ORB teknolojisi vardır: • OMG’nin (Object Management Group) CORBA (Common Object Request Broker Architecture) spesifikasyonu •
Microsoft’un COM (Component Object Model) spesifikasyonu
ORB yapısının daha ayrıntılı bir çizimi aşağıda verilmiştir.
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
[email protected]
5
dil
i.c o
m
Hacettepe Üniversitesi Bilgisayar Mühendisliği
va
4- Dağıtık nesnelerde standart olarak CORBA
ww w. ja
CORBA spesifikasyonundaki temel amaçlardan birisi de, istemci ve nesne gerçekleştirimini taşınabilir yapmaktır. CORBA spesifikasyonları ayrıca dağıtık nesnelerle ilgilenen istemciler için ve CORBA nesnelerinin gerçekleştirimleri için bir API tanımlar. Yani herhangi bir şirketin CORBA ürünü için yazılan bir kod, minimum değişiklikle başka bir şirketin CORBA ürünü için yeniden yazılabilir. Fakat CORBA ürünlerinde bugünün dünyasına baktığımız zaman CORBA istemcilerinin taşınabilir olduğunu görürüz ama buna karşın nesne gerçekleştirimlerinin bir CORBA ürününden diğerine taşınırken belli miktarda yeniden çalışma yapıldığı görülmektedir. Bu bağlamda CORBA 2.0, IIOP (Internet Inter-ORB Protokol) adında, herhangi bir istemcinin herhangi bir CORBA ürünü kullanarak, herhangi bir CORBA ürünü kullanan başka bir istemci ile iletişim kurabilmesine olanak veren bir ağ protokolü tanımlamıştır. IIOP Internet üzerinden çalışan bir protokoldür.
İki sistem arasında bilgi değişilebilirliği ve değişildikten sonra da kullanılabilirliği (interoperability), dağıtık sistemler için taşınabilirlikten daha önemlidir.
4.1 IIOP
IIOP (Internet Inter-ORB Protocol), farklı programlama, dillerinde yazılmış dağıtık programların Internet üzerinden haberleşmelerini sağlayabilmek için geliştirilmiş bir protokoldür. IIOP, stratejik bir endüstri standardı olan CORBA için kritik bir kesimdir. CORBA’nın IIOP protokolünü kullanarak bir şirket kendi programlarıyla ya da başka bir şirketin programlarıyla, her nerede bulunursa bulunsun, program için servisi ve adı dışında bir bilgiye gereksinim duymadan iletişim kurabilir. CORBA ve IIOP sunucu/istemci modelini temel alan yaklaşımı kullanır. Buna göre bir istemci sürekli istemde bulunurken sunucu program da istemcide istemleri alıp yanıtlamak için bekler. Programcı programını yazarken GIOP (General Inter-ORB Protocol) adı verilen bir arayüz kullanır. GIOP bir veya daha çok ağ iletişim katmanında mapping yapmak üzere gerçekleştirilmiştir. Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
[email protected]
6
Hacettepe Üniversitesi Bilgisayar Mühendisliği
i.c o
m
İstemci tarafında, ağdaki herhangi bir bilgisayardaki bir programa istemde bulunmak için istemci program için bir adres bilgisine sahip olmalıdır. Bu adres IOR (Interoperable Object Reference)olarak bilinir. IIOP kullanılarak, adres sunucunun port numarası ve ip’sine dönüştürülür. İstemcinin bilgisayarında ise IOR leri proxy isimlerine eslemek için bir tablo tutulur. Buradaki amaç ise kullanımı kolaylaştırmaktır. GIOP, programa bir IOR ile bağlantı kurması için izin verir ve istemini gönderir. Daha sonra bir CDR (Common Data Representation) veri için encode ve decode işlemlerini yaparak verinin standart bir şekilde değişilmesini sağlar.
4.2 Java RMI
dil
Uzak Metot Çağırımı (RMI) ilk olarak JDK 1.1 ile gündeme gelmiş ve ağ programlamayı daha yüksek seviyelere taşımıştır. Uzak Metot Çağrımı’nın kullanımının nispeten kolay olmasının yanında fark edilir güçte teknolojiler arasında gösterilebilir. Uzak Metot Çağrımı, ortalama Java geliştiricilerini dağıtık işlemler dünyası adı verilen yeni bir değerler dizisi ile tanıştırmaktadır. Uzak Metot Çağrımı, dağıtık sistemlerdeki klasik Uzak Yordam Çağırma mantığına benzer şekilde, uzaktaki bir bilgisayar üzerinde çalışan “Uzak nesne ” nin metotlarını çağırabilmek olarak bilinmektedir. Diğer dağıtık programlama (Ara yüz Tanımlama Dili (IDL), Uzak Yordam Çağırma (RPC), vb) aksine Java Uzak Metot Çağrımı (RMI), Java programlama diline özgüdür.
va
Uzak Metot Çağrımı, dağıtılmış bir ortamda yerel çalışıyormuşçasına imkânlar sağlayan, uzaktan nesnelere ileti göndermeye yarayan temel bir teknoloji olarak görülebilir. Büyük çaplı yazılımlar başarılarını Uzak Metot Çağırımı’na borçludur. Bu tüy büyük çaptaki yazılımlarda Java RMI teknolojisi kullanıldığından, istemci ve sunucu da Java programlama dili ile kodlanacağı için dağıtık programlama tümüyle Java programlama dilinde gerçekleşmektedir. Böylelikle Java programlama dilinin özellikleri avantajları dağıtık programlamada da kullanılabilmiş olmaktadır. Java RMI ağ işlemleri için kullanıcıya soket ve streamlere göre daha üst düzeyde bir ara yüz sunmaktadır. Bu nedenle, RMI ile dağıtık programlama yapmak soket ve stream kullanımına göre daha az karmaşıktır. Programcı açısından bakıldığında, RMI kullanıldığında istemci/sunucu uygulamaların geliştirilmesi sırasında ağ işlem alt düzeydeki ayrıntıları ile uğraşmak gerekmemektedir.
ww w. ja
Çizim 1’de Java Sanal Makinesi–1 üzerinde bulunan bir Java uygulamasının, Java Sanal Makinesi–2 üzerinde bulunan Uzak Nesne isimli bir nesnenin Uzak_Metot() isimli bir metodunu çağrımı görülmektedir.
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
[email protected]
7
va
dil
i.c o
m
Hacettepe Üniversitesi Bilgisayar Mühendisliği
5- CORBA Servisleri
ww w. ja
CORBA Servisleri nesneye yönelik uygulama ve parçalar için temel, sistem seviyesinde hizmetler sağlamaktadır. Formal olarak sağlanan 15 servis aşağıda listelenmiştir. Bu servisler yeni sürümlerde artmaktadır. 1. Yaşam döngüsü servisi. 2. Bağıntı servisi. 3. İsimlendirme servisi. 4. Kalıcı nesne servisi. 5. Globalizasyon servisi. 6. Event servisi. 7. Nesne sorgulama servisi. 8. Nesne karakteristikleri servisi. 9. Hareket servisi. 10. Paralel işleme servisi 11. Lisans servisi. 12. Güvenlik servisi. 13. Güvenli zaman servisi. 14. Ticaret servisi. 15. Nesne koleksiyon servisi.
Corba ve OMG IDL uygulamaların birbirlerine bağlandıkları telefon hattı ve alfabe olarak düşünülebilir.
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
[email protected]
8
Hacettepe Üniversitesi Bilgisayar Mühendisliği
m
6- CORBA Ürünleri CORBA bir spesifikasyondur. Ürünlerin gerçekleştirimlerinde bir rehberdir. Birçok satıcı değişik programlama dilleri için CORBA ürünleri sağlayabilir. Java programlama dilini destekleyen CORBA ürünü şunları içerir. Açıklama
i.c o
ORB The Java 2 ORB SDK sı ile gelir.
Java 2 ORB, Sun’ın Java 2
VisiBroker for Java
Inspire Corporation tarafından popüler bir Java ORB. Netscape Communicator web tarayıcı içine gömülen ORB’dir. Lona Technologies tarafından popüler bir Java ORB
dil
OrbixWeb WebSphere
IBM tarafından ORB içeren popüler bir uygulama sunucusu
Netscape Communicator
Netscape, VisiBroker‘ın bir sürümüne sahiptir. Appletler, web tarayıcıya ORB sınıfları yüklemeden CORBA nesnesi
va
üzerinden istem gönderebilir
ww w. ja
7- CORBA ile Örnekler
7.1 Gereksinimler ve Kurulumlar Kullanılan bileşenler aşağıdakilerdir: 9 9
9
9
9
JDK 1.5.0 sürümü kullanılmıştır. www.java.com adresinden indirilebilir. IDE olarak Eclipse 3.2.1 kullanılmıştır. Eclipse’in bu sürümü www.eclipse.org adresinden indirilebilir. Eclipse kullanılarak yazılımı geliştirmek için bir Eclipse eklentisine (plugin) ihtiyacımız var. Bunun için ORB Studio 7 kullanılmıştır. www.orbzone.org/?p=125 adresinden indirilebilir. idl’i kullanarak CORBA uyumlu java sınıfları yaratan derleyici olarak JacORB-2.2.4 kullanılmıştır. www.jacorb.org adresinden indirilebilir. Jacorb’dan yararlanabilmek için Apache Ant 1.6.5 kullanılmıştır. http://ant.apache.org adresinden indirelebilir.
Gerekli Kurulumlar: 9 Eclipse’in plugin klasörüne ORBStudio_7.7.5.jar eklentisi kopyalanır. 9 Jacorb herhangi bir yere açılır. (extract). Yüklenen dizinde boşluk olmamasına dikkat edilir. Biz bu örneğimizde C: dizinine açtık. (C:\JacORB-2.2.4) Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
[email protected]
9
Hacettepe Üniversitesi Bilgisayar Mühendisliği
9
va
dil
i.c o
9
Apache Ant herhangi bir yere açılır. (extract). Yüklenen dizinde boşluk olmamasına dikkat edilir. Biz bu örneğimizde C: dizinine açtık. (C:\apache-ant-1.6.5) Apache Ant ortam değişkenlerinden path değişkenine eklenir. ( ‘;’ ile ayrılıp Apache Ant’ın yüklü olduğu dizinden bin klasörü gösterilir. )
m
9
Konsoldan Jacorb ‘un bulunduğu dizine gidilir ve burada iki ant komutu çalıştırılır: ant jaco ant idlcmd
ww w. ja
o o 9
Eclipse’de kullanacağımız idl derleyicisini jacorb olarak ayarlamamız gerekmektedir. Bunun için Eclipse çalıştırılır. Window / Prefences seçeneği tıklandığında çıkan ekranda OrbStudio / IDL compiler seçeneğindeki derleyici JacORB olarak değiştirilir.
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
[email protected]
10
Bir önceki maddede anlatılan Window / Prefences / OrbStudio / IDL Compiler seçeneğine tekrar gelinir ve alt seçeneklerden JacORB seçilir. Çıkan ekranda IDL command kısmına idl.bat ‘ın bulunduğu yol yazılır. Command Options kısmında ise idl.jar ve logkit-1.2.jar yolları düzenlenir. IDL Command : C:\JacORB-2.2.4\bin\idl.bat Command Options : -cp "C:/JacORB-2.2.4/lib/idl.jar;C:/JacORB-2.2.4/lib/logkit1.2.jar" org.jacorb.idl.parser -d %D% %F%
ww w. ja
o o
va
9
dil
i.c o
m
Hacettepe Üniversitesi Bilgisayar Mühendisliği
9
Uygulamamız çalışmaya hazır hale gelmiştir. Gerekli idl kütüğü artık yazılabilir.
7.2 Hello World Uygulaması
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
[email protected]
11
Hacettepe Üniversitesi Bilgisayar Mühendisliği
m
Bu örneğimizde Java IDL kullanarak örnek bir CORBA dağıtık uygulamanın nasıl gerçekleştirildiğini göreceğiz. Adım adım klasik bir “Hello World” uygulaması geliştireceğiz. Hello World programı, basılmak üzere bir katar döndüren sadece bir eylem gerçekleştirir.
i.c o
Uygulamadaki adımları daha iyi anlamak açısından CORBA yapısını tekrar gözden geçirmekte fayda vardır.
IDL ara yüzünü yazmak
va
•
dil
1- İstemci, Hello Server’ın sayHello metodunu çağırır. 2- ORB, bu çağrıyı IDL ara yüzü için kayıtlı hizmet veren nesneye transfer eder. 3- Hizmeti sunan nesnenin sayHello metodu çalıştırılır. Karşılığında bir Java String tipinde nesne döner. 4- ORB, bu String tipindeki nesneyi tekrar istemciye yönlendirir. 5- İstemci String tipindeki nesnenin değerini yazdırır. Basit tasarımına karsın bu uygulama temel bir CORBA uygulaması geliştirmek için gereken altyapıyı sağlar.
Bu bölümde Hello World uygulaması için basit bir IDL ara yüzü yazacağız. IDL ara yüzü, uygulamamızdaki istemci ve sunucu kesimi için etkiletişimi sağlar. OMG IDL programlama dilinden bağımsız bir kesimdir. Herhangi bir gerçekleştirime yönelik kodlamadan önce IDL’ i Java’ya “map” etmemiz gerekir. “Hello. idl”’i yazmak
ww w. ja
•
Hello World için yazılması gereken IDL oldukça basittir. Bunun için aşağıda belirtilen üç adımları uygulamak yeterlidir.
Adım 1: CORBA IDL modülünü tanımlamak
a) Eclipse’de yeni bir java projesi açın ve bu projeye bir Simple IDL kütüğü ekleyin (Hello.idl). b) Kütük içine aşağıdaki modül satırlarını girin.
module HelloApp { // Sonraki kodları buraya ekleyin.
};
•
Arayüzü tanımlamak
Hello.idl kütüğünün içine aşağıdaki ara yüz deyimlerini yazın.
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
[email protected]
12
Hacettepe Üniversitesi Bilgisayar Mühendisliği
};
// Bu // dört // satırı // ekleyin.
m
module HelloApp { interface Hello {
i.c o
}
IDL’i derlediğiniz zaman, bu deyim Java kodunda bir ara yüz deyimi oluşturacaktır. Sunucu ve istemci sınıfları Hello ara yüzünü değişik yollardan implement edecektir. •
Metotları tanımlamak
CORBA işlemleri, sunucuların istemci namına gerçekleştirmeye söz verdiği davranışlardır. IDL türündeki her işlem deyimi, üretilen Java ara yüzündeki ilgili metot deyimini üretir. Hello.idl kütüğüne aşağıdaki ara yüz deyimlerini ekleyin.
dil
module HelloApp { interface Hello { string sayHello(); // Bu satırı ekleyin. }; };
va
Çünkü bizim küçük Hello World uygulamamız sadece bir tane işlem içerir. Hello.idl şimdi son halini almıştır. “Hello.idl”’i “IDL”’den “Java”’ya çevirmek
ww w. ja
Hello.idl üzerinde sağ tuş yapıp ORB Menu’den Compile seçeneğini tıklayalım, bu IDLimizi derleyecektir. IDL’i derlediğiniz zaman, yukarıdaki tüm deyimler HelloApp paketi içerisinde Java kodlarına dönüşecektir.
Eğer dizinin içeriğini listelerseniz, HelloApp adlı dizinin yaratıldığını ve içerisinde de 7 tane kütük bulunduğunu göreceksiniz. Hello.java kütüğünü bir metin editörü ile açarsanız şu satırlarla karsılaşırsınız.
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
[email protected]
13
Hacettepe Üniversitesi Bilgisayar Mühendisliği
/** * * */
Generated from IDL interface "Hello" @author JacORB IDL compiler V 2.2.3, 10-Dec-2005
i.c o
public interface Hello extends HelloOperations, org.omg.CORBA.Object, org.omg.CORBA.portable.IDLEntity { }
•
m
package HelloApp;
İstemci Uygulamayı Geliştirmek
dil
CORBA istemcisinin temel yapısı birçok Java uygulamasından farklı değildir. Gerekli paketleri ekleyin, bir uygulama sınıfı tanımlayın, bir main metodu tanımlayın, istisnaları yakalamayı da unutmayın. *Gerekli Paketlerin Eklenmesi Projemize “implementation” adında bir paket ekleyin ve bir java kütüğünü HelloClient.java olarak kaydedin. Daha sonra gerekli paketleri ekleyin:
va
package implementation; import HelloApp.*; // stub altyapısını saglamak için. import org.omg.CosNaming.*; // HelloClient isimlendirme servisini kullanır import org.omg.CORBA.*; // Bütün CORBA uygulamaları buna ihtiyaç duyar
*Main metodunun tanımlanması
ww w. ja
Her Java uygulaması main metoduna ihtiyaç duyar. Main metodunu HelloClient.java sınıfının etkinlik alanı içinde aşağıdaki gibi tanımlayın.
public static void main(String args[]) { // Daha sonra buraya try-catch blogu ekleyin }
*CORBA Sistem İstisnalarını Ele Almak
Bütün CORBA uygulamalarının çalışma anında CORBA sistem hatasını fırlatabileceğini göz önüne alarak, main içindeki tüm kodu try-catch bloğuna almamız gerekir. İstisna yakalayıcımız sadece istisnanın ismini yazdırır ve yığıt izini ekrana basar.
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
[email protected]
14
Hacettepe Üniversitesi Bilgisayar Mühendisliği
i.c o
m
try { // HelloClient kodu buraya yazılacaktır. } catch(Exception e) { System.out.println("ERROR : " + e); e.printStackTrace(System.out); }
*Bir ORB Nesnesi Yaratmak
Bir CORBA istemcisi, bütün marchalling ve IIOP işlemlerini gerçekleştirmek için yerel bir ORB nesnesine ihtiyacı vardır. HelloClient sınıfının içinde, try-catch bloğunun içine bir ORB değişkeni tanımlayalım.
dil
org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null);
ORB’nin init metodunu çağırmak, uygulamamızın komut satırı argümanlarını aktarmaya yarar ve çalışma anında kesin özellikleri değiştirmemize izin verir.
va
PoaManager’i aktif hale getirmek için aşağıdaki kod bloğunu ekleyin.
org.omg.PortableServer.POA poa = org.omg.PortableServer.POAHelper .narrow(orb.resolve_initial_references("RootPOA")); poa.the_POAManager().activate();
ww w. ja
*Hello Sunucusunu Bulmak
CORBA istemcisi için bir ilk nesne referansı almak için çeşitli yolar vardır. Bizim uygulamamız bunun için COS isimlendirme servisini kullanacaktır. COS, OMG tarafından tanımlanmış ve Java IDL destekleyen bir servistir. NameServer bütün CORBA ORB’leri için tanımlı bir katardır. Bu kadarı parametre olarak geçtiğimiz zaman, ORB bir naming context döndürür.
NamingContextExt nc = NamingContextExtHelper.narrow(orb .resolve_initial_references("NameService"));
Hello sunucusunu bulabilmek NameComponent’a ihtiyaç vardır.
için
öncelikle
Hello
sunucusunun
kimliğini
tanımlayan,
bir
NameComponent[] helloName = new NameComponent[1]; helloName[0] = new NameComponent("Hello", "server");
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
[email protected]
15
Hacettepe Üniversitesi Bilgisayar Mühendisliği
Hello nesnesine olan yol sadece bir element içerdiği için, nc üstünden tek elemanlı bir dizi oluşturulur.
m
Son olarak, Hello sunucusuna bir referans almak için ve bunu Hello nesnesine vermek için, isim servisin resolve metoduna gerekli yol paramatre olarak geçilir.
•
sayHello() işlemini çağırmak 9
HelloClient.java içinde, try-catch bloğunun içine isim servisinin resolve metodunu çağırmak için aşağıdaki çağrı yapılır.
dil
String Hello = hello.sayHello();
9
i.c o
Hello hello = HelloHelper.narrow(nc.resolve(helloName));
Son olarak da sonuç ekrana bastırılır.
9 •
va
System.out.println(Hello);
Kütük kaydedilir ve kapatılır (HelloClient.java)
HelloWorld sunucusunun geliştirilmesi
ww w. ja
Projemize HelloServer.java isminde bir kütük yaratın. Sonra aşağıdaki paketleri ekleyin. *Gerekli paketleri eklemek
package implementation; import HelloApp.*; // HelloServer isimlendirme servisini kullanacak. import org.omg.CosNaming.*; import org.omg.CosNaming.NamingContextPackage.*; // Bütün CORBA uygulamalı bu paketi kullanır. import org.omg.CORBA.*;
•
Sunucu sınıfını tanımlamak
public class HelloServer { // kodlar buraya. }
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
[email protected]
16
Hacettepe Üniversitesi Bilgisayar Mühendisliği
Main içine aşağıdaki try-catch bloğunu ekleyin.
i.c o
try { // HelloServer kodları buraya eklenecektir } catch(Exception e) { System.err.println("ERROR: " + e); e.printStackTrace(System.out); }
m
*CORBA sistem hatalarını ele almak
*ORB nesnesini yaratmak
dil
İstemci gibi sunucu uygulama da yerel bir ORB nesnesine ihtiyaç duyar.
ORB orb = ORB.init(args, null);
PoaManager’i aktif hale getirmek için aşağıdaki kod bloğunu ekleyin.
va
org.omg.PortableServer.POA poa = org.omg.PortableServer.POAHelper .narrow(orb.resolve_initial_references("RootPOA")); poa.the_POAManager().activate();
ww w. ja
Hizmet edecek sınıf hala tanımlanmadı. Bunu daha sonraki adımlarda yapacaksınız. Bir sonraki adımda nesnemizi ORB’ye bağlayacağız. Böylece ORB gelen çağrıların farkına varıp bu çağrıları doğru hizmet eden sınıfa aktarabilir.
org.omg.CORBA.Object helloObject = poa .servant_to_reference(new HelloServant(orb)); •
Hizmetçi sınıfı tanımlamak o
Sınıfı tanımlayın.
class HelloServant extends HelloPOA{ // sayHello metodunu burada olusturun. }
o
Hizmetçi sınıf HelloPOA sınıfının alt sınıfıdır. Bu yüzden derleyici tarafından bütün CORBA fonksiyonelliği kalıtılır.
o
Gerekli sayHello metodunu tanımlayın.
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
[email protected]
17
m
Hacettepe Üniversitesi Bilgisayar Mühendisliği
o
sayHello tanımını olusturun.
return "\nHello World!!\n";
•
COS isimlendirme servisi ile çalışmak
i.c o
public String sayHello() { //metot tanımını burada olusturun }
dil
NamingContextExt nc = NamingContextExtHelper.narrow(orb .resolve_initial_references("NameService")); Yeni bir NameComponent nesnesi yaratın.
va
NameComponent[] hello = new NameComponent[1]; hello[0] = new NameComponent("Hello", "server");
Hello nesnesine olan yol sadece bir element içerdiği için, nc üstünden tek elemanlı bir dizi oluşturulur. Son olarak yolu ve hizmetçi sınıfı isimlendirme servisine geçin ve nesneyi “Hello” id’si ile bağlatın.
ww w. ja
nc.rebind(hello, helloObject);
Sunucumuz hazır. Tek ihtiyacı olan çevrede ihtiyacı olan istemcilerden istem beklemektir. Bunun için trycatch bloğunun sonuna aşağıdaki kod kesimi eklenir.
java.lang.Object sync = new java.lang.Object(); synchronized(sync) { sync.wait(); }
Uygulamamızı Çalıştırmak •
Uygulamayı derlemek ve çalıştırmak
Eclipse Hello.idl’imizi derledikten sonra java kodlarımızda otomatik olarak derlenir. Java kütüklerinin .class uzantılı kütükleri oluşur. Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
[email protected]
18
Hacettepe Üniversitesi Bilgisayar Mühendisliği
Uygulamayı Çalıştırmak: Windows için komut satırını açın ve Java IDL isim servisini başlatın. tnameserv -ORBInitialPort 1050
•
Sunucu’yu -ORBInitialPort 1050 parametresiyle çalıştırın. Eclipse’te Run özelliklerine gidilerek parametre yazılabilir.
•
İstemciyi -ORBInitialPort 1050 parametresiyle çalıştırın. Eclipse’te Run özelliklerine gidilerek parametre yazılabilir.
•
İstemci aşağıdaki katarı ekrana basar.
Hello world!!
i.c o
m
•
dil
NameServer’ı ve HelloServer’ı istemci uygulama başarıyla sonuçlandıktan sonra sonlandırmayı unutmayın. Uygulamada anlatılan java kodları aşağıda verilmiştir.
1) Hello.idl
ww w. ja
va
module HelloApp { interface Hello { string sayHello(); }; };
2) HelloClient.java
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
[email protected]
19
Hacettepe Üniversitesi Bilgisayar Mühendisliği
import org.omg.CosNaming.NameComponent; import org.omg.CosNaming.NamingContextExt; import org.omg.CosNaming.NamingContextExtHelper;
i.c o
import HelloApp.HelloHelper; import HelloApp.Hello;
m
package implementation;
public class HelloClient {
public static void main(String[] args) { try{ Hello hello;
org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null);
dil
org.omg.PortableServer.POA poa = org.omg.PortableServer.POAHelper .narrow(orb.resolve_initial_references("RootPOA")); poa.the_POAManager().activate();
NamingContextExt nc = NamingContextExtHelper.narrow(orb .resolve_initial_references("NameService"));
va
NameComponent[] helloName = new NameComponent[1]; helloName[0] = new NameComponent("Hello", "server"); hello = HelloHelper.narrow(nc.resolve(helloName)); String Hello = hello.sayHello(); System.out.println(Hello);
ww w. ja
} catch (Exception e) { e.printStackTrace(); }
}
}
3) HelloServer.java
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
[email protected]
20
package implementation; import org.omg.CosNaming.*; import org.omg.CORBA.*; //import org.omg.CosNaming.NamingContextPackage.*;
i.c o
public class HelloServer { public static void main(String args[]) { try{ // Create and initialize the ORB ORB orb = ORB.init(args, null);
m
Hacettepe Üniversitesi Bilgisayar Mühendisliği
org.omg.PortableServer.POA poa = org.omg.PortableServer.POAHelper .narrow(orb.resolve_initial_references("RootPOA")); poa.the_POAManager().activate(); org.omg.CORBA.Object helloObject = poa .servant_to_reference(new HelloServant(orb));
dil
NamingContextExt nc = NamingContextExtHelper.narrow(orb .resolve_initial_references("NameService")); NameComponent[] hello = new NameComponent[1]; hello[0] = new NameComponent("Hello", "server"); nc.rebind(hello, helloObject);
Wait for invocations from clients java.lang.Object sync = new java.lang.Object(); synchronized(sync){ sync.wait(); }
va
//
ww w. ja
orb.run(); } catch(Exception e) { System.err.println("ERROR: " + e); e.printStackTrace(System.out); } }
}
7.3 Banka Uygulaması
Bu örneğimizde basit bir banka uygulaması gerçekleştirilmiştir. 1. Banka (BankSystem), Müşteri (Customer) ve Hesap (Account) öğelerimiz bulunmaktadır. 2. Banka’da kayıtlı müşteriler ve hesaplar bulunmaktadır. 3. Banka müşteri ekleme, müşteri silme, hesap ekleme, hesap silme işlemleri yapmaktadır. 4. Her müşterinin bir idsi, ismi ve hesapları bulunmaktadır. 5. Her hesabın bir idsi ve hesap limiti bulunmaktadır. 6. Banka sunucu tarafında çalışmaktadır. 7. İstemci, bankanın(sunucunun) işlevlerinden yararlanır. (Hesap ekleme, müşteri ekleme…) • Bank.idl’in oluşturulması: Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin.
[email protected]
21
Hacettepe Üniversitesi Bilgisayar Mühendisliği
Eclipse’te projemize Simple IDL kütüğü ekleyin ve aşağıdaki modül satırlarını girin. Aşağıdaki Bank modülünde Hesap (Account), Müşteri (Customer) ve Banka (BankSystem) arayüzleri tanımlanmıştır.
module Bank{
i.c o
interface Account{ attribute long accountId; attribute long accountLimit; };
m
9
typedef sequence
AccountList; interface Customer{ attribute string customerName; attribute long customerId;
}; interface BankSystem{
dil
boolean openCustomerAccount(in Account account); AccountList getCustomerAccounts(in long customerId);
va
Customer createCustomer(in string customerName, in long customerId); boolean deleteCustomer(in long customerId); Account createAccount(in long accountId, in long accountLimit); boolean deleteAccount(in long accountId); }; };
ww w. ja
Her tanımlı arayüz içerisinde gerekli işlevlerin tanımına yer verilmiştir. 9 Bank.idl üzerinde sağ tuş yapıp ORB Menu’den Compile seçeneğini tıklayalım, bu IDLimizi derleyecektir. IDL’i derlediğiniz zaman, yukarıdaki tüm deyimler Bank paketi içerisinde Java kodlarına dönüşecektir. 9
Oluşan arayüzlere karşılık gerçekleştirimler için “implementation” adında paket oluşturun. Gerçekleştirimler aşağıdaki şekilde doldurulur. Bunlar basit hesap ekleme, hesap silme, hesap açma, müşteri ekleme, müşteri silme işlemleridir.
AccountImplementation.java:
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. [email protected]
22
Hacettepe Üniversitesi Bilgisayar Mühendisliği
m
package implementation; import Bank.AccountPOA;
private int accountId; private int accountLimit;
i.c o
public class AccountImplementation extends AccountPOA {
public AccountImplementation(int accountId, int accountLimit){ accountId(accountId); accountLimit(accountLimit); } public int accountId() { return this.accountId; }
dil
public void accountId(int newAccountId) { this.accountId = newAccountId; } public int accountLimit() { return this.accountLimit; }
ww w. ja
}
va
public void accountLimit(int newAccountLimit) { this.accountLimit = newAccountLimit; }
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. [email protected]
23
Hacettepe Üniversitesi Bilgisayar Mühendisliği
BankSystemImplementation.java:
m
package implementation; import java.util.ArrayList; import org.omg.CORBA.ORB;
i.c o
import Bank.Account; import Bank.BankSystemPOA; import Bank.Customer;
public class BankSystemImplementation extends BankSystemPOA { private ORB orb; ArrayList customerArray; ArrayList accountArray;
dil
public BankSystemImplementation(org.omg.CORBA.ORB orb){ this.orb = orb; customerArray = new ArrayList(); accountArray = new ArrayList(); }
va
public Account createAccount(int accountId, int accountLimit) { AccountImplementation accImp = new AccountImplementation(accountId,accountLimit); accountArray.add(accImp); return accImp._this(orb); }
ww w. ja
public Customer createCustomer(String customerName, int customerId) { CustomerImplementation cusImp = new CustomerImplementation(customerName,customerId); customerArray.add(cusImp); return cusImp._this(orb); } public boolean deleteAccount(int accountId) { for(int i=0;i
}
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. [email protected]
24
Hacettepe Üniversitesi Bilgisayar Mühendisliği
m
public boolean deleteCustomer(int customerId) { for(int i=0;i<customerArray.size();++i) System.out.println(customerArray.get(i).customerName());
i.c o
boolean isDeleted = false; for(int i=0;i<customerArray.size();++i){ if(customerArray.get(i).customerId() == customerId){ customerArray.remove(i); isDeleted = true; } }
System.out.println("after deleting customer"); for(int i=0;i<customerArray.size();++i) System.out.println(customerArray.get(i).customerName()); return isDeleted;
ww w. ja
va
}
dil
}
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. [email protected]
25
Hacettepe Üniversitesi Bilgisayar Mühendisliği
CustomerImplementation.java:
m
package implementation; import Bank.Account; import Bank.CustomerPOA; import java.util.ArrayList;
private int customerId; private String customerName;
i.c o
public class CustomerImplementation extends CustomerPOA {
private ArrayList customerAccounts = new ArrayList(); public CustomerImplementation(String customerName, int customerId){ customerName(customerName); customerId(customerId); }
dil
public int customerId() { return this.customerId; }
public void customerId(int newCustomerId) { this.customerId = newCustomerId; }
va
public String customerName() { return this.customerName; }
public void customerName(String newCustomerName) { this.customerName = newCustomerName; }
ww w. ja
public Account[] getCustomerAccounts(int customerId) { return this.customerAccounts.toArray(new Account[customerAccounts.size()]); } public boolean openCustomerAccount(Account account) { customerAccounts.add(account); return true; }
}
Sunucu ve İstemci’nin oluşturulması: 9 Bir önceki örneğimizdeki gibi isimlendirme servisi, ORB nesne yaratımı gibi kriterlere dikkat ederek aşağıdaki kodu Sunucu (Server) sınıfı içerisine yerleştirin.
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. [email protected]
26
Hacettepe Üniversitesi Bilgisayar Mühendisliği
m
Server.java
package implementation; import org.omg.CosNaming.*;
i.c o
public class Server { public static void main(String args[]){ org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null); try{ System.out.println("Server calisti");
org.omg.PortableServer.POA poa = org.omg.PortableServer.POAHelper.narrow(orb.resolve_initial_references("RootPOA "));
dil
poa.the_POAManager().activate();
org.omg.CORBA.Object bankSystemObject = poa.servant_to_reference(new BankSystemImplementation(orb)); NamingContextExt nc = NamingContextExtHelper.narrow(orb.resolve_initial_references("NameService"));
va
NameComponent[] bankSystemName = new NameComponent[1]; bankSystemName[0] = new NameComponent("BankSystem", "server");
nc.rebind(bankSystemName, bankSystemObject);
ww w. ja
} catch(Exception e){ e.printStackTrace(); } orb.run();
}
}
9
Bir önceki örneğimizdeki gibi isimlendirme servisi, ORB nesne yaratımı gibi kriterlere dikkat ederek aşağıdaki kodu İstemci (Client) sınıfı içerisine yerleştirin.
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. [email protected]
27
Hacettepe Üniversitesi Bilgisayar Mühendisliği
package implementation; org.omg.CosNaming.NameComponent; org.omg.CosNaming.NamingContextExt; org.omg.CosNaming.NamingContextExtHelper; Bank.Account; Bank.BankSystem; Bank.BankSystemHelper; Bank.Customer;
i.c o
import import import import import import import
m
Client.java
public class Client { public static void main(String args[]){ try{
System.out.println("Client calisti"); BankSystem bankSystem;
dil
org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null); NamingContextExt nc = NamingContextExtHelper.narrow(orb.resolve_initial_references("NameService")); NameComponent[] bankSystemName = new NameComponent[1]; bankSystemName[0] = new NameComponent("BankSystem",
va
"server");
bankSystem = BankSystemHelper.narrow(nc.resolve(bankSystemName));
ww w. ja
Account account = bankSystem.createAccount(123456, 1000); Customer customer = bankSystem.createCustomer("Yusuf Kartal",98765432); customer.openCustomerAccount(account); Account[] accountList = customer.getCustomerAccounts(987654321); for(int i=0; i
Dogan",88885432);
bankSystem.deleteCustomer(88885432);
Account account2 = bankSystem.createAccount(111156, 1000); bankSystem.deleteAccount(111156);
} catch(Exception e){ e.printStackTrace(); }
}
}
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. [email protected]
28
i.c o
Uygulamamızın Çalıştırılması: 9 Komut satırını açın ve Java IDL isim servisini başlatın. o tnameserv –ORBInitialPort 1050
m
Hacettepe Üniversitesi Bilgisayar Mühendisliği
Sunucu’yu -ORBInitialPort 1050 parametresiyle çalıştırın. Eclipse’te Run özelliklerine gidilerek parametre yazılabilir.
9
İstemciyi -ORBInitialPort 1050 parametresiyle çalıştırın. Eclipse’te Run özelliklerine gidilerek parametre yazılabilir.
9
Program aşağıdaki gibi çıktı üretecektir:
ww w. ja
va
Server calisti Yusuf Kartal Dogukan Dogan after deleting customer Yusuf Kartal 123456 111156 after deleting account
dil
9
8- Kaynaklar
ftp.cs.hacettepe.edu.tr/pub/dersler/BIL4XX/BIL447_YML/belgeler/Java_IDL.pdf ftp.cs.hacettepe.edu.tr/pub/dersler/BIL4XX/BIL447_YML/belgeler/CORBA_20122034.pdf http://www.objs.com/ http://java.sun.com/docs/books/tutorial/idl/intro/corba.html http://www.omg.org/gettingstarted/corbafaq.htm http://tr.wikipedia.org/wiki/CORBA http://www.sei.cmu.edu/str/descriptions/orb.html http://whatis.techtarget.com/definition/0,,sid9_gci214019,00.html http://searchwebservices.techtarget.com http://www.corba.org/
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. [email protected]
29