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