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

            ResourceProcessor.Inject(filter, _ignite);

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

                MessageFilterHolder filter0 = MessageFilterHolder.CreateLocal(_ignite, filter);

                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>(IMessageFilter <T> filter, object topic = null)
        {
            IgniteArgumentCheck.NotNull(filter, "filter");

            var filter0   = MessageFilterHolder.CreateLocal(_ignite, filter);
            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).RawReader().ReadGuid();

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

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

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

                throw;
            }
        }