串連Corba和dotNet

來源:互聯網
上載者:User
Corba, 公用對象請求代理程式結構(Common Object Request Broker Architecture)的首字母縮寫,在跨平台和跨語言(如J2EE)的分布式(多層)系統通訊中具有廣泛的應用,將CORBA串連到dotNET(在多層應用中,ASP.NET Web services and .NET Remoting 是其主要應用方式)是不容易的。要串連這兩者,就需要一個能將dotNet的object描述成Corba的object,以至於J2EE能使它們互動的方法,同樣,也能將Corba的object描述成dotNet的object,讓dotNet的code能認識。換句話說,需要一些中間代碼能翻譯Corba和dotNet FrameWork之間的這些對象和方法調用。Borland的Janeva可以做到這一點。它簡化了Corba或J2EE和dotNet之間的處理過程。

Getting Started
在開始之前,你需要有一個Corba Server,儘管有很多讀者都有而且在運行,但是還有很多沒有,所以,本文第一步就示範如何用C++建立一個簡單的Corba Server以練習和測試。要說明的是Corba Server同樣可以用Java,Delphi 以及其它語言編寫。第二步示範如何利用Janeva串連這個Server。

本例中的Server是用Borland C++Builder 6 Enterprise.建立的。如果沒有Borland C++Builder,你可以下載編譯過的Server,這個Server是基於一個個人議事議程的系統,用來安排電子會議。這個議程編排的細節對於本文來說不是很重要。重要的是如何你用Janeva串連Servere和Client。

Build a CORBA Server
To build the CORBA server, start C++Builder, click the File | New menu, select Other and go to the Multitier tab of the Object Repository (see Figure 1).




Figure 1. C++Builder Object Repository: The Object Repository contains a list of the items available



Figure 2. CORBA Server Wizard: You use this wizard to specify project options for a new CORBA server project.

A number of icons appear in the dialog related to CORBA. To start a new CORBA server project from scratch, double-click on the CORBA Server icon, which will display the CORBA Server Wizard so you can specify the options for the new project (see Figure 2).

You can choose to create a Console Application (with or without using Borland's Visual Component Library) or a Windows Application. For this project, select the Windows Application option, because it's convenient to have the server display some visual (debug) information during development.

一個Corba服務能包含一個或多個Corba對象,這些Corba對象的介面聲明通常都儲存在IDL檔案中,當建立一個Corba服務時,可以選擇一個存在的IDL 檔案或者建立一個空IDL檔案,然後加入Corba對象的定義,本例中的IDL如下:

module DiarySrv

{

struct DateTime {

long Date; // example: 20030929

long Time; // example: 1200

};



interface ICorbaDiaryServer

{

exception MeetingImpossible

{

string Reason;

};



void Meeting(in wstring Names, in DateTime DayTime, in long Duration)

raises (MeetingImpossible);

};

};



當點擊Corba Server的嚮導OK按鈕後,C++Builder會建立一個新的工程,將Form儲存為.MainForm.cpp,工程檔案儲存為BCB6CorbaServer.bpr。在IDE中將DiarySrv.idl加入工程。當你編譯這個工程,C++Builder會運行idl2cpp工具,產生4個基於IDL定義的檔案,即DiarySrv_c.cpp and DiarySrv_c.hh (for the stub classes,用戶端使用) , DiarySrv_s.cpp and DiarySrv_s.hh (for the skeleton classes服務端使用)。




Figure 3. CORBA Object Implementation Wizard: You use this Wizard to specify the IDL file, select interface names, the delegation model, and other properties.

CORBA Object Implementation
分開skeleton和stub,要有一個能實際啟動並執行DiarySrv Corba對象。可以使用嚮導。(see Figure 1 for the icon in the Object Repository). Click File | NewOther, go to the Multitier tab, and double-click on the CORBA Object Implementation icon, which will display the dialog shown in Figure 3。

對於每一個IDL檔案,可以選擇所有介面,根據你選擇的是delegation model、data module並且是否需要在WinMain中建立一個對象樣本,嚮導會建議你輸入單元名、類名等。

點擊OK,IDE會產生兩個檔案ICorbaDiaryServer.cpp,ICorbaDiaryServer.h。這就是寫實際啟動並執行Corba Server對象實現的地方。部分代碼:

#pragma hdrstop



#include <corba.h>

#include "ICorbaDiaryServerServer.h"



#include "MainForm.h"



//----------------------------------------------------



#pragma package(smart_init)





ICorbaDiaryServerImpl::ICorbaDiaryServerImpl(

const char *object_name):

_sk_DiarySrv::_sk_ICorbaDiaryServer(object_name)

{

if (Form1)

Form1->Caption =

"ICorbaDiaryServer up and running...";

}



void ICorbaDiaryServerImpl::Meeting(

const CORBA::WChar* _Names,

const DiarySrv::DateTime& _DayTime, CORBA::Long

_Duration)

{

if (Form1)

Form1->Memo1->Lines->Add(

"Meeting with " + AnsiString(_Names));

if (_Duration > 60)

throw

DiarySrv::ICorbaDiaryServer::MeetingImpossible(

"I don't like long meetings...");

}



Figure 4 shows the running application.




Figure 4. The Running CORBA Server: Here's a screenshot of the completed CORBA server.

注意檢查會議時間的代碼,如果會議期間超過一個小時,會拋出一個錯誤資訊:"I don't like long meetings.",很顯然,這個異常純粹是示範Corba異常,以及C#用戶端接受並回應這個錯誤。

在運行Corba Server之前,要保證VisiBroker在運行狀態。



Build a CORBA Client
我已經用C#builder建立了一個dotNet Corba的用戶端,但理論上來說,任何dotNet語言都是可以的。Start C#Builder Enterprise or Architect, and create a new C# application. In the New Application dialog you can specify the name as well as the location of the new project (see Figure 5).





Borland Janeva 1.0
Borland Janeva 可以讓Microsoft .NET Framework 應用和J2EE/CORBA server 對象無縫結合并高效整合。C#Builder的企業版和架構版都帶有Janeva,你也可以到Borland網站上下載(和其它dotNet 開發環境結合,詳細資料參見本文結尾)。




Figure 6. Add CORBA Reference: Janeva adds two items to the Add References menu, letting you select J2EE or CORBA references as well as standard file or Web references.

在免費註冊後,你可以得到一個用來測試的licence。但是,如果你要分發.Net用戶端,則需要購買分發licence。

安裝完Janeva,你就可以右擊C#builder中的工程檔案,增加一個J2EE或Corba引用(見圖6),沒有Janeva,你只能增加普通介面或Web reference。

因為本例是Corba server,選擇增加Corba引用,將會顯示一個對話方塊,可以選擇Corba服務定義的IDL檔案。如圖7。

Corba Server應用發布“介面”定義是通過IDL檔案,支援Corba用戶端應用的開發環境通常都支援將IDL轉化為電腦語言,如C++、java,然而對於dotNet用戶端,必須要將IDL轉化為dotNet語言,如VB.NET 或c#,IDL-to-C#(IDL2CS)是Borland Janeva最受歡迎的特徵。





Figure 7. Adding a CORBA Reference: Browse to the location of the DiarySrv.idl file to add the reference.

注意,儘管你匯入了Corba Server的定義,但是你還沒有指明如何串連它。

添加了IDL檔案後,Janeva匯入並編譯IDL檔案,產生一個相應的CS檔案(DiarySvr.cs)。




"Figure 8. Manual Janeva Compile: If you need to alter an IDL file after adding it, right-click the file in Project Manager and select Janeva Compile from the context menu.

如果將來你要改變IDL檔案,可以在工程管理器中右擊IDL檔案(如圖8)選擇重新編譯。

要使用DiarySrv.cs,在using中增加Corba命名空間和產生的DiarySrv命名空間。

using System;

using System.Drawing;

using System.Collections;

using System.ComponentModel;

using System.Windows.Forms;

using System.Data;



using CORBA;

using DiarySrv;



在WinForm的建構函式中,建立ORB(對象請求代理)的執行個體,來串連用戶端和服務端。要做到這樣,利用vbroker代理連接埠和14000參數(visibroker預設連接埠-譯者注)調用CORBA.ORB.Init即可。

我使用的是預設的14000連接埠,你可以使用另外的連接埠,連接埠的配置相信資訊請參見Corba ORB的文檔。

string[] args = new string[]

{"-vbroker.agent.port", "14000"};

orb = CORBA.ORB.Init(args);

Calling the CORBA Server
配置完用戶端程式後,可以利用一個按鈕來建立Corba DiarySrv對象的執行個體。然後調用Meeting方法。

private void button1_Click(object sender,

System.EventArgs e)

{

try

{

MyCorbaDiaryServer =

ICorbaDiaryServerHelper.Bind(

"ICorbaDiaryServerObject");



DiarySrv.DateTime MyDateTime = new

DiarySrv.DateTime();

MyDateTime.Date =

Convert.ToInt32(textBox2.Text);

MyDateTime.Time =

Convert.ToInt32(textBox3.Text);

MyCorbaDiaryServer.Meeting(textBox1.Text,

MyDateTime, Convert.ToInt32(textBox4.Text));

}

catch

(DiarySrv.ICorbaDiaryServerNS.MeetingImpossible

ex)

{

MessageBox.Show(ex.Reason, "CORBA Exception");

}

catch (Exception ex)

{

MessageBox.Show(ex.Message, "Error");

}

}

對照代碼,可以發現:

首先,必須通過正確的名字(在Corba服務端建立Corba Diary 服務物件時指定的,本例中為ICorbaDiaryServerObject)調用Binder 方法。

綁定完Corba伺服器端對象後,才能調用Meeting方法。但是不要沒有檢索Date和Time,並構造特殊的DiarySrv.DateTime(IDL檔案和Corba服務端實現的類型) 對象。




Figure 9. C#Builder CORBA Client: The figure shows the main window for the completed CORBA client running.

代碼還包含了4個Label和TextBox控制項,用來讓終端使用者輸入Meeting方法需要的名稱,日期,時間,期間等資訊。在運行階段,應用程式效果如圖9

注意,期間設定為61分鐘,僅僅是讓Corba用戶端拋出異常(如圖10)。




Figure 10. CORBA Exception: A MessageBox display of an exception received by the C#Builder CORBA client.

只有將時間限制在60分鐘內。就可以安全的增加會議安排到議事議程中。

你在這裡所看到的就是Janeva作為所謂的在Corba server和dotNetClient間的公司專屬應用程式 整合(EAI)層。這項技術的主要優點就是你可以不需重寫或修改已經存在的Corba服務就可以串連dotNet應用。



―――――――――――――――――――――――――――――――――――

第一次翻譯,請指正。



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。