[CT414]: Add WK02-1 notes
This commit is contained in:
Binary file not shown.
@ -302,10 +302,108 @@ We will use the example of a remote object that is used to computer arbitrary ta
|
|||||||
\item RMI loads task code dynamically in the server.
|
\item RMI loads task code dynamically in the server.
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
This example shows polymorphism on the server, but it also works on the client, for example the server returns a particular interface implementation.
|
This example shows polymorphism on the server, but it also works on the client, for example the server returns a particular interface implementation.
|
||||||
|
\\\\
|
||||||
|
Our example task will be a simple interface that defines an arbitrary task to compute:
|
||||||
|
\begin{code}
|
||||||
|
\begin{minted}[linenos, breaklines, frame=single]{java}
|
||||||
|
public interface Task extends Serializable
|
||||||
|
{
|
||||||
|
Object run();
|
||||||
|
}
|
||||||
|
\end{minted}
|
||||||
|
\caption{Simple \mintinline{java}{Task} interface}
|
||||||
|
\end{code}
|
||||||
|
|
||||||
|
We will also define a \mintinline{java}{Remote} interface:
|
||||||
|
\begin{code}
|
||||||
|
\begin{minted}[linenos, breaklines, frame=single]{java}
|
||||||
|
import java.rmi.*;
|
||||||
|
|
||||||
|
public interface Compute extends Remote
|
||||||
|
{
|
||||||
|
Object runTask(Task t) throws RemoteException;
|
||||||
|
}
|
||||||
|
\end{minted}
|
||||||
|
\caption{Simple \mintinline{java}{Task} interface}
|
||||||
|
\end{code}
|
||||||
|
|
||||||
|
A task may create a \mintinline{java}{Remote} object on the server and return a reference to that object; the \mintinline{java}{Remote} object will be garbage-collected when the returned reference is dropped (assuming that no-one else is given a copy of the reference).
|
||||||
|
A task may create a \mintinline{java}{Serializable} object and return a copy of that object; the original object will be locally garbage-collected when the \mintinline{java}{Task} ends.
|
||||||
|
If the \mintinline{java}{Task} creates an object that is neither a \mintinline{java}{Remote} nor a \mintinline{java}{Serializable} object, a marshalling exception will be thrown.
|
||||||
|
|
||||||
|
\begin{code}
|
||||||
|
\begin{minted}[linenos, breaklines, frame=single]{java}
|
||||||
|
import java.rmi.*;
|
||||||
|
import java.rmi.server.*;
|
||||||
|
|
||||||
|
public class ComputeServer extends UnicastRemoteObject implements Compute
|
||||||
|
{
|
||||||
|
public ComputeServer() throws RemoteException {}
|
||||||
|
|
||||||
|
public Object runTask(Task t)
|
||||||
|
{
|
||||||
|
return t.run();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
\end{minted}
|
||||||
|
\caption{Compute server implementation}
|
||||||
|
\end{code}
|
||||||
|
|
||||||
|
\begin{code}
|
||||||
|
\begin{minted}[linenos, breaklines, frame=single]{java}
|
||||||
|
public static void main(String args[])
|
||||||
|
{
|
||||||
|
System.setSecurityManager(new RMISecurityManager());
|
||||||
|
try
|
||||||
|
{
|
||||||
|
ComputeServer cs = new ComputeServer();
|
||||||
|
Naming.rebind("Computer", cs);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
// Exception handling
|
||||||
|
}
|
||||||
|
}
|
||||||
|
\end{minted}
|
||||||
|
\caption{Compute server implementation}
|
||||||
|
\end{code}
|
||||||
|
|
||||||
|
\begin{code}
|
||||||
|
\begin{minted}[linenos, breaklines, frame=single]{java}
|
||||||
|
public class Pi implements Task
|
||||||
|
{
|
||||||
|
private int places;
|
||||||
|
|
||||||
|
public Pi (int places)
|
||||||
|
{
|
||||||
|
this.places = places;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object run()
|
||||||
|
{
|
||||||
|
// Compute Pi
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
\end{minted}
|
||||||
|
\caption{Task to compute $\pi$}
|
||||||
|
\end{code}
|
||||||
|
|
||||||
|
\begin{code}
|
||||||
|
\begin{minted}[linenos, breaklines, frame=single]{java}
|
||||||
|
Compute comp = (Compute) Naming.Lookup("//www.t.nuigalway.ie/Computer");
|
||||||
|
|
||||||
|
Pi pi = new Pi(100);
|
||||||
|
Object piResult = comp.runTask(pi);
|
||||||
|
|
||||||
|
// print results
|
||||||
|
\end{minted}
|
||||||
|
\caption{The client}
|
||||||
|
\end{code}
|
||||||
|
|
||||||
|
In conclusion, RMI is flexible and allows us to pass objects (both \mintinline{java}{Remote} \& \mintinline{java}{Serializable}) by exact type rather than declared type and download code to introduce extended functionality in both client \& server.
|
||||||
|
However, it is Java-only and has been superseded by SOAP \& REST as the de-facto standards for communicating with remote services.
|
||||||
|
Nonetheless, RMI is still worth learning to help understand concepts around distributed objects \& distributed systems architecture.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user