-
Notifications
You must be signed in to change notification settings - Fork 8
Home
Dirmi is replacement for Java RMI which supports bidirectional remote objects and a few more features, including:
- Customizable remote exceptions
- Callbacks
- Streams
- Batched methods
- Disposable objects
- Closeable sessions
Dirmi doesn't support distributed garbage collection, a feature available in Java RMI. Remote objects must be explicitly disposed to release memory on both the client and the server. Remote objects are automatically disposed when sessions are closed, or when the connection is lost. It should be noted that distributed GC was available to Dirmi v1, but it was complicated, inefficient, and it couldn't collect cyclic object graphs.
Dirmi is superficially similar to Java RMI in that it requires interfaces to define remote objects. Like RMI, the interface must extend Remote, and each method must declare throwing RemoteException or a superclass. Dirmi allows alternate exceptions to be declared, using the RemoteFailure annotation.
Here's a simple example interface, which is defined exactly the same as for RMI:
import org.cojen.dirmi.Remote;
import org.cojen.dirmi.RemoteException;
public interface HelloDirmi extends Remote {
void greetings(String name) throws RemoteException;
}
Everything else looks different from RMI. The server implementation of the interface looks like so:
import java.net.ServerSocket;
import org.cojen.dirmi.Environment;
public class HelloDirmiServer implements HelloDirmi {
public static void main(String[] args) throws Exception {
Environment env = Environment.create();
env.export("main", new HelloDirmiServer());
env.acceptAll(new ServerSocket(1234));
}
@Override
public void greetings(String name) {
System.out.println("Hello " + name);
}
}
The Environment is a sharable object containing open sessions and pooled threads for executing them. The example is accepting any session on port 1234, and then sending a shared instance of the server to it. Sessions remain open as long as both endpoints are alive and have not explicitly closed it. The client code for establishing the session and receiving the remote object looks like:
import org.cojen.dirmi.Environment;
import org.cojen.dirmi.Session;
public class HelloDirmiClient {
public static void main(String[] args) throws Exception {
Environment env = Environment.create();
String host = args[0];
int port = 1234;
Session<HelloDirmi> session = env.connect(HelloDirmi.class, "main", host, port);
HelloDirmi client = session.root();
client.greetings("Dirmi");
env.close();
}
}
Like the server, the client needs an Environment for managing sessions. Upon establishing a session, it accesses the root object exported by the server and calls it.