GUIを起動すると、新しいスレッドが開始されます。Java RMIサーバのシャットダウン
final Server myServer = new Server(); final Thread t1 = new Thread(myServer, "T1"); t1.start();
GUIだけでクリックすると、スレッドを停止するためのボタンがあります。
final JButton btnStartServer = new JButton("Stop server"); btnStartServer.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { myServer.stop(); } });
スレッドは、Java RMIサーバであるオブジェクトTrackingServiceImplを作成します。自身が次のようになりますスレッド:私は、サーバーへのすべてのクライアントを接続する前に、ボタンをクリックした場合
class Server implements Runnable { private volatile boolean exit = false; public void run() { try { TrackingService server1 = new TrackingServiceImpl(); TrackingService serverInstance, stub = null; Registry registry = null; while (!exit) { serverInstance = ((TrackingServiceImpl) server1).getInstance(); stub = (TrackingService) UnicastRemoteObject.exportObject((TrackingService) serverInstance, 0); registry = LocateRegistry.createRegistry(4444); registry.bind("TrackingService", stub); System.out.println("Tracking service has started at port " + 4444); } System.out.println("Server is stopping...."); registry.unbind("TrackingService"); UnicastRemoteObject.unexportObject(registry, false); } catch (Exception e) { } } public void stop() { exit = true; } }
は今、コードが動作します。クライアントはサーバーに接続できません。しかし、クライアントをサーバーに接続させてからボタンをクリックすると、サーバーはすでに停止していても(レジストリのバインド解除およびエクスポート)、クライアントは引き続きサーバー上のメソッドを呼び出すことができます。
ありがとうございます!
_ "サーバが既に停止していても(レジストリがアンバインドされ、エクスポートされています)" _これは前提か事実ですか? –
これはそれを停止しませんか? registry.unbind( "TrackingService"); UnicastRemoteObject.unexportObject(registry、false); クライアントに接続する前にサーバーを停止しても、クライアントに接続させないということは意味があります。しかし、クライアントを接続した後にクライアントを停止しても、クライアントを停止しないと、クライアントは引き続きメソッドを呼び出すことができます。 – Teddy
@Teddyいいえ、それはそれをバインド解除し、レジストリを停止します。何もリモートオブジェクトを停止していません。既にスタブを保持しているクライアントは、引き続きそのスタブを呼び出すことができます。私の答えを見てください。 – EJP