How to offer a nano service

Nano services are needed for three purposes:
-
Offering notifications.
For a nano service, interested targets can register an observer. The notification trigger sends messages to the nano service, of which each observer receives a copy.
-
Operation of a tiny services
The owner registers a nano service and registers himself as an observer. Clients of the service send a message to the nano service, which is forwarded to the owner. Advantage: The client does not need the address of the providing service.
-
Observation
A silent observer can register an observer for a nano service and get copies of the messages to the service.
Prerequisite for the tutorial
You should have read these tutorials beforehand:
Package initialization
How to start a simple target
How to register a nano service
How to add an observer to a nano service
Preliminary work
As described in the tutorials, first a nano service is registered and then an observer with its own address is added.
Nano service message processing
Another message handler is added in the constructor.
addMessageHandler(CRecordAppRunApplication.ID,
this::asyncStartApp);
The method of the message handler is implemented:
- The data is fetched from the message if necessary.
- The data will be verified.
- Something will be done with it.
- New data is placed in the message (the same message is returned as a response).
- A result code is set.
- After leaving the handler, the message is automatically sent back to the sender by the system (if the sender wishes a reply).
private boolean asyncStartApp(@NotNull final CEnvelope aEnvelope,
@NotNull final CRecord aRecord) throws CException
{
// get preset name
final String presetName = CRecordAppRunApplication.getPresetName(aRecord,
null);
CUtilCheck.checkEmptyString(presetName,
"Missing Preset Name.");
// get remote skin client
final CNodeAddress remoteSkinClient = CRecordAppRunApplication.getRemoteSkinClient(aRecord,
null);
// get session token
final UUID sessionToken = CRecordAppRunApplication.getSessionToken(aRecord,
null);
CUtilCheck.checkNotNull(sessionToken,
"Missing Session Token");
// ...
// Do something
aEnvelope.setResult(CResultCode.SUCCESS,
"");
return true;
}