Esempio n. 1
0
        /** <inheritdoc /> */
        public void LocalListen <T>(IMessageListener <T> listener, object topic = null)
        {
            IgniteArgumentCheck.NotNull(listener, "filter");

            ResourceProcessor.Inject(listener, _ignite);

            lock (_funcMap)
            {
                var key = GetKey(listener, topic);

                MessageListenerHolder filter0 = MessageListenerHolder.CreateLocal(_ignite, listener);

                var filterHnd = _ignite.HandleRegistry.Allocate(filter0);

                filter0.DestroyAction = () =>
                {
                    lock (_funcMap)
                    {
                        _funcMap.Remove(key, filterHnd);
                    }
                };

                try
                {
                    DoOutOp((int)Op.LocalListen, writer =>
                    {
                        writer.WriteLong(filterHnd);
                        writer.Write(topic);
                    });
                }
                catch (Exception)
                {
                    _ignite.HandleRegistry.Release(filterHnd);

                    throw;
                }

                _funcMap.Add(key, filterHnd);
            }
        }
Esempio n. 2
0
        /** <inheritdoc /> */
        public Guid RemoteListen <T>(IMessageListener <T> listener, object topic = null)
        {
            IgniteArgumentCheck.NotNull(listener, "filter");

            var filter0   = MessageListenerHolder.CreateLocal(_ignite, listener);
            var filterHnd = _ignite.HandleRegistry.AllocateSafe(filter0);

            try
            {
                Guid id = Guid.Empty;

                DoOutInOp((int)Op.RemoteListen,
                          writer =>
                {
                    writer.Write(filter0);
                    writer.WriteLong(filterHnd);
                    writer.Write(topic);
                },
                          input =>
                {
                    var id0 = Marshaller.StartUnmarshal(input).GetRawReader().ReadGuid();

                    Debug.Assert(_isAsync || id0.HasValue);

                    if (id0.HasValue)
                    {
                        id = id0.Value;
                    }
                });

                return(id);
            }
            catch (Exception)
            {
                _ignite.HandleRegistry.Release(filterHnd);

                throw;
            }
        }
Esempio n. 3
0
        /// <summary>
        /// Remotes listen.
        /// </summary>
        private TRes RemoteListen <T, TRes>(IMessageListener <T> filter, object topic,
                                            Func <Action <IBinaryRawWriter>, Func <BinaryReader, Guid>, TRes> invoker)
        {
            IgniteArgumentCheck.NotNull(filter, "filter");

            var filter0   = MessageListenerHolder.CreateLocal(_ignite, filter);
            var filterHnd = _ignite.HandleRegistry.AllocateSafe(filter0);

            try
            {
                return(invoker(writer =>
                {
                    writer.WriteObject(filter0);
                    writer.WriteLong(filterHnd);
                    writer.WriteObject(topic);
                }, input => input.ReadGuid() ?? Guid.Empty));
            }
            catch (Exception)
            {
                _ignite.HandleRegistry.Release(filterHnd);

                throw;
            }
        }