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.
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:
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.
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
}