Esempio n. 1
0
        bool IRemoteDispatcher.DispatchRemoteMsg(Topic topic, object msg)
        {
            var agents = _rrepo.GetAgents();

            if (agents.IsEmpty())
                return false;

            var json = _json.MsgToJson(msg);
            var hasListeners = false;

            foreach (var agent in agents)
            {
                bool msgShouldBeSent = msg_shoould_be_sent(topic, agent, msg);

                if (msgShouldBeSent == false)
                {
                    Interlocked.Increment(ref _counters.MsgsFiltered);
                    continue;
                }

                hasListeners = true;

                dispatch_to_remote(agent.AgentUri, topic, json);
                Interlocked.Increment(ref _counters.MsgsDispatched);
            }

            return hasListeners;
        }
Esempio n. 2
0
        bool ILocalDispatcher.DispatchLocalMsg(Topic topic, object msg)
        {
            int snapshotId;
            var handlers = _lrepo.GetHandlers(topic.Guid, out snapshotId);

            var hasListeners = dispatch_to_handlers(msg, handlers);
            Interlocked.Increment(ref _counters.LocalMsgs);

            if (hasListeners)
                Interlocked.Increment(ref _counters.LocalMsgsDispatched);

            return hasListeners;
        }
Esempio n. 3
0
        object IJsonEngine.MsgFromJson(Topic topic, string json)
        {
            var type = topic.Type;

            try
            {
                return
                    JsonConvert.DeserializeObject(json, type);
            }
            catch (Exception ex)
            {
                _log.Warn(ex, "Failed to parse type '{0}' of topic '{1}' from {2}", type.Name, topic.Name, json);
                throw;
            }
        }
Esempio n. 4
0
        private bool msg_shoould_be_sent(Topic topic, RemoteAgent agent, object msg)
        {
            var topicFilter = get_topic_filter(topic.Guid, agent);

            if (topicFilter == null)
                return true;

            if (topicFilter.Filters.IsEmpty())
                return false;               // topic has no listeners on target

            if (topicFilter.FilterThrows)
                return true;                // there is a local filter but it throws (remote will recalculate filter)

            try
            {
                var filterIsMatched = filter_is_matched(topicFilter.Filters, msg);

                if (filterIsMatched)
                    return true;
            }
            catch (Exception ex)
            {
                topicFilter.FilterThrows = true;
                _log.Warn(ex, "Failed to invoke remote filter for topic {0}", topic.ToJson());
            }

            // no matched filters

            return false;
        }
Esempio n. 5
0
        private void dispatch_to_remote(string agent, Topic topic, string json)
        {
            var msg = new comm.PublishMsg {
                Topic = topic,
                TopicName = topic.Name,
                TopicGuid = topic.Guid,
                Json = json,
                FromAgent = _myself
            };

            _messenger.SendPublishMsg(agent, msg);
        }