Java RMI এর মাধ্যমে ক্লায়েন্ট এবং সার্ভারের মধ্যে যোগাযোগ করার সময় RMI Registry এবং Naming Service গুরুত্বপূর্ণ ভূমিকা পালন করে। এগুলো RMI অবজেক্টকে রেজিস্টার এবং খুঁজে পেতে সহায়তা করে।
RMI Registry কী?
RMI Registry একটি সার্ভার-সাইড রেজিস্ট্রি যা একটি নির্দিষ্ট পোর্টে চলে এবং রিমোট অবজেক্টগুলোর জন্য নাম-বেসড রেজিস্ট্রেশন সেবা প্রদান করে। এটি মূলত ক্লায়েন্ট এবং সার্ভারের মধ্যে একটি মধ্যস্থতাকারী হিসাবে কাজ করে।
কাজ:
- Remote Object রেজিস্ট্রেশন: সার্ভার তার Remote Object RMI Registry তে রেজিস্টার করে।
- Naming Lookup: ক্লায়েন্ট RMI Registry থেকে Remote Object এর রেফারেন্স খুঁজে পায়।
- RMI Registry ডিফল্টভাবে পোর্ট 1099-এ চলে।
Naming Service কী?
java.rmi.Naming ক্লাস একটি সহজ API প্রদান করে, যার মাধ্যমে Remote Object কে RMI Registry তে bind, rebind, এবং lookup করা যায়। এটি ক্লায়েন্ট এবং সার্ভার উভয় পক্ষেই ব্যবহৃত হয়।
RMI Registry এবং Naming Service ব্যবহার করার ধাপ
1. RMI Registry চালু করা
RMI Registry চালু করতে নিচের কমান্ড ব্যবহার করা হয়:
rmiregistry
এটি ডিফল্টভাবে 1099 পোর্টে চলে।
আপনি নির্দিষ্ট পোর্টে চালাতে চাইলে:
rmiregistry <port_number>
2. Naming Service দিয়ে Remote Object Bind করা
সার্ভারে Remote Object তৈরি করার পর এটি RMI Registry তে Naming.rebind() ব্যবহার করে bind করা হয়।
import java.rmi.Naming;
public class Server {
public static void main(String[] args) {
try {
// Remote Object তৈরি
CalculatorImpl calculator = new CalculatorImpl();
// Remote Object RMI Registry তে bind করা
Naming.rebind("rmi://localhost:1099/CalculatorService", calculator);
System.out.println("Calculator Service is ready.");
} catch (Exception e) {
e.printStackTrace();
}
}
}
3. Naming Service দিয়ে Remote Object Lookup করা
ক্লায়েন্ট তার প্রয়োজনীয় Remote Object এর রেফারেন্স Naming.lookup() ব্যবহার করে RMI Registry থেকে পায়।
import java.rmi.Naming;
public class Client {
public static void main(String[] args) {
try {
// RMI Registry থেকে Remote Object এর রেফারেন্স পাওয়া
Calculator calculator = (Calculator) Naming.lookup("rmi://localhost:1099/CalculatorService");
// Remote Method কল করা
System.out.println("Addition Result: " + calculator.add(10, 5));
} catch (Exception e) {
e.printStackTrace();
}
}
}
Naming Service এর গুরুত্বপূর্ণ মেথডগুলো
1. bind(String name, Remote obj)
Remote Object কে নির্দিষ্ট নাম দিয়ে RMI Registry তে bind করে।
Naming.bind("rmi://localhost:1099/MyService", myRemoteObject);
2. rebind(String name, Remote obj)
আগে থেকে থাকা কোনো Remote Object-এর নাম দিয়ে নতুন Remote Object bind করে।
Naming.rebind("rmi://localhost:1099/MyService", myRemoteObject);
3. lookup(String name)
RMI Registry থেকে নির্দিষ্ট নামের Remote Object এর রেফারেন্স খুঁজে বের করে।
Remote remoteObj = Naming.lookup("rmi://localhost:1099/MyService");
4. unbind(String name)
RMI Registry থেকে Remote Object এর রেজিস্ট্রেশন মুছে ফেলে।
Naming.unbind("rmi://localhost:1099/MyService");
উদাহরণ: RMI Registry এবং Naming Service
Server:
import java.rmi.Naming;
public class CalculatorServer {
public static void main(String[] args) {
try {
// Remote Object তৈরি
CalculatorImpl calculator = new CalculatorImpl();
// Naming Service দিয়ে RMI Registry তে bind
Naming.rebind("rmi://localhost:1099/CalculatorService", calculator);
System.out.println("Calculator Service is ready.");
} catch (Exception e) {
e.printStackTrace();
}
}
}
Client:
import java.rmi.Naming;
public class CalculatorClient {
public static void main(String[] args) {
try {
// RMI Registry থেকে Remote Object এর রেফারেন্স পাওয়া
Calculator calculator = (Calculator) Naming.lookup("rmi://localhost:1099/CalculatorService");
// Remote Method কল করা
System.out.println("Addition: " + calculator.add(20, 10));
System.out.println("Subtraction: " + calculator.subtract(30, 15));
} catch (Exception e) {
e.printStackTrace();
}
}
}
RMI Registry এবং Naming Service এর গুরুত্ব
- Distributed Application Management:
RMI Registry এবং Naming Service ক্লায়েন্ট-সার্ভার মডেলে রিমোট অবজেক্ট ম্যানেজমেন্ট সহজ করে। - Flexibility:
ক্লায়েন্ট এবং সার্ভার একে অপরের উপর নির্ভর না করেও আলাদা ভাবে কাজ করতে পারে। - Scalability:
Naming Service বড় এবং জটিল সিস্টেমের রিমোট অবজেক্ট ম্যানেজমেন্ট সহজ করে। - Decoupling:
ক্লায়েন্ট সরাসরি Remote Object এর ক্লাসের উপর নির্ভরশীল নয়। এটি শুধু নাম ব্যবহার করে কাজ করে।
RMI Registry এবং Naming Service হল RMI অ্যাপ্লিকেশনের একটি অপরিহার্য অংশ, যা Remote Object এর রেজিস্ট্রেশন এবং সন্ধানের কাজ সহজ করে। এগুলোর মাধ্যমে ক্লায়েন্ট এবং সার্ভার একটি ডিসট্রিবিউটেড পরিবেশে কার্যকরভাবে যোগাযোগ করতে পারে।
RMI Registry হল একটি বাইন্ডিং সার্ভিস যা রিমোট অবজেক্টগুলিকে একটি নির্দিষ্ট নামের সাথে নিবন্ধিত করে এবং ক্লায়েন্টদের সেই রিমোট অবজেক্ট খুঁজে পেতে সাহায্য করে। এটি মূলত একটি নাম-থেকে-অবজেক্ট ম্যাপিং সার্ভার, যা RMI Server এবং RMI Client-এর মধ্যে যোগাযোগ সহজতর করে।
RMI Registry এর কাজ
- রিমোট অবজেক্ট রেজিস্ট্রেশন:
RMI Registry-তে Server-side রিমোট অবজেক্ট bind করা হয়। এটি একটি নির্দিষ্ট নাম (যেমনCalculatorService) দিয়ে রিমোট অবজেক্ট নিবন্ধন করে। - ক্লায়েন্টের জন্য রিমোট অবজেক্ট সরবরাহ:
ক্লায়েন্ট lookup মেথড ব্যবহার করে নির্দিষ্ট নাম দিয়ে রেজিস্ট্রিতে নিবন্ধিত রিমোট অবজেক্টের রেফারেন্স পেতে পারে। - ক্লায়েন্ট-সার্ভার যোগাযোগ নিশ্চিত করা:
RMI Registry ক্লায়েন্ট এবং সার্ভারকে একে অপরের সাথে সংযোগ স্থাপন করতে সাহায্য করে। এটি Server-side Stub প্রদান করে, যা ক্লায়েন্ট তার RMI কলগুলির জন্য ব্যবহার করে। - ডিস্ট্রিবিউটেড অ্যাপ্লিকেশন সমর্থন করা:
RMI Registry ডিস্ট্রিবিউটেড সিস্টেমে অনেকগুলো রিমোট অবজেক্ট পরিচালনা করে এবং ক্লায়েন্ট-সার্ভার মিথস্ক্রিয়া সহজ করে তোলে।
RMI Registry ব্যবহারের ধাপ
1. RMI Registry তৈরি করা
RMI Registry তৈরি করতে LocateRegistry.createRegistry() মেথড ব্যবহার করা হয়।
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class Server {
public static void main(String[] args) {
try {
// রিমোট অবজেক্ট তৈরি
HelloImpl obj = new HelloImpl();
// RMI Registry তৈরি
Registry registry = LocateRegistry.createRegistry(1099);
// রিমোট অবজেক্ট bind করা
registry.bind("HelloService", obj);
System.out.println("RMI Server is running...");
} catch (Exception e) {
e.printStackTrace();
}
}
}
2. RMI Registry-তে রিমোট অবজেক্ট bind করা
RMI Registry-তে একটি নির্দিষ্ট নাম দিয়ে রিমোট অবজেক্ট নিবন্ধন করতে bind() বা rebind() মেথড ব্যবহার করা হয়।
bind(String name, Remote obj): প্রথমবার রিমোট অবজেক্ট নিবন্ধন করতে ব্যবহৃত হয়।rebind(String name, Remote obj): যদি একই নাম দিয়ে অবজেক্ট আগেই নিবন্ধিত থাকে, এটি সেটিকে ওভাররাইট করে।
3. RMI Registry-তে অবজেক্ট খুঁজে বের করা
ক্লায়েন্ট LocateRegistry.getRegistry() মেথড ব্যবহার করে RMI Registry-তে সংযুক্ত হয় এবং lookup() মেথড দিয়ে রিমোট অবজেক্ট পায়।
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class Client {
public static void main(String[] args) {
try {
// RMI Registry থেকে সংযোগ
Registry registry = LocateRegistry.getRegistry("localhost", 1099);
// রিমোট অবজেক্ট খুঁজে বের করা
Hello stub = (Hello) registry.lookup("HelloService");
// রিমোট মেথড কল করা
System.out.println(stub.sayHello());
} catch (Exception e) {
e.printStackTrace();
}
}
}
RMI Registry এর মূল মেথডগুলো
| মেথড | বিবরণ |
|---|---|
bind(String name, Remote obj) | রিমোট অবজেক্টকে নির্দিষ্ট নাম দিয়ে RMI Registry-তে নিবন্ধন করে। |
rebind(String name, Remote obj) | বিদ্যমান নামের উপর নতুন রিমোট অবজেক্ট bind করে। |
lookup(String name) | নির্দিষ্ট নাম দিয়ে রিমোট অবজেক্টের রেফারেন্স রিটার্ন করে। |
unbind(String name) | RMI Registry থেকে রিমোট অবজেক্টের নাম আনরেজিস্টার করে। |
list() | RMI Registry-তে নিবন্ধিত সমস্ত অবজেক্টের নামের তালিকা প্রদান করে। |
RMI Registry চালু করা
1. RMI Registry কমান্ড ব্যবহার করে চালানো
আপনার সিস্টেমে RMI Registry চালু করতে নিচের কমান্ডটি ব্যবহার করুন:
rmiregistry
ডিফল্ট পোর্ট 1099।
2. কাস্টম পোর্ট দিয়ে RMI Registry চালানো
rmiregistry 2020
3. Java কোড থেকে RMI Registry তৈরি করা
RMI Registry তৈরি করতে Java-এর LocateRegistry.createRegistry(port) মেথড ব্যবহার করা হয়। উদাহরণ:
Registry registry = LocateRegistry.createRegistry(1099);
RMI Registry এর সুবিধা
- সেন্ট্রালাইজড ম্যাপিং:
ক্লায়েন্ট এবং সার্ভারের মধ্যে যোগাযোগ সহজ করে। - ডাইনামিক নিবন্ধন:
নতুন রিমোট অবজেক্ট সহজেই যোগ করা বা পুরোনো অবজেক্ট পরিবর্তন করা যায়। - মাল্টি-ক্লায়েন্ট সাপোর্ট:
একই রিমোট অবজেক্টের জন্য একাধিক ক্লায়েন্ট অ্যাক্সেস প্রদান করা সম্ভব। - নাম-ভিত্তিক অনুসন্ধান:
রিমোট অবজেক্ট সহজে খুঁজে বের করা যায়।
RMI Registry হল RMI প্রযুক্তির একটি গুরুত্বপূর্ণ উপাদান, যা রিমোট অবজেক্টের অবস্থান নির্ধারণ এবং ক্লায়েন্ট-সার্ভার মিথস্ক্রিয়া সহজতর করে। এটি RMI-ভিত্তিক ডিস্ট্রিবিউটেড অ্যাপ্লিকেশনগুলোর জন্য একটি অপরিহার্য উপাদান।
Java RMI-তে java.rmi.Naming ক্লাসটি রিমোট অবজেক্টকে RMI Registry-তে নিবন্ধন বা পুনঃনিবন্ধন করার জন্য এবং ক্লায়েন্ট প্রোগ্রামের মাধ্যমে রিমোট অবজেক্ট অ্যাক্সেস করার জন্য ব্যবহৃত হয়। এই ক্লাসের তিনটি গুরুত্বপূর্ণ মেথড হলো bind(), rebind(), এবং lookup()।
1. Naming.bind() মেথড
উদ্দেশ্য:
- রিমোট অবজেক্টকে RMI Registry-তে নির্দিষ্ট নামে নিবন্ধন করতে ব্যবহৃত হয়।
- যদি একই নামে রিমোট অবজেক্ট ইতিমধ্যে রেজিস্ট্রি-তে থাকে, তবে এটি একটি
AlreadyBoundExceptionনিক্ষেপ করে।
পদ্ধতি:
Naming.bind(String name, Remote obj);
উদাহরণ:
Naming.bind("HelloService", remoteObject);
নোট:
bind()শুধুমাত্র নতুন রিমোট অবজেক্ট নিবন্ধনের জন্য ব্যবহার করুন। যদি নাম আগে থেকেই নিবন্ধিত থাকে, তাহলে এটি কাজ করবে না।
2. Naming.rebind() মেথড
উদ্দেশ্য:
- রিমোট অবজেক্টকে RMI Registry-তে নিবন্ধন করে বা যদি একই নামে রিমোট অবজেক্ট ইতিমধ্যে নিবন্ধিত থাকে, তবে এটি পুরোনো অবজেক্টকে প্রতিস্থাপন করে।
পদ্ধতি:
Naming.rebind(String name, Remote obj);
উদাহরণ:
Naming.rebind("HelloService", remoteObject);
নোট:
rebind()একই নামে পুরোনো অবজেক্ট থাকলেও সেটিকে প্রতিস্থাপন করে নতুন রিমোট অবজেক্ট নিবন্ধন করতে সক্ষম।
3. Naming.lookup() মেথড
উদ্দেশ্য:
- RMI Registry থেকে রিমোট অবজেক্ট খুঁজে বের করে এবং রিমোট রেফারেন্স রিটার্ন করে।
- এটি সাধারণত ক্লায়েন্ট প্রোগ্রামে ব্যবহার করা হয়।
পদ্ধতি:
Remote ref = Naming.lookup(String name);
উদাহরণ:
Hello stub = (Hello) Naming.lookup("rmi://localhost:1099/HelloService");
নোট:
- যদি নির্দিষ্ট নামের কোনো রিমোট অবজেক্ট রেজিস্ট্রি-তে পাওয়া না যায়, তাহলে এটি একটি
NotBoundExceptionনিক্ষেপ করে।
Naming মেথডের ব্যবহার: একটি উদাহরণ
Remote Interface:
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Hello extends Remote {
String sayHello() throws RemoteException;
}
Remote Object Implementation:
import java.rmi.server.UnicastRemoteObject;
import java.rmi.RemoteException;
public class HelloImpl extends UnicastRemoteObject implements Hello {
protected HelloImpl() throws RemoteException {
super();
}
@Override
public String sayHello() throws RemoteException {
return "Hello from RMI Server!";
}
}
RMI Server:
import java.rmi.Naming;
public class Server {
public static void main(String[] args) {
try {
// Remote Object তৈরি
HelloImpl remoteObject = new HelloImpl();
// RMI Registry-তে Remote Object নিবন্ধন
Naming.bind("HelloService", remoteObject); // প্রথমবার নিবন্ধন
// অথবা Rebinding ব্যবহার করুন
// Naming.rebind("HelloService", remoteObject);
System.out.println("RMI Server is running...");
} catch (Exception e) {
System.err.println("Server exception: " + e.toString());
e.printStackTrace();
}
}
}
RMI Client:
import java.rmi.Naming;
public class Client {
public static void main(String[] args) {
try {
// RMI Registry থেকে Remote Object খুঁজে বের করা
Hello stub = (Hello) Naming.lookup("rmi://localhost:1099/HelloService");
// Remote Method কল করা
String response = stub.sayHello();
System.out.println("Response from server: " + response);
} catch (Exception e) {
System.err.println("Client exception: " + e.toString());
e.printStackTrace();
}
}
}
Naming মেথডের তুলনা
| মেথড | ব্যবহার | ব্যতিক্রম |
|---|---|---|
bind() | নতুন রিমোট অবজেক্ট নিবন্ধন করতে ব্যবহৃত। | AlreadyBoundException |
rebind() | নতুন অবজেক্ট নিবন্ধন বা পুরোনো অবজেক্ট প্রতিস্থাপন করতে ব্যবহৃত। | N/A |
lookup() | রেজিস্ট্রি থেকে রিমোট অবজেক্ট খুঁজে বের করতে ব্যবহৃত। | NotBoundException |
Naming.bind(), rebind(), এবং lookup() RMI অ্যাপ্লিকেশনে রিমোট অবজেক্ট নিবন্ধন ও ব্যবস্থাপনার গুরুত্বপূর্ণ মেথড।
bind()শুধুমাত্র নতুন অবজেক্ট নিবন্ধনের জন্য ব্যবহৃত হয়।rebind()পুরোনো অবজেক্ট প্রতিস্থাপন করতে সক্ষম।lookup()রেজিস্ট্রি থেকে অবজেক্ট খুঁজে ক্লায়েন্টকে রিমোট রেফারেন্স প্রদান করে।
এই মেথডগুলো RMI অ্যাপ্লিকেশনের কার্যকারিতা ও স্থিতিশীলতা নিশ্চিত করে।
RMI Registry হলো একটি নামকরণ পরিষেবা যা রিমোট অবজেক্টগুলোর নাম এবং তাদের অবস্থানের মধ্যে একটি ম্যাপ সংরক্ষণ করে। RMI Registry ব্যবহার করে, ক্লায়েন্ট অ্যাপ্লিকেশন রিমোট অবজেক্টগুলোর সাথে সংযোগ স্থাপন করতে পারে। Binding এবং Unbinding হলো RMI Registry পরিচালনার দুটি গুরুত্বপূর্ণ প্রক্রিয়া।
RMI Registry-তে Object Binding এবং Unbinding
1. Binding:
RMI Registry তে একটি রিমোট অবজেক্টকে একটি নির্দিষ্ট নামের সাথে নিবন্ধিত করা হয়, যাতে ক্লায়েন্ট সেই নামটি ব্যবহার করে অবজেক্ট খুঁজে পায়।
2. Unbinding:
RMI Registry থেকে একটি নির্দিষ্ট রিমোট অবজেক্টের নিবন্ধন অপসারণ করা হয়।
গুরুত্বপূর্ণ মেথডসমূহ
java.rmi.registry.Registry ইন্টারফেসে নিম্নলিখিত মেথডগুলো ব্যবহার করা হয়:
bind(String name, Remote obj)- নির্দিষ্ট
nameএবংobjএর সাথে একটি রিমোট অবজেক্টকে Registry তে নিবন্ধিত করে। - যদি ঐ নামটি আগে থেকেই নিবন্ধিত থাকে, তাহলে
AlreadyBoundExceptionছুঁড়ে দেয়।
- নির্দিষ্ট
rebind(String name, Remote obj)- পূর্বে নিবন্ধিত নাম থাকলে তা ওভাররাইট করে নতুন রিমোট অবজেক্ট রেজিস্টার করে।
unbind(String name)- নির্দিষ্ট নামের রিমোট অবজেক্টের নিবন্ধন Registry থেকে মুছে ফেলে।
lookup(String name)- নির্দিষ্ট নাম ব্যবহার করে একটি রিমোট অবজেক্ট খুঁজে পায়।
উদাহরণ: RMI Registry তে Object Bind এবং Unbind করা
1. Remote Interface তৈরি করা
import java.rmi.Remote;
import java.rmi.RemoteException;
// Remote Interface
public interface Greeting extends Remote {
String sayHello(String name) throws RemoteException;
}
2. Remote Object Implementation তৈরি করা
import java.rmi.server.UnicastRemoteObject;
import java.rmi.RemoteException;
// Remote Object Implementation
public class GreetingImpl extends UnicastRemoteObject implements Greeting {
public GreetingImpl() throws RemoteException {
super();
}
@Override
public String sayHello(String name) throws RemoteException {
return "Hello, " + name + "!";
}
}
3. Server: Object Binding এবং Unbinding
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class Server {
public static void main(String[] args) {
try {
// Create Remote Object
GreetingImpl greeting = new GreetingImpl();
// Start RMI Registry on port 1099
Registry registry = LocateRegistry.createRegistry(1099);
// Bind Object to Registry
String objectName = "GreetingService";
registry.bind(objectName, greeting);
System.out.println("Object bound to RMI Registry with name: " + objectName);
// Optional: Rebind Object (overwrite the previous binding)
// registry.rebind(objectName, greeting);
// Wait for unbind demonstration
Thread.sleep(10000);
// Unbind Object from Registry
registry.unbind(objectName);
System.out.println("Object unbound from RMI Registry with name: " + objectName);
} catch (Exception e) {
e.printStackTrace();
}
}
}
4. Client: Object Lookup
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class Client {
public static void main(String[] args) {
try {
// Locate RMI Registry
Registry registry = LocateRegistry.getRegistry("localhost", 1099);
// Lookup Remote Object by name
Greeting greeting = (Greeting) registry.lookup("GreetingService");
// Call Remote Method
System.out.println(greeting.sayHello("John"));
} catch (Exception e) {
e.printStackTrace();
}
}
}
RMI Registry তে Binding এবং Unbinding-এর ধাপসমূহ
Binding:
registry.bind("ObjectName", remoteObject);- যদি একই নামের আরেকটি অবজেক্ট আগে থেকেই নিবন্ধিত থাকে, তাহলে
AlreadyBoundExceptionছুঁড়ে দেবে।
- যদি একই নামের আরেকটি অবজেক্ট আগে থেকেই নিবন্ধিত থাকে, তাহলে
Rebinding:
registry.rebind("ObjectName", remoteObject);- পূর্বের নিবন্ধিত অবজেক্ট ওভাররাইট করে নতুন অবজেক্ট নিবন্ধিত করে।
Unbinding:
registry.unbind("ObjectName");- Registry থেকে নির্দিষ্ট নামের অবজেক্টের নিবন্ধন মুছে ফেলে।
Lookup:
Remote remoteObject = registry.lookup("ObjectName");- Registry থেকে নির্দিষ্ট নামের অবজেক্ট রিটার্ন করে।
কোড কম্পাইল এবং চালানোর ধাপসমূহ
কম্পাইল করা:
javac *.javaRMI Registry চালু করা:
rmiregistry 1099Server চালানো:
java ServerClient চালানো:
java Client
RMI Registry-তে bind, rebind, এবং unbind মেথডগুলো ব্যবহার করে রিমোট অবজেক্ট নিবন্ধিত এবং অপসারণ করা হয়। এর মাধ্যমে ক্লায়েন্ট এবং সার্ভারের মধ্যে যোগাযোগ সহজ হয়। Binding নিশ্চিত করে যে ক্লায়েন্ট নির্দিষ্ট নাম ব্যবহার করে সঠিক রিমোট অবজেক্ট অ্যাক্সেস করতে পারে।
RMI Registry হল একটি সার্ভার-সাইড রেজিস্ট্রি যেখানে রিমোট অবজেক্টগুলি bind করা হয়, যাতে ক্লায়েন্ট অ্যাপ্লিকেশনগুলো সহজেই তাদের রেফারেন্স পেতে পারে। এটি RMI কমিউনিকেশনের একটি গুরুত্বপূর্ণ অংশ। RMI Registry সাধারণত port 1099-এ কাজ করে, তবে এটি কাস্টম পোর্টেও চালানো যেতে পারে।
RMI Registry ম্যানেজমেন্ট
RMI Registry শুরু করা
Java 5 এবং তারপরে: RMI Registry শুরু করার জন্য LocateRegistry.createRegistry(port) ব্যবহার করা হয়।
উদাহরণ:import java.rmi.registry.LocateRegistry; public class RMIRegistryExample { public static void main(String[] args) { try { LocateRegistry.createRegistry(1099); // Default port 1099 System.out.println("RMI Registry is running..."); } catch (Exception e) { e.printStackTrace(); } } }External Command Line Tool: RMI Registry শুরু করতে rmiregistry কমান্ড ব্যবহার করা যেতে পারে।
rmiregistry 1099- উপরের কমান্ডটি 1099 পোর্টে একটি RMI Registry শুরু করবে।
RMI Registry এ অবজেক্ট Bind করা
Naming.rebind বা Naming.bind ব্যবহার করে রিমোট অবজেক্ট রেজিস্ট্রি-তে নিবন্ধিত করা হয়।
import java.rmi.Naming;
public class Server {
public static void main(String[] args) {
try {
LocateRegistry.createRegistry(1099); // RMI Registry তৈরি করা
HelloImpl hello = new HelloImpl();
Naming.rebind("rmi://localhost:1099/HelloService", hello);
System.out.println("HelloService is bound to the RMI Registry.");
} catch (Exception e) {
e.printStackTrace();
}
}
}
RMI Registry থেকে অবজেক্ট Unbind করা
RMI Registry থেকে রিমোট অবজেক্ট সরানোর জন্য Naming.unbind() ব্যবহার করা হয়।
import java.rmi.Naming;
public class UnbindExample {
public static void main(String[] args) {
try {
Naming.unbind("rmi://localhost:1099/HelloService");
System.out.println("HelloService is unbound from the RMI Registry.");
} catch (Exception e) {
e.printStackTrace();
}
}
}
Naming Convention
RMI Registry-তে রেজিস্টার করা রিমোট অবজেক্টগুলোর জন্য নির্দিষ্ট Naming Convention অনুসরণ করা হয়। এর মাধ্যমে ক্লায়েন্ট সহজে রেজিস্ট্রি থেকে সঠিক রিমোট অবজেক্ট খুঁজে পায়।
Naming Structure
rmi://<host>:<port>/<service_name>
- rmi://:
- এটি RMI প্রটোকল নির্দেশ করে।
- :
- সার্ভারের হোস্ট নাম বা IP অ্যাড্রেস।
- উদাহরণ:
localhost,192.168.1.100।
- :
- RMI Registry এর পোর্ট নম্বর। ডিফল্ট পোর্ট 1099।
- <service_name>:
- রিমোট অবজেক্টের একটি ইউনিক নাম।
- উদাহরণ:
HelloService,CalculatorService।
উদাহরণ
Default Port ব্যবহার করে:
rmi://localhost/HelloServiceCustom Port ব্যবহার করে:
rmi://192.168.1.100:5000/CalculatorService
RMI Registry ব্যবহারের সময় সাধারণ ত্রুটি ও সমাধান
1. RMI Registry চলছে না
ত্রুটি:
java.rmi.NotBoundException- সমাধান:
নিশ্চিত করুন যে RMI Registry চলছে এবং সঠিক পোর্টে কানেক্ট করা হয়েছে।
2. Stub ক্লাস মিসিং
ত্রুটি:
java.rmi.UnmarshalException: error unmarshalling arguments- সমাধান:
- জাভার নতুন সংস্করণে ম্যানুয়ালি Stub জেনারেট করার প্রয়োজন নেই।
- Ensure correct implementation and deployment of remote object.
3. Network Connectivity সমস্যা
ত্রুটি:
java.rmi.ConnectException: Connection refused to host- সমাধান:
- নিশ্চিত করুন যে সার্ভার এবং ক্লায়েন্ট সঠিক নেটওয়ার্কে আছে।
- ফায়ারওয়াল বা নিরাপত্তা ব্যবস্থা চেক করুন।
RMI Registry এর গুরুত্বপূর্ণ টিপস
- Custom Ports ব্যবহার করুন:
- একাধিক RMI Registry চালাতে চাইলে আলাদা পোর্ট নম্বর ব্যবহার করুন।
Security Manager ব্যবহার করুন:
- RMI কমিউনিকেশন সুরক্ষিত করার জন্য SecurityManager যোগ করুন।
System.setSecurityManager(new SecurityManager());- Service Name যথাযথভাবে নামকরণ করুন:
- রিমোট অবজেক্টের জন্য ইউনিক এবং অর্থবহ নাম ব্যবহার করুন।
- Proper Cleanup:
- প্রোগ্রাম বন্ধ করার আগে unbind বা rebind নিশ্চিত করুন।
RMI Registry হল RMI ভিত্তিক ডিস্ট্রিবিউটেড অ্যাপ্লিকেশন তৈরি করার একটি গুরুত্বপূর্ণ উপাদান। Naming Convention এর মাধ্যমে রিমোট অবজেক্টগুলোর রেজিস্ট্রেশন ও অ্যাক্সেস সহজ হয়। উপরের ধাপগুলো অনুসরণ করে আপনি RMI Registry এবং এর Naming Convention এর কার্যকর ব্যবহার শিখতে পারবেন।
Read more