use of io.datatree.Tree in project moleculer-java by moleculer-java.
the class Cacher method install.
// --- ADD MIDDLEWARE TO ACTION ---
@Override
public Action install(Action action, Tree config) {
// Is caching enabled?
Tree cacheNode = config.get("cache");
if (cacheNode == null) {
return null;
}
// Get cache keys
Tree keyNode = cacheNode.get("keys");
final String[] keys;
if (keyNode == null) {
keys = null;
} else {
List<String> list = keyNode.asList(String.class);
if (list.isEmpty()) {
keys = null;
} else {
keys = new String[list.size()];
list.toArray(keys);
}
}
// Get TTL (0 = use default TTL)
final int ttl = cacheNode.get("ttl", 0);
return new Action() {
@Override
public Object handler(Context ctx) throws Exception {
String key = getCacheKey(ctx.name, ctx.params, keys);
return new Promise(resolver -> {
get(key).then(in -> {
if (in == null || in.isNull()) {
new Promise(action.handler(ctx)).then(tree -> {
set(key, tree, ttl);
resolver.resolve(tree);
}).catchError(err -> {
resolver.reject(err);
});
} else {
resolver.resolve(in);
}
}).catchError(err -> {
resolver.reject(err);
});
});
}
};
}
use of io.datatree.Tree in project moleculer-java by moleculer-java.
the class Transporter method getDescriptor.
// --- GET DESCRIPTOR OF A NODE ---
public Tree getDescriptor(String nodeID) {
if (this.nodeID.equals(nodeID)) {
return registry.getDescriptor();
}
NodeDescriptor node = nodes.get(nodeID);
if (node == null) {
return null;
}
Tree info = null;
node.readLock.lock();
try {
if (node.info != null) {
info = node.info.clone();
}
} finally {
node.readLock.unlock();
}
return info;
}
use of io.datatree.Tree in project moleculer-java by moleculer-java.
the class Transporter method sendInfoPacket.
protected void sendInfoPacket(String channel) {
Tree msg = registry.getDescriptor();
msg.put("ver", PROTOCOL_VERSION);
msg.put("sender", nodeID);
publish(channel, msg);
}
use of io.datatree.Tree in project moleculer-java by moleculer-java.
the class Transporter method received.
// --- PROCESS INCOMING MESSAGE ---
protected void received(String channel, byte[] message) {
executor.execute(() -> {
// Parse message
Tree data;
try {
data = serializer.read(message);
} catch (Exception cause) {
logger.warn("Unable to parse incoming message!", cause);
return;
}
// Debug
if (debug) {
logger.info("Message received from channel \"" + channel + "\":\r\n" + data);
}
// Send message to proper component
try {
// Get "sender" property
String sender = data.get("sender", "");
if (sender == null || sender.isEmpty()) {
logger.warn("Missing \"sender\" property:\r\n" + data);
return;
}
if (sender.equals(nodeID)) {
// It's our message
return;
}
// Incoming response
if (channel.equals(responseChannel)) {
registry.receiveResponse(data);
return;
}
// Incoming event
if (channel.equals(eventChannel)) {
eventbus.receiveEvent(data);
return;
}
// Incoming request
if (channel.equals(requestChannel)) {
registry.receiveRequest(data);
return;
}
// HeartBeat packet
if (channel.endsWith(heartbeatChannel)) {
// Get node container
NodeDescriptor node = nodes.get(sender);
if (node == null) {
// Unknown node -> send discover packet
sendDiscoverPacket(channel(PACKET_DISCOVER, sender));
return;
}
int cpu = data.get("cpu", 0);
// Update CPU info
node.writeLock.lock();
try {
node.updateCpu(cpu);
} finally {
node.writeLock.unlock();
}
return;
}
// Info packet
if (channel.equals(infoChannel) || channel.equals(infoBroadcastChannel)) {
// Register services and listeners
data.put("seq", System.currentTimeMillis());
data.put("port", 1);
updateNodeInfo(sender, data);
return;
}
// Discover packet
if (channel.equals(discoverChannel) || channel.equals(discoverBroadcastChannel)) {
// Send node desriptor to the sender
sendInfoPacket(channel(PACKET_INFO, sender));
return;
}
// Ping packet
if (channel.equals(pingChannel)) {
sendPongPacket(sender, data);
return;
}
// Disconnect packet
if (channel.equals(disconnectChannel)) {
// Switch to offline
NodeDescriptor node = nodes.get(sender);
if (node == null) {
return;
}
boolean disconnected = false;
node.writeLock.lock();
try {
if (node.markAsOffline()) {
// Remove remote actions and listeners
registry.removeActions(sender);
eventbus.removeListeners(sender);
disconnected = true;
}
} finally {
node.writeLock.unlock();
}
if (node != null && disconnected) {
// Notify listeners (not unexpected disconnection)
logger.info("Node \"" + sender + "\" disconnected.");
broadcastNodeDisconnected(node.info, false);
}
return;
}
} catch (Exception cause) {
logger.warn("Unable to process incoming message!", cause);
}
});
}
use of io.datatree.Tree in project moleculer-java by moleculer-java.
the class RedisCacher method set.
@Override
public Promise set(String key, Tree value, int ttl) {
if (status.get() == STATUS_CONNECTED) {
try {
SetArgs args;
if (ttl > 0) {
// Entry-level TTL (in seconds)
args = SetArgs.Builder.ex(ttl);
} else {
// Use the default TTL
args = expiration;
}
Tree root = new CheckedTree(Collections.singletonMap(CONTENT, value.asObject()));
return client.set(key, serializer.write(root), args);
} catch (Exception cause) {
logger.warn("Unable to put data into Redis!", cause);
}
}
return Promise.resolve();
}
Aggregations