Out-of-band Signalling

Sometimes a client needs to send a special message to a server in order to tell the server to do something. The server may need to be signalled to perform a defragment or it may need to be signalled to shut itself down gracefully.

This is configured by calling setMessageRecipient(), passing the object that will process client-initiated messages.

StartServer.java: runServer
01/** 02 * opens the ObjectServer, and waits forever until close() is called 03 * or a StopServer message is being received. 04 */ 05 public void runServer(){ 06 synchronized(this){ 07 ObjectServer db4oServer = Db4o.openServer(FILE, PORT); 08 db4oServer.grantAccess(USER, PASS); 09 10 // Using the messaging functionality to redirect all 11 // messages to this.processMessage 12 db4oServer.ext().configure().setMessageRecipient(this); 13 14 // to identify the thread in a debugger 15 Thread.currentThread().setName(this.getClass().getName()); 16 17 // We only need low priority since the db4o server has 18 // it's own thread. 19 Thread.currentThread().setPriority(Thread.MIN_PRIORITY); 20 try { 21 if(! stop){ 22 // wait forever for notify() from close() 23 this.wait(Long.MAX_VALUE); 24 } 25 } catch (Exception e) { 26 e.printStackTrace(); 27 } 28 db4oServer.close(); 29 } 30 }

The message is received and processed by a processMessage() method:

StartServer.java: processMessage
1/** 2 * messaging callback 3 * @see com.db4o.messaging.MessageRecipient#processMessage(ObjectContainer, Object) 4 */ 5 public void processMessage(ObjectContainer con, Object message) { 6 if(message instanceof StopServer){ 7 close(); 8 } 9 }

Db4o allows a client to send an arbitrary signal or message to a server by sending a plain user object to the server. The server will receive a callback message, including the object that came from the client. The server can interpret this message however it wants.

StopServer.java: main
01/** 02 * stops a db4o Server started with StartServer. 03 * @throws Exception 04 */ 05 public static void main(String[] args) { 06 ObjectContainer objectContainer = null; 07 try { 08 09 // connect to the server 10 objectContainer = Db4o.openClient(HOST, PORT, USER, PASS); 11 12 } catch (Exception e) { 13 e.printStackTrace(); 14 } 15 16 if(objectContainer != null){ 17 18 // get the messageSender for the ObjectContainer 19 MessageSender messageSender = objectContainer.ext() 20 .configure().getMessageSender(); 21 22 // send an instance of a StopServer object 23 messageSender.send(new StopServer()); 24 25 // close the ObjectContainer 26 objectContainer.close(); 27 } 28 }