public override void OnNext(TransportMessage value) { using (var mq = getOutgoingQueue(value.RecipientPath)) { value.SenderPath = LocalPath; mq.Send(value); } }
public void Intercept(IInvocation invocation) { assertIsValid(invocation.Method); // TODO: fix dependency on IoC var address = m_address ?? m_target.Configuration.Attributes[WindsorEx.ADDRESS]; var key = m_target.Configuration.Attributes[WindsorEx.REMOTE_KEY]; Console.WriteLine("invoking {0} on {1}", invocation, address); var ctx = new Context {RecipientKey = key, RecipientPath = address}; var invocationPayload = new InvocationMessage(ctx, invocation); replaceCallbacksWithTokens(invocationPayload); var payload = m_serializer.Serialize(invocationPayload); var transportMessage = new TransportMessage(payload, address); m_transport.OnNext(transportMessage); }
public void ScheduleTimeoutAction(string token, Delegate callback) { var ctx = MessagelessContext.CurrentContext; if (ctx == null) return; if (ctx.TimeOut == default(TimeSpan)) return; var subscription = Observable .Timer(ctx.TimeOut) .Select(_ => { var context = new Context { RecipientKey = token, TimeOut = ctx.TimeOut, CallbackTimedOut = true }; var callbackMessage = new CallbackMessage(context, callback.GetType(), null); var payload = m_serializer.Serialize(callbackMessage); var transportMessage = new TransportMessage(payload, m_transport.LocalPath); return transportMessage; }) .Finally(() => DismissTimeoutAction(token)) .Subscribe(m_transport); m_timeoutTimers[token] = subscription; }
// TODO: use rx oftype public void Handle(TransportMessage message) { try { var msg = m_serializer.Deserialize(message.Payload); if (msg is ITransportAware) (msg as ITransportAware).SetTransportMessage(message); if (msg is InvocationMessage) { Handle((InvocationMessage)msg); } else { Handle((CallbackMessage)msg); } } catch (Exception ex) { // TODO: log Console.WriteLine(ex); } }
public abstract void OnNext(TransportMessage value);
public void Poison_message_in_local_queue_should_not_stop_handler() { // arrange m_localContainer.Register( Component.For<IService>().LifeStyle.Transient.At(LOCAL_ADDR, SERVICE_KEY, PROXY_KEY), Component.For<IService>().Instance(m_service).Named(SERVICE_KEY) ); var proxy = m_localContainer.Resolve<IService>(PROXY_KEY); var signal = new AutoResetEvent(false); m_service.Stub(s => s.Foo()) .IgnoreArguments() .Call().Action(() => signal.Set()); // act var transport = m_localContainer.Resolve<ITransport>(); var poisonMsg = new TransportMessage(new byte[] {1, 2, 3}, LOCAL_ADDR); transport.OnNext(poisonMsg); transport.OnNext(poisonMsg); proxy.Foo(); // assert var fooCalled = signal.WaitOne(TimeSpan.FromSeconds(1)); fooCalled.Should().BeTrue(); }
public override void OnNext(TransportMessage value) { value.SenderPath = LocalPath; getSubject(value.RecipientPath).OnNext(value); }
public void SetTransportMessage(TransportMessage transportMessage) { Context.SenderPath = transportMessage.SenderPath; }