Professional Documents
Culture Documents
CORBA WwwJavaDiliCom
CORBA WwwJavaDiliCom
CORBA WwwJavaDiliCom
i.c
dil
CORBA
(Common Object Request Broker Architecture)
ja va
w.
ww
2006, Ankara
Hacettepe Üniversitesi Bilgisayar Mühendisliği
HAZIRLAYANLAR
m
Ekip İsim - Soyisim E-Posta Tarih
2. Ekip Doğukan DOĞAN dogukan_dogan@hotmail.com 01.12.2006
Yusuf KARTAL ykartal@gmail.com
1. Ekip Emre ÇAĞLAR 20.11.2005
o
i.c
dil
ja va
w.
ww
İçindekiler
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 1
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği
İçindekiler......................................................................................................................................... 1
m
1- OMG......................................................................................................................................... 2
2- CORBA Mimarisi .................................................................................................................... 3
2.1 IDL ..................................................................................................................................... 4
2.2 OMA................................................................................................................................... 4
3- ORB .......................................................................................................................................... 5
o
4- Dağıtık nesnelerde standart olarak CORBA ............................................................................ 6
4.1 IIOP .................................................................................................................................... 6
4.2 Java RMI ............................................................................................................................ 7
i.c
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
dil
8- Kaynaklar ............................................................................................................................... 29
va
ja
w.
ww
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. 2
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği
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.
m
2- CORBA Mimarisi
CORBA (Common Object Request Broker Architecture), OMG’nin (Object Management Group) internet
o
ü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
i.c
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.
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
dil
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.
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
va
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.
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.
ja
w.
ww
İ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. 3
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği
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.
m
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.
o
2.1 IDL
CORBA dil bağımsızlığını sağlar. Bir dilde yazılan CORBA nesnesi, başka bir dilde yazılan CORBA
i.c
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.
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
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.
İş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
va
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.
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.
ja
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
w.
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
ww
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. 4
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği
3- ORB
m
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ı
o
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;
i.c
• Ara yüz tanımı
• Uzak nesnelerin muhtemel aktivasyonları ve konumlandırmaları
• İstemci ve nesne arasındaki iletişim
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.
dil
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.
Nesne sistemleri bilgi değiş tokuşuna karsı diğer bir teknik adım da, platformlar arası nesne iletişimidir.
va
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.
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
ja
alabilir.
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 5
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği
o m
i.c
4- Dağıtık nesnelerde standart olarak CORBA
dil
va
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.
ja
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.
w.
İ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
ww
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. 6
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği
İ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
m
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.
o
4.2 Java RMI
Uzak Metot Çağırımı (RMI) ilk olarak JDK 1.1 ile gündeme gelmiş ve ağ programlamayı daha yüksek
i.c
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.
dil
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
va
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.
Ç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.
ja
w.
ww
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 7
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği
o m
i.c
dil
va
5- CORBA Servisleri
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
ja
artmaktadır.
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.
ww
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. 8
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği
6- CORBA Ürünleri
m
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.
ORB Açıklama
o
The Java 2 ORB Java 2 ORB, Sun’ın Java 2
SDK sı ile gelir.
i.c
VisiBroker for Java Inspire Corporation tarafından
popüler bir Java ORB. Netscape
Communicator web tarayıcı içine
gömülen ORB’dir.
WebSphere
Netscape Communicator
dil IBM tarafından ORB içeren popüler
bir uygulama sunucusu
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. 9
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği
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)
9 Apache Ant ortam değişkenlerinden path değişkenine eklenir. ( ‘;’ ile ayrılıp Apache Ant’ın yüklü
m
olduğu dizinden bin klasörü gösterilir. )
o
i.c
dil
va
9 Konsoldan Jacorb ‘un bulunduğu dizine gidilir ve burada iki ant komutu çalıştırılır:
o ant jaco
o ant idlcmd
ja
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.
w.
ww
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 10
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği
o m
i.c
9
dil
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.
9 Uygulamamız çalışmaya hazır hale gelmiştir. Gerekli idl kütüğü artık yazılabilir.
ww
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 11
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği
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.
m
Uygulamadaki adımları daha iyi anlamak açısından CORBA yapısını tekrar gözden geçirmekte fayda
vardır.
o
i.c
1- İstemci, Hello Server’ın sayHello metodunu çağırır.
dil
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.
Hello World için yazılması gereken IDL oldukça basittir. Bunun için aşağıda belirtilen üç adımları
uygulamak yeterlidir.
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.
ww
};
• Arayüzü tanımlamak
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 12
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği
module HelloApp {
interface Hello // Bu
m
{ // dört
// satırı
}; // ekleyin.
}
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
i.c
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.
module HelloApp {
dil
interface Hello
{
string sayHello(); // Bu satırı ekleyin.
};
};
Çünkü bizim küçük Hello World uygulamamız sadece bir tane işlem içerir. Hello.idl şimdi son halini
va
almıştır.
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.
ja
w.
ww
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. 13
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği
package HelloApp;
m
/**
* Generated from IDL interface "Hello"
* @author JacORB IDL compiler V 2.2.3, 10-Dec-2005
*/
o
extends HelloOperations, org.omg.CORBA.Object,
org.omg.CORBA.portable.IDLEntity
{
}
i.c
• İstemci Uygulamayı Geliştirmek
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.
dil
*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:
package implementation;
import HelloApp.*; // stub altyapısını saglamak için.
import org.omg.CosNaming.*; // HelloClient isimlendirme servisini kullanır
va
import org.omg.CORBA.*; // Bütün CORBA uygulamaları buna ihtiyaç duyar
Her Java uygulaması main metoduna ihtiyaç duyar. Main metodunu HelloClient.java sınıfının etkinlik alanı
ja
Bütün CORBA uygulamalarının çalışma anında CORBA sistem hatasını fırlatabileceğini göz önüne alarak,
ww
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. 14
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği
try {
// HelloClient kodu buraya yazılacaktır.
m
} catch(Exception e) {
System.out.println("ERROR : " + e);
e.printStackTrace(System.out);
}
o
*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.
i.c
HelloClient sınıfının içinde, try-catch bloğunun içine bir ORB değişkeni tanımlayalım.
dil
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.
poa.the_POAManager().activate();
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
w.
NamingContextExt nc = NamingContextExtHelper.narrow(orb
.resolve_initial_references("NameService"));
Hello sunucusunu bulabilmek için öncelikle Hello sunucusunun kimliğini tanımlayan, bir
ww
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 15
fatihg@cs.hacettepe.edu.tr
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.
Son olarak, Hello sunucusuna bir referans almak için ve bunu Hello nesnesine vermek için, isim servisin
m
resolve metoduna gerekli yol paramatre olarak geçilir.
o
• sayHello() işlemini çağırmak
i.c
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.
System.out.println(Hello);
dil
Son olarak da sonuç ekrana bastırılır.
va
9 Kütük kaydedilir ve kapatılır (HelloClient.java)
Projemize HelloServer.java isminde bir kütük yaratın. Sonra aşağıdaki paketleri ekleyin.
ja
package implementation;
import HelloApp.*;
// HelloServer isimlendirme servisini kullanacak.
w.
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextPackage.*;
// Bütün CORBA uygulamalı bu paketi kullanır.
import org.omg.CORBA.*;
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 16
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği
m
Main içine aşağıdaki try-catch bloğunu ekleyin.
try {
// HelloServer kodları buraya eklenecektir
o
} catch(Exception e) {
System.err.println("ERROR: " + e);
e.printStackTrace(System.out);
}
i.c
*ORB nesnesini yaratmak
İstemci gibi sunucu uygulama da yerel bir ORB nesnesine ihtiyaç duyar.
dil
PoaManager’i aktif hale getirmek için aşağıdaki kod bloğunu ekleyin.
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.
ja
o Sınıfı tanımlayın.
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.
m
public String sayHello() {
//metot tanımını burada olusturun
}
o
o sayHello tanımını olusturun.
i.c
• COS isimlendirme servisi ile çalışmak
NamingContextExt nc = NamingContextExtHelper.narrow(orb
.resolve_initial_references("NameService"));
dil
NameComponent[] hello = new NameComponent[1];
hello[0] = new NameComponent("Hello", "server");
va
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.
nc.rebind(hello, helloObject);
ja
Sunucumuz hazır. Tek ihtiyacı olan çevrede ihtiyacı olan istemcilerden istem beklemektir. Bunun için try-
catch bloğunun sonuna aşağıdaki kod kesimi eklenir.
w.
Uygulamamızı Çalıştırmak
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 18
fatihg@cs.hacettepe.edu.tr
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.
m
tnameserv -ORBInitialPort 1050
o
• İstemciyi -ORBInitialPort 1050 parametresiyle çalıştırın. Eclipse’te Run özelliklerine gidilerek
parametre yazılabilir.
i.c
Hello world!!
dil
unutmayın.
1) Hello.idl
module HelloApp
va
{
interface Hello
{
string sayHello();
};
};
ja
w.
2) HelloClient.java
ww
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 19
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği
package implementation;
m
import org.omg.CosNaming.NameComponent;
import org.omg.CosNaming.NamingContextExt;
import org.omg.CosNaming.NamingContextExtHelper;
import HelloApp.HelloHelper;
import HelloApp.Hello;
o
public class HelloClient {
i.c
try{
Hello hello;
org.omg.PortableServer.POA poa =
org.omg.PortableServer.POAHelper
dil
.narrow(orb.resolve_initial_references("RootPOA"));
poa.the_POAManager().activate();
NamingContextExt nc = NamingContextExtHelper.narrow(orb
.resolve_initial_references("NameService"));
hello = HelloHelper.narrow(nc.resolve(helloName));
e.printStackTrace();
}
}
}
w.
ww
3) HelloServer.java
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 20
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği
package implementation;
import org.omg.CosNaming.*;
m
import org.omg.CORBA.*;
//import org.omg.CosNaming.NamingContextPackage.*;
o
try{
// Create and initialize the ORB
ORB orb = ORB.init(args, null);
i.c
org.omg.PortableServer.POA poa = org.omg.PortableServer.POAHelper
.narrow(orb.resolve_initial_references("RootPOA"));
poa.the_POAManager().activate();
NamingContextExt nc = NamingContextExtHelper.narrow(orb
dil
.resolve_initial_references("NameService"));
nc.rebind(hello, helloObject);
orb.run();
} catch(Exception e) {
System.err.println("ERROR: " + e);
ja
e.printStackTrace(System.out);
}
}
}
w.
9 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.
m
module Bank{
interface Account{
o
attribute long accountId;
attribute long accountLimit;
};
i.c
interface Customer{
attribute string customerName;
attribute long customerId;
dil
};
interface BankSystem{
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.
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.
ww
AccountImplementation.java:
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 22
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği
package implementation;
m
import Bank.AccountPOA;
o
public AccountImplementation(int accountId, int accountLimit){
accountId(accountId);
accountLimit(accountLimit);
i.c
}
dil
}
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 23
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği
BankSystemImplementation.java:
package implementation;
m
import java.util.ArrayList;
import org.omg.CORBA.ORB;
import Bank.Account;
o
import Bank.BankSystemPOA;
import Bank.Customer;
i.c
private ORB orb;
ArrayList<CustomerImplementation> customerArray;
ArrayList<AccountImplementation> accountArray;
dil
accountArray = new ArrayList<AccountImplementation>();
}
for(int i=0;i<accountArray.size();++i)
System.out.println(accountArray.get(i).accountId());
w.
return isDeleted;
}
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 24
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği
m
for(int i=0;i<customerArray.size();++i)
System.out.println(customerArray.get(i).customerName());
o
customerArray.remove(i);
isDeleted = true;
}
}
i.c
System.out.println("after deleting customer");
for(int i=0;i<customerArray.size();++i)
System.out.println(customerArray.get(i).customerName());
return isDeleted;
}
}
dil
ja va
w.
ww
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 25
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği
CustomerImplementation.java:
package implementation;
m
import Bank.Account;
import Bank.CustomerPOA;
import java.util.ArrayList;
o
private int customerId;
private String customerName;
i.c
private ArrayList<Account> customerAccounts = new ArrayList<Account>();
dil
return this.customerId;
}
return this.customerAccounts.toArray(new
Account[customerAccounts.size()]);
}
customerAccounts.add(account);
return true;
}
}
ww
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 26
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği
Server.java
m
package implementation;
import org.omg.CosNaming.*;
o
public static void main(String args[]){
org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null);
try{
System.out.println("Server calisti");
i.c
org.omg.PortableServer.POA poa =
org.omg.PortableServer.POAHelper.narrow(orb.resolve_initial_references("RootPOA
"));
poa.the_POAManager().activate();
dil
org.omg.CORBA.Object bankSystemObject =
poa.servant_to_reference(new BankSystemImplementation(orb));
NamingContextExt nc =
NamingContextExtHelper.narrow(orb.resolve_initial_references("NameService"));
nc.rebind(bankSystemName, bankSystemObject);
}
catch(Exception e){
ja
e.printStackTrace();
}
orb.run();
}
}
w.
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.
ww
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 27
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği
Client.java
package implementation;
m
import org.omg.CosNaming.NameComponent;
import org.omg.CosNaming.NamingContextExt;
import org.omg.CosNaming.NamingContextExtHelper;
import Bank.Account;
import Bank.BankSystem;
o
import Bank.BankSystemHelper;
import Bank.Customer;
i.c
public static void main(String args[]){
try{
System.out.println("Client calisti");
BankSystem bankSystem;
"server");
NamingContextExt nc =
dil
NamingContextExtHelper.narrow(orb.resolve_initial_references("NameService"));
customer.openCustomerAccount(account);
Account[] accountList =
customer.getCustomerAccounts(987654321);
for(int i=0; i<accountList.length; ++i)
System.out.println("account ID: " +
w.
accountList[i].accountId());
}
catch(Exception e){
e.printStackTrace();
}
}
}
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 28
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği
Uygulamamızın Çalıştırılması:
m
9 Komut satırını açın ve Java IDL isim servisini başlatın.
o tnameserv –ORBInitialPort 1050
o
i.c
9 Sunucu’yu -ORBInitialPort 1050 parametresiyle çalıştırın. Eclipse’te Run özelliklerine gidilerek
parametre yazılabilir.
Server calisti
Yusuf Kartal
dil
Program aşağıdaki gibi çıktı üretecektir:
va
Dogukan Dogan
after deleting customer
Yusuf Kartal
123456
111156
after deleting account
ja
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
w.
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
ww
http://www.corba.org/
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 29
fatihg@cs.hacettepe.edu.tr