Tutorial :Creating a MBR Remotable Object With SingleCall and Singleton Activation Mode on TCP Channel

Seperti yang telah saya jelaskan di artikel sebelumnya tentang pengenalan .net remoting, bahwa antar application domain yang berbeda bisa saling berinteraksi untuk  menggunakan member dari object tsb. Pada artikel kali ini saya akan membuat contoh sederhana yang menjelaskan bagaimana caranya kita membuat sebuah object yang bisa di remote dengan mode aktivasi berupa Singleton dan SingleCall pada TCP channel.

Langkah pertama yang dilakukan yaitu membuat sebuah class. Agar class tersebut dapat di remote maka kalau kita akan membuat object yang sifatnya Marshall By Reference (MBR) class tersebut harus inherits dari class MarshallByRefObject. Misalkan saya buat sebuah class dimana didalam class tersebut terdapat sebuah function yang return valuenya berupa data table yang akan menampilkan data dari database Northwind sesuai dengan query yang diinput oleh user nantinya lewat aplikasi client yang dibuat. Ok...buat Class Library project, code classnya spt ini :

Imports System.Data.SqlClient

Public Class GetData
Inherits MarshalByRefObject

Private sqlConn As SqlConnection

Public Sub New()
sqlConn = New SqlConnection(My.Settings.NorthwindConnString)
Console.WriteLine("Created a new connection to the Northwind database.")
End Sub

Public Function GetDataTable(ByVal Query As String) As DataTable
Console.WriteLine("Starting to execute the query...")

Using sqlCmd As New SqlCommand(Query, sqlConn)
sqlCmd.CommandType = CommandType.Text
sqlConn.Open()
Dim sqlDr As SqlDataReader = sqlCmd.ExecuteReader
Dim dtTable As New DataTable
dtTable.Load(sqlDr)
sqlConn.Close()
sqlDr.Close()

Console.WriteLine("Executing query was done.")

Return dtTable
End Using

End Function
End Class

Perhatikan code yang dicetak tebal...langkah selanjutnya yaitu membuat host remotingnya, host remoting yang akan saya gunakan disini yaitu console application, tentunya kita bisa buat windows service atau IIS sebagai agent hostnya. Next, buat Console application, write code like below :

Imports MBRObject
Imports System.Runtime.Remoting
Imports System.Runtime.Remoting.Channels
Imports System.Runtime.Remoting.Channels.Tcp

Module SingleCallActivation

Sub Main()
Dim tcpChannel As New TcpServerChannel(555)
ChannelServices.RegisterChannel(tcpChannel, True)

RemotingConfiguration.RegisterWellKnownServiceType( _
GetType(MBRObject.GetData), "MBRObject", WellKnownObjectMode.SingleCall)

Console.WriteLine("Starting Console Remoting Host...")
Console.WriteLine("Press any key to stop the remoting server")
Console.ReadLine()
End Sub

End Module

Namespace MBRObject yang di imports merupakan Root Namespace dari class library project yang dibuat di step pertama (tentunya harus di add reference dulu). Anda harus menambahkan reference  ke namespace System.Runtime.Remoting, setelah itu baru anda bisa imports namespace Remoting, dan Channels yang digunakan untuk meregister object yang di remote ke channel TCP lewat port number tertentu (disini contohnya saya menggunakan port 555).

Untuk meregister channel yang digunakan yaitu lewat shared method ChannelServices. Sedangkan untuk meregister object yang remotable digunakan shared sub berupa RegisterWellKnownService dengan passing input parameter berupa namespace dari object yang akan di register, uri object, dan tipe activation modenya yaitu SingleCall.

Langkah selanjutnya untuk test remote object yang telah dibuat sekarang kita buat aplikasi clientnya. Aplikasi client ini berupa windows application dengan control control textbox untuk input query, datagridview, dan button. Code nya spt ini :

Imports MBRObject
Imports System.Data.SqlClient
Imports System.Runtime.Remoting
Imports System.Runtime.Remoting.Channels
Imports System.Runtime.Remoting.Channels.Tcp

Public Class Form1

Dim objMBRObject As GetData

Private Sub Form1_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.Load
Dim tcpClient As New TcpClientChannel
ChannelServices.RegisterChannel(tcpClient, True)

RemotingConfiguration.RegisterWellKnownClientType( _
GetType(MBRObject.GetData), "tcp://localhost:555/MBRObject")

objMBRObject = New GetData
End Sub

Private Sub btnGetData_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnGetData.Click
Try
Dim dtData As DataTable = objMBRObject.GetDataTable(txtQuery.Text)
DataGridView1.DataSource = dtData
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
End Class

Di sisi client class yang digunakan untuk akses object yang akan di remote via tcp channel yaitu TcpClientChannel. Lewat RegisterWellKnownClientType shared sub didefinisikan namespace object yang diremote dan uri dari tcp channelnya beserta port number dan uri object yang sudah di set di remote host sebelumya. Ok...untuk melakukan testing nya jalankan multiple startup project yang dapat di konfigurasikan via Configuration Manager menu dari menu Build. Urutan pertama yang di run yaitu remote host, yang kedua yaitu aplikasi clientnya itu sendiri, here's the screen capture :

Query dijalankan lewat aplikasi client yang dibuat :

Proses di remoting host :

Execute another query :

Proses di remoting host :

Dari proses yang terjadi di remoting host dapat kita lihat bahwa setiap kali client akses object yang di remote maka saat itu juga object diinstatiate kemudian di destroy, begitu juga dengan another request. Disinilah ciri dari SingleCall activation mode, remoting host menangani satu request untuk masing-masing client. Sekarang code untuk activation mode nya kita rubah ke Singleton :

Sub Main()
Dim tcpChannel As New TcpServerChannel(555)
ChannelServices.RegisterChannel(tcpChannel, True)

RemotingConfiguration.RegisterWellKnownServiceType( _
GetType(MBRObject.GetData), "MBRObject", WellKnownObjectMode.Singleton)

Action query di client :

Proses di remote host :

Another Action query di client :

Proses di remote host :

Dengan activation mode Singleton maka remote server hanya menangani satu instance object untuk semua client yang request object yang sama. Dari proses yang terjadi di remote host dapat dilihat instantiate object nya hanya sekali saja, berbeda dengan Singlecall mode.

Share this post: | | | |
Published Monday, May 14, 2007 1:38 AM by yulian
Filed under:

Comments

No Comments
Powered by Community Server (Commercial Edition), by Telligent Systems