Professional Documents
Culture Documents
1CORBA
1CORBA
Bilgisayar
Mühendisliği Bölümü
CORBA
(Common Object Request Broker
Architecture)
Hacettepe Üniversitesi Bilgisayar Mühendisliği
2006, Ankara
HAZIRLAYANLAR
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
İçindekiler
İçindekiler.........................................................................................................................................3
1-OMG..............................................................................................................................................4
2-CORBA Mimarisi..........................................................................................................................4
2.1 IDL......................................................................................................................................5
2.2 OMA...................................................................................................................................5
3-ORB...............................................................................................................................................6
4-Dağıtık nesnelerde standart olarak CORBA.................................................................................7
4.1 IIOP....................................................................................................................................7
4.2 Java RMI.............................................................................................................................8
5-CORBA Servisleri.........................................................................................................................9
6-CORBA Ürünleri.........................................................................................................................10
7-CORBA ile Örnekler...................................................................................................................10
7.1 Gereksinimler ve Kurulumlar...........................................................................................10
7.2 Hello World Uygulaması..................................................................................................12
7.3 Banka Uygulaması............................................................................................................22
8-Kaynaklar....................................................................................................................................31
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
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
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
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.
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.
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.
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.
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
İ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
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.
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.
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.
İş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.
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
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
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.
3- ORB
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
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.
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.
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.
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
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. 7
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
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.
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.
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.
Ç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. 8
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği
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
artmaktadır.
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. 9
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği
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.
ORB Açıklama
Gerekli Kurulumlar:
Eclipse’in plugin klasörüne ORBStudio_7.7.5.jar eklentisi kopyalanır.
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
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)
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. )
Konsoldan Jacorb ‘un bulunduğu dizine gidilir ve burada iki ant komutu çalıştırılır:
o ant jaco
o ant idlcmd
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. 11
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği
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.
Uygulamamız çalışmaya hazır hale gelmiştir. Gerekli idl kütüğü artık yazılabilir.
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
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.
Uygulamadaki adımları daha iyi anlamak açısından CORBA yapısını tekrar gözden geçirmekte fayda
vardır.
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 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.
};
• Arayüzü tanımlamak
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
module HelloApp {
interface Hello // Bu
{ // dört
// satırı
}; // ekleyin.
}
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.
module HelloApp {
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
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.
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. 14
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği
package HelloApp;
/**
* Generated from IDL interface "Hello"
* @author JacORB IDL compiler V 2.2.3, 10-Dec-2005
*/
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.
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
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.
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. 15
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği
try {
// HelloClient kodu buraya yazılacaktır.
} catch(Exception e) {
System.out.println("ERROR : " + e);
e.printStackTrace(System.out);
}
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.
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
zaman, ORB bir naming context döndürür.
NamingContextExt nc = NamingContextExtHelper.narrow(orb
.resolve_initial_references("NameService"));
Hello sunucusunu bulabilmek için öncelikle Hello sunucusunun kimliğini tanımlayan, bir
NameComponent’a ihtiyaç vardır.
Hello nesnesine olan yol sadece bir element içerdiği için, nc üstünden tek elemanlı bir dizi oluşturulur.
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
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.
System.out.println(Hello);
Projemize HelloServer.java isminde bir kütük yaratın. Sonra aşağıdaki paketleri ekleyin.
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.*;
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 17
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği
try {
// HelloServer kodları buraya eklenecektir
} catch(Exception e) {
System.err.println("ERROR: " + e);
e.printStackTrace(System.out);
}
İstemci gibi sunucu uygulama da yerel bir ORB nesnesine ihtiyaç duyar.
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.
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.
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
NamingContextExt nc = NamingContextExtHelper.narrow(orb
.resolve_initial_references("NameService"));
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);
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.
Uygulamamızı Ç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.
Uygulamayı Çalıştırmak:
• Windows için komut satırını açın ve Java IDL isim servisini başlatın.
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
Hello world!!
1) Hello.idl
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. 20
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği
package implementation;
import org.omg.CosNaming.NameComponent;
import org.omg.CosNaming.NamingContextExt;
import org.omg.CosNaming.NamingContextExtHelper;
import HelloApp.HelloHelper;
import HelloApp.Hello;
Hello hello;
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"));
hello = HelloHelper.narrow(nc.resolve(helloName));
3) HelloServer.java
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 21
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği
package implementation;
import org.omg.CosNaming.*;
import org.omg.CORBA.*;
//import org.omg.CosNaming.NamingContextPackage.*;
NamingContextExt nc = NamingContextExtHelper.narrow(orb
.resolve_initial_references("NameService"));
nc.rebind(hello, helloObject);
orb.run();
} catch(Exception e) {
System.err.println("ERROR: " + e);
e.printStackTrace(System.out);
}
}
}
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{
interface Account{
attribute long accountId;
attribute long accountLimit;
};
interface Customer{
attribute string customerName;
attribute long customerId;
interface BankSystem{
AccountImplementation.java:
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
package implementation;
import Bank.AccountPOA;
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
BankSystemImplementation.java:
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
package implementation;
import java.util.ArrayList;
import org.omg.CORBA.ORB;
import Bank.Account;
import Bank.BankSystemPOA;
import Bank.Customer;
for(int i=0;i<accountArray.size();++i)
System.out.println(accountArray.get(i).accountId());
return isDeleted;
}
for(int
Belgeye i=0;i<customerArray.size();++i)
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
CustomerImplementation.java:
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
package implementation;
import Bank.Account;
import Bank.CustomerPOA;
import java.util.ArrayList;
Server.java
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
package implementation;
import org.omg.CosNaming.*;
System.out.println("Server calisti");
org.omg.PortableServer.POA poa =
org.omg.PortableServer.POAHelper.narrow(orb.resolve_initial_references("RootPOA
"));
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"));
nc.rebind(bankSystemName, bankSystemObject);
}
catch(Exception e){
e.printStackTrace();
}
orb.run();
}
}
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.
Client.java
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 29
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği
package implementation;
import org.omg.CosNaming.NameComponent;
import org.omg.CosNaming.NamingContextExt;
import org.omg.CosNaming.NamingContextExtHelper;
import Bank.Account;
import Bank.BankSystem;
import Bank.BankSystemHelper;
import Bank.Customer;
System.out.println("Client calisti");
BankSystem bankSystem;
NamingContextExt nc =
NamingContextExtHelper.narrow(orb.resolve_initial_references("NameService"));
bankSystem =
BankSystemHelper.narrow(nc.resolve(bankSystemName));
customer.openCustomerAccount(account);
Account[] accountList =
customer.getCustomerAccounts(987654321);
for(int i=0; i<accountList.length; ++i)
System.out.println("account ID: " +
accountList[i].accountId());
Belgeye ilişkin eleştiri ve önerilerinizi lütfen Ar. Gör. Fatih M. GÜLEÇ’e bildirin. 30
fatihg@cs.hacettepe.edu.tr
Hacettepe Üniversitesi Bilgisayar Mühendisliği
Uygulamamızın Çalıştırılması:
Komut satırını açın ve Java IDL isim servisini başlatın.
o tnameserv –ORBInitialPort 1050
Server calisti
Yusuf Kartal
Dogukan Dogan
after deleting customer
Yusuf Kartal
123456
111156
after deleting account
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. 31
fatihg@cs.hacettepe.edu.tr