/// <summary> /// Receives the next message from the queue identified by the configured <see cref="AbstractRebusTransport.Address"/>, returning null if none was available /// </summary> public override async Task <TransportMessage> Receive(ITransactionContext context, CancellationToken cancellationToken) { if (context == null) { throw new ArgumentNullException(nameof(context)); } if (_inputQueueAddress == null) { throw new InvalidOperationException("This in-mem transport is initialized without an input queue, hence it is not possible to receive anything!"); } var nextMessage = _network.GetNextOrNull(_inputQueueAddress); if (nextMessage == null) { return(null); } context.OnAborted(() => { _network.Deliver(_inputQueueAddress, nextMessage, alwaysQuiet: true); }); return(nextMessage.ToTransportMessage()); }
static TimeSpan RunTest(int numberOfMessages, PipelineStepProfilerStats profilerStats) { using (var adapter = new BuiltinHandlerActivator()) { var network = new InMemNetwork(); Configure.With(adapter) .Logging(l => l.Console(LogLevel.Warn)) .Transport(t => t.UseInMemoryTransport(network, "perftest")) .Options(o => { o.SetNumberOfWorkers(0); o.SetMaxParallelism(1); o.Decorate<IPipeline>(c => new PipelineStepProfiler(c.Get<IPipeline>(), profilerStats)); }) .Start(); var serializer = new JsonSerializer(); var boy = new SomeMessage("hello there!"); numberOfMessages.Times(() => { var headers = new Dictionary<string, string> { { Headers.MessageId, Guid.NewGuid().ToString() } }; var message = new Message(headers, boy); var transportMessage = serializer.Serialize(message).Result; var inMemTransportMessage = transportMessage.ToInMemTransportMessage(); network.Deliver("perftest", inMemTransportMessage); }); var numberOfReceivedMessages = 0; var gotAllMessages = new ManualResetEvent(false); adapter.Handle<SomeMessage>(async m => { numberOfReceivedMessages++; if (numberOfReceivedMessages == numberOfMessages) { gotAllMessages.Set(); } }); var stopwatch = Stopwatch.StartNew(); adapter.Bus.Advanced.Workers.SetNumberOfWorkers(1); gotAllMessages.WaitOrDie(TimeSpan.FromSeconds(30)); return stopwatch.Elapsed; } }
/// <summary> /// Delivers the given message to the queue identitied by the given <paramref name="destinationAddress"/> /// </summary> public async Task Send(string destinationAddress, TransportMessage message, ITransactionContext context) { if (destinationAddress == null) { throw new ArgumentNullException("destinationAddress"); } if (message == null) { throw new ArgumentNullException("message"); } if (context == null) { throw new ArgumentNullException("context"); } if (!_network.HasQueue(destinationAddress)) { throw new ArgumentException(string.Format("Destination queue address '{0}' does not exist!", destinationAddress)); } context.OnCommitted(async() => _network.Deliver(destinationAddress, message.ToInMemTransportMessage())); }