/** <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); } }
/** <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; } }