Search in sources :

Example 6 with Tree

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);
                });
            });
        }
    };
}
Also used : Context(services.moleculer.context.Context) List(java.util.List) Action(services.moleculer.service.Action) Middleware(services.moleculer.service.Middleware) Tree(io.datatree.Tree) Context(services.moleculer.context.Context) Name(services.moleculer.service.Name) Promise(services.moleculer.Promise) Promise(services.moleculer.Promise) Action(services.moleculer.service.Action) Tree(io.datatree.Tree)

Example 7 with Tree

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;
}
Also used : NodeDescriptor(services.moleculer.transporter.tcp.NodeDescriptor) FastBuildTree(services.moleculer.util.FastBuildTree) Tree(io.datatree.Tree)

Example 8 with Tree

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);
}
Also used : FastBuildTree(services.moleculer.util.FastBuildTree) Tree(io.datatree.Tree)

Example 9 with Tree

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);
        }
    });
}
Also used : NodeDescriptor(services.moleculer.transporter.tcp.NodeDescriptor) FastBuildTree(services.moleculer.util.FastBuildTree) Tree(io.datatree.Tree)

Example 10 with Tree

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();
}
Also used : CheckedTree(services.moleculer.util.CheckedTree) CheckedTree(services.moleculer.util.CheckedTree) Tree(io.datatree.Tree) SetArgs(com.lambdaworks.redis.SetArgs)

Aggregations

Tree (io.datatree.Tree)60 FastBuildTree (services.moleculer.util.FastBuildTree)26 Test (org.junit.Test)12 NodeDescriptor (services.moleculer.transporter.tcp.NodeDescriptor)12 CheckedTree (services.moleculer.util.CheckedTree)9 TimeoutException (java.util.concurrent.TimeoutException)6 Promise (services.moleculer.Promise)6 CommonUtils.readTree (services.moleculer.util.CommonUtils.readTree)6 RemoteException (java.rmi.RemoteException)4 LinkedHashMap (java.util.LinkedHashMap)4 CallOptions (services.moleculer.context.CallOptions)4 Context (services.moleculer.context.Context)4 Annotation (java.lang.annotation.Annotation)3 HashSet (java.util.HashSet)3 LinkedHashSet (java.util.LinkedHashSet)3 Map (java.util.Map)3 NoSuchElementException (java.util.NoSuchElementException)3 ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap)3 ServiceBrokerConfig (services.moleculer.config.ServiceBrokerConfig)3 Action (services.moleculer.service.Action)3