public void GivenAMongoDbSagaRepository_WhenSendingAndInstanceNotReturnedFromPolicy() { _correlationId = Guid.NewGuid(); _cancellationToken = new CancellationToken(); _context = new Mock <ConsumeContext <InitiateSimpleSaga> >(); _context.Setup(x => x.CorrelationId).Returns(_correlationId); _context.Setup(m => m.CancellationToken).Returns(_cancellationToken); _nullSimpleSaga = null; _policy = new Mock <ISagaPolicy <SimpleSaga, InitiateSimpleSaga> >(); _policy.Setup(x => x.PreInsertInstance(_context.Object, out _nullSimpleSaga)).Returns(false); _nextPipe = new Mock <IPipe <SagaConsumeContext <SimpleSaga, InitiateSimpleSaga> > >(); _simpleSaga = new SimpleSaga { CorrelationId = _correlationId }; _sagaConsumeContext = new Mock <SagaConsumeContext <SimpleSaga, InitiateSimpleSaga> >(); _sagaConsumeContext.Setup(x => x.CorrelationId).Returns(_correlationId); _sagaConsumeContextFactory = new Mock <IMongoDbSagaConsumeContextFactory>(); _sagaConsumeContextFactory.Setup( m => m.Create(It.IsAny <IMongoCollection <SimpleSaga> >(), _context.Object, It.Is <SimpleSaga>(x => x.CorrelationId == _correlationId), true)) .Returns(_sagaConsumeContext.Object); TaskUtil.Await(() => SagaRepository.InsertSaga(_simpleSaga)); var repository = new MongoDbSagaRepository <SimpleSaga>(SagaRepository.Instance, _sagaConsumeContextFactory.Object); TaskUtil.Await(() => repository.Send(_context.Object, _policy.Object, _nextPipe.Object)); }
public async Task GivenAMongoDbSagaRepository_WhenSendingQuery() { _correlationId = Guid.NewGuid(); var saga = new SimpleSaga { CorrelationId = _correlationId }; await SagaRepository.InsertSaga(saga); _sagaQueryConsumeContext = new Mock <SagaQueryConsumeContext <SimpleSaga, InitiateSimpleSaga> >(); _sagaQueryConsumeContext.Setup(x => x.Query.FilterExpression).Returns(x => x.CorrelationId == _correlationId); _sagaPolicy = new Mock <ISagaPolicy <SimpleSaga, InitiateSimpleSaga> >(); _nextPipe = new Mock <IPipe <SagaConsumeContext <SimpleSaga, InitiateSimpleSaga> > >(); _sagaConsumeContext = new Mock <SagaConsumeContext <SimpleSaga, InitiateSimpleSaga> >(); _sagaConsumeContext.Setup(x => x.CorrelationId).Returns(_correlationId); _sagaConsumeContextFactory = new Mock <IMongoDbSagaConsumeContextFactory>(); _sagaConsumeContextFactory.Setup( m => m.Create(It.IsAny <IMongoCollection <SimpleSaga> >(), _sagaQueryConsumeContext.Object, It.Is <SimpleSaga>(x => x.CorrelationId == _correlationId), true)).Returns(_sagaConsumeContext.Object); var repository = new MongoDbSagaRepository <SimpleSaga>(SagaRepository.Instance, _sagaConsumeContextFactory.Object); await repository.SendQuery(_sagaQueryConsumeContext.Object, _sagaPolicy.Object, _nextPipe.Object); }
public async Task GivenAMongoDbSagaRepository_WhenSendingAndPolicyReturnsInstance() { _correlationId = Guid.NewGuid(); _cancellationToken = new CancellationToken(); _context = new Mock <ConsumeContext <InitiateSimpleSaga> >(); _context.Setup(x => x.CorrelationId).Returns(_correlationId); _context.Setup(m => m.CancellationToken).Returns(_cancellationToken); _simpleSaga = new SimpleSaga { CorrelationId = _correlationId }; _policy = new Mock <ISagaPolicy <SimpleSaga, InitiateSimpleSaga> >(); _policy.Setup(x => x.PreInsertInstance(_context.Object, out _simpleSaga)).Returns(true); _nextPipe = new Mock <IPipe <SagaConsumeContext <SimpleSaga, InitiateSimpleSaga> > >(); _sagaConsumeContext = new Mock <SagaConsumeContext <SimpleSaga, InitiateSimpleSaga> >(); _sagaConsumeContext.Setup(x => x.CorrelationId).Returns(_correlationId); _sagaConsumeContextFactory = new Mock <IMongoDbSagaConsumeContextFactory>(); _sagaConsumeContextFactory.Setup(m => m.Create(It.IsAny <IMongoCollection <SimpleSaga> >(), _context.Object, _simpleSaga, true)).Returns( _sagaConsumeContext.Object); var repository = new MongoDbSagaRepository <SimpleSaga>(SagaRepository.Instance, _sagaConsumeContextFactory.Object); await repository.Send(_context.Object, _policy.Object, _nextPipe.Object); }
public void GivenAMongoDbSagaRespository_WhenSendingCompletedInstance() { _correlationId = Guid.NewGuid(); _cancellationToken = new CancellationToken(); var context = new Mock<ConsumeContext<CompleteSimpleSaga>>(); context.Setup(x => x.CorrelationId).Returns(_correlationId); context.Setup(m => m.CancellationToken).Returns(_cancellationToken); _simpleSaga = new SimpleSaga { CorrelationId = _correlationId, Version = 5 }; TaskUtil.Await(() => _simpleSaga.Consume(It.IsAny<ConsumeContext<CompleteSimpleSaga>>())); TaskUtil.Await(() => SagaRepository.InsertSaga(_simpleSaga)); var sagaConsumeContext = new Mock<SagaConsumeContext<SimpleSaga, CompleteSimpleSaga>>(); sagaConsumeContext.SetupGet(x => x.IsCompleted).Returns(true); var mongoDbSagaConsumeContextFactory = new Mock<IMongoDbSagaConsumeContextFactory>(); mongoDbSagaConsumeContextFactory.Setup(x => x.Create(It.IsAny<IMongoCollection<SimpleSaga>>(), context.Object, It.IsAny<SimpleSaga>(), true)).Returns(sagaConsumeContext.Object); var repository = new MongoDbSagaRepository<SimpleSaga>(SagaRepository.Instance, mongoDbSagaConsumeContextFactory.Object); TaskUtil.Await(() => repository.Send(context.Object, Mock.Of<ISagaPolicy<SimpleSaga, CompleteSimpleSaga>>(), null)); }
public async Task StartAsync() { var repository = new MongoDbSagaRepository <GameSaga>(mongoDbConfig.Endpoint, mongoDbConfig.Database, Collections.GameSagas); busControl = Bus.Factory.CreateUsingRabbitMq(cfg => { var rabbitMqHost = cfg.Host(new Uri(rabbitMqConfig.Endpoint), host => { host.Username(rabbitMqConfig.Username); host.Password(rabbitMqConfig.Password); }); cfg.ReceiveEndpoint(rabbitMqHost, rabbitMqConfig.GetQueueName(Queues.GameSaga), e => { // Specify the maximum number of concurrent messages that are consumed e.PrefetchCount = (ushort)Environment.ProcessorCount; // Defer publish of messages until saga is persisted // Required for PrefetchCount > 1 // https://stackoverflow.com/questions/38716143/masstransit-saga-running-with-prefetch-1 e.UseInMemoryOutbox(); e.StateMachineSaga(stateMachine, repository); }); // In-memory quartz do not provide persistence // For production use separate quartz service or rabbitmq scheduling plugin cfg.UseInMemoryScheduler(); }); logger.LogInformation("Starting MT bus"); await busControl.StartAsync(); logger.LogInformation("Started MT bus"); }
public void GivenAMongoDbSagaRespository_WhenSendingCompletedInstance() { _correlationId = Guid.NewGuid(); _cancellationToken = new CancellationToken(); var context = new Mock <ConsumeContext <CompleteSimpleSaga> >(); context.Setup(x => x.CorrelationId).Returns(_correlationId); context.Setup(m => m.CancellationToken).Returns(_cancellationToken); _simpleSaga = new SimpleSaga { CorrelationId = _correlationId, Version = 5 }; TaskUtil.Await(() => _simpleSaga.Consume(It.IsAny <ConsumeContext <CompleteSimpleSaga> >())); TaskUtil.Await(() => SagaRepository.InsertSaga(_simpleSaga)); var sagaConsumeContext = new Mock <SagaConsumeContext <SimpleSaga, CompleteSimpleSaga> >(); sagaConsumeContext.SetupGet(x => x.IsCompleted).Returns(true); var mongoDbSagaConsumeContextFactory = new Mock <IMongoDbSagaConsumeContextFactory>(); mongoDbSagaConsumeContextFactory.Setup(x => x.Create(It.IsAny <IMongoCollection <SimpleSaga> >(), context.Object, It.IsAny <SimpleSaga>(), true)).Returns(sagaConsumeContext.Object); var repository = new MongoDbSagaRepository <SimpleSaga>(SagaRepository.Instance, mongoDbSagaConsumeContextFactory.Object); TaskUtil.Await(() => repository.Send(context.Object, Mock.Of <ISagaPolicy <SimpleSaga, CompleteSimpleSaga> >(), null)); }
public async Task GivenAMongoDbSagaRepository_WhenSendingQuery() { _correlationId = Guid.NewGuid(); var saga = new SimpleSaga {CorrelationId = _correlationId}; await SagaRepository.InsertSaga(saga); _sagaQueryConsumeContext = new Mock<SagaQueryConsumeContext<SimpleSaga, InitiateSimpleSaga>>(); _sagaQueryConsumeContext.Setup(x => x.Query.FilterExpression).Returns(x => x.CorrelationId == _correlationId); _sagaPolicy = new Mock<ISagaPolicy<SimpleSaga, InitiateSimpleSaga>>(); _nextPipe = new Mock<IPipe<SagaConsumeContext<SimpleSaga, InitiateSimpleSaga>>>(); _sagaConsumeContext = new Mock<SagaConsumeContext<SimpleSaga, InitiateSimpleSaga>>(); _sagaConsumeContext.Setup(x => x.CorrelationId).Returns(_correlationId); _sagaConsumeContextFactory = new Mock<IMongoDbSagaConsumeContextFactory>(); _sagaConsumeContextFactory.Setup( m => m.Create(It.IsAny<IMongoCollection<SimpleSaga>>(), _sagaQueryConsumeContext.Object, It.Is<SimpleSaga>(x => x.CorrelationId == _correlationId), true)).Returns(_sagaConsumeContext.Object); var repository = new MongoDbSagaRepository<SimpleSaga>(SagaRepository.Instance, _sagaConsumeContextFactory.Object); await repository.SendQuery(_sagaQueryConsumeContext.Object, _sagaPolicy.Object, _nextPipe.Object); }
public async Task GivenAMongoDbSagaRepository_WhenSendingQueryAndSagaNotFound() { _sagaQueryConsumeContext = new Mock<SagaQueryConsumeContext<SimpleSaga, InitiateSimpleSaga>>(); _sagaQueryConsumeContext.Setup(x => x.Query.FilterExpression).Returns(x => x.CorrelationId == Guid.NewGuid()); _sagaPolicy = new Mock<ISagaPolicy<SimpleSaga, InitiateSimpleSaga>>(); _nextPipe = new Mock<IPipe<SagaConsumeContext<SimpleSaga, InitiateSimpleSaga>>>(); var repository = new MongoDbSagaRepository<SimpleSaga>(SagaRepository.Instance, null); await repository.SendQuery(_sagaQueryConsumeContext.Object, _sagaPolicy.Object, _nextPipe.Object); }
public async Task GivenAMongoDbSagaRepository_WhenSendingQueryAndSagaNotFound() { _sagaQueryConsumeContext = new Mock <SagaQueryConsumeContext <SimpleSaga, InitiateSimpleSaga> >(); _sagaQueryConsumeContext.Setup(x => x.Query.FilterExpression).Returns(x => x.CorrelationId == Guid.NewGuid()); _sagaPolicy = new Mock <ISagaPolicy <SimpleSaga, InitiateSimpleSaga> >(); _nextPipe = new Mock <IPipe <SagaConsumeContext <SimpleSaga, InitiateSimpleSaga> > >(); var repository = new MongoDbSagaRepository <SimpleSaga>(SagaRepository.Instance, null); await repository.SendQuery(_sagaQueryConsumeContext.Object, _sagaPolicy.Object, _nextPipe.Object); }
public void GivenAMongoDbSagaRepository_WhenProbing() { _scope = new Mock<ProbeContext>(); _probeContext = new Mock<ProbeContext>(); _probeContext.Setup(m => m.CreateScope("sagaRepository")).Returns(_scope.Object); var repository = new MongoDbSagaRepository<SimpleSaga>(SagaRepository.Instance, null); repository.Probe(_probeContext.Object); }
public void GivenAMongoDbSagaRepository_WhenProbing() { _scope = new Mock <ProbeContext>(); _probeContext = new Mock <ProbeContext>(); _probeContext.Setup(m => m.CreateScope("sagaRepository")).Returns(_scope.Object); var repository = new MongoDbSagaRepository <SimpleSaga>(SagaRepository.Instance, null); repository.Probe(_probeContext.Object); }
static void Main(string[] args) { Log.Logger = new LoggerConfiguration() .WriteTo.Console() .MinimumLevel.Debug() .CreateLogger(); var address = new Uri("rabbitmq://localhost/exemplo3"); var repository = MongoDbSagaRepository <ReservaCOEState> .Create("mongodb://*****:*****@localhost:27017", "ReservaCOE"); var bus = Bus.Factory.CreateUsingRabbitMq(cfg => { cfg.UseSerilog(); cfg.Host(address, x => { x.Username("guest"); x.Password("guest"); }); cfg.ReceiveEndpoint("coe-commands", e => { e.Handler <CancelaCoe>(c => c.Publish(new COECancelado(c.Message.Codigo))); e.Handler <ConcluiReservaCoe>(c => c.Publish(new PeriodoReservaCOEConcluido(c.Message.Codigo))); }); cfg.ReceiveEndpoint(ReservasQueues.StateMachine, e => { e.StateMachineSaga(new ReservaCOEStateMachine(), repository); }); }); bus.Start(); while (Console.ReadKey().KeyChar != 'q') { Console.WriteLine("Press q to continue"); } bus.Stop(); }
public async Task GivenAMongoDbSagaRepository_WhenSendingWithNullCorrelationId() { var context = new Mock <ConsumeContext <InitiateSimpleSaga> >(); context.Setup(x => x.CorrelationId).Returns(default(Guid?)); var repository = new MongoDbSagaRepository <SimpleSaga>(Mock.Of <IMongoDatabase>(), null); try { await repository.Send(context.Object, Mock.Of <ISagaPolicy <SimpleSaga, InitiateSimpleSaga> >(), Mock.Of <IPipe <SagaConsumeContext <SimpleSaga, InitiateSimpleSaga> > >()); } catch (SagaException exception) { _exception = exception; } }
public async Task GivenAMongoDbSagaRepository_WhenSendingAndInstanceNotFound() { _context = new Mock<ConsumeContext<InitiateSimpleSaga>>(); _context.Setup(x => x.CorrelationId).Returns(It.IsAny<Guid>()); _context.Setup(m => m.CancellationToken).Returns(It.IsAny<CancellationToken>()); _nullSimpleSaga = null; _policy = new Mock<ISagaPolicy<SimpleSaga, InitiateSimpleSaga>>(); _policy.Setup(x => x.PreInsertInstance(_context.Object, out _nullSimpleSaga)).Returns(false); _nextPipe = new Mock<IPipe<SagaConsumeContext<SimpleSaga, InitiateSimpleSaga>>>(); var repository = new MongoDbSagaRepository<SimpleSaga>(SagaRepository.Instance, null); await repository.Send(_context.Object, _policy.Object, _nextPipe.Object); }
public virtual void SetupContext() { var camelCasePack = new ConventionPack { new CamelCaseElementNameConvention() }; ConventionRegistry.Register("CamelCase", camelCasePack, type => true); _camelCaseConventionSet = true; var connectionString = AppConfig.MongoDB; _client = new MongoClient(connectionString); _database = _client.GetDatabase(_databaseName); _repo = new MongoDbSagaRepository(_database); _sagaPersister = new SagaPersister(_repo); }
public void GivenAMongoDbSagaRepository_WhenSendingAndInstanceNotFound() { _context = new Mock <ConsumeContext <InitiateSimpleSaga> >(); _context.Setup(x => x.CorrelationId).Returns(It.IsAny <Guid>()); _context.Setup(m => m.CancellationToken).Returns(It.IsAny <CancellationToken>()); _nullSimpleSaga = null; _policy = new Mock <ISagaPolicy <SimpleSaga, InitiateSimpleSaga> >(); _policy.Setup(x => x.PreInsertInstance(_context.Object, out _nullSimpleSaga)).Returns(false); _nextPipe = new Mock <IPipe <SagaConsumeContext <SimpleSaga, InitiateSimpleSaga> > >(); var repository = new MongoDbSagaRepository <SimpleSaga>(SagaRepository.Instance, null); TaskUtil.Await(() => repository.Send(_context.Object, _policy.Object, _nextPipe.Object)); }
public async Task GivenAMongoDbSagaRepository_WhenSendingWithNullCorrelationId() { var context = new Mock<ConsumeContext<InitiateSimpleSaga>>(); context.Setup(x => x.CorrelationId).Returns(default(Guid?)); var repository = new MongoDbSagaRepository<SimpleSaga>(Mock.Of<IMongoDatabase>(), null); try { await repository.Send(context.Object, Mock.Of<ISagaPolicy<SimpleSaga, InitiateSimpleSaga>>(), Mock.Of<IPipe<SagaConsumeContext<SimpleSaga, InitiateSimpleSaga>>>()); } catch (SagaException exception) { _exception = exception; } }
static void Main(string[] args) { var logger = new LoggerConfiguration() .MinimumLevel.Verbose() .WriteTo.ColoredConsole() .CreateLogger(); var repository = new MongoDbSagaRepository <SagaInstance>("mongodb://test-host", "TST"); var stateMachine = new TestStateMachine(); var bus = Bus.Factory.CreateUsingRabbitMq(cfg => { cfg.UseSerilog(logger); var host = cfg.Host(new Uri("rabbitmq://test-host"), h => { h.Username("test"); h.Password("test"); }); cfg.ReceiveEndpoint(host, "test_flow", e => { e.PrefetchCount = 8; e.UseRetry(Retry.Interval(5, 1000)); e.StateMachineSaga(stateMachine, repository); }); cfg.ReceiveEndpoint(host, "test_services", e => { e.Consumer <FastOperationConsumer>(); }); }); bus.Start(); Console.WriteLine("Press any key to stop tracker"); Console.ReadKey(); bus.Stop(); }
public void GivenAMongoDbSagaRepository_WhenSendingAndInstanceNotReturnedFromPolicy() { _correlationId = Guid.NewGuid(); _cancellationToken = new CancellationToken(); _context = new Mock<ConsumeContext<InitiateSimpleSaga>>(); _context.Setup(x => x.CorrelationId).Returns(_correlationId); _context.Setup(m => m.CancellationToken).Returns(_cancellationToken); _nullSimpleSaga = null; _policy = new Mock<ISagaPolicy<SimpleSaga, InitiateSimpleSaga>>(); _policy.Setup(x => x.PreInsertInstance(_context.Object, out _nullSimpleSaga)).Returns(false); _nextPipe = new Mock<IPipe<SagaConsumeContext<SimpleSaga, InitiateSimpleSaga>>>(); _simpleSaga = new SimpleSaga {CorrelationId = _correlationId}; _sagaConsumeContext = new Mock<SagaConsumeContext<SimpleSaga, InitiateSimpleSaga>>(); _sagaConsumeContext.Setup(x => x.CorrelationId).Returns(_correlationId); _sagaConsumeContextFactory = new Mock<IMongoDbSagaConsumeContextFactory>(); _sagaConsumeContextFactory.Setup( m => m.Create(It.IsAny<IMongoCollection<SimpleSaga>>(), _context.Object, It.Is<SimpleSaga>(x => x.CorrelationId == _correlationId), true)) .Returns(_sagaConsumeContext.Object); TaskUtil.Await(() => SagaRepository.InsertSaga(_simpleSaga)); var repository = new MongoDbSagaRepository<SimpleSaga>(SagaRepository.Instance, _sagaConsumeContextFactory.Object); TaskUtil.Await(() => repository.Send(_context.Object, _policy.Object, _nextPipe.Object)); }
public async Task GivenAMongoDbSagaRepository_WhenSendingAndPolicyReturnsInstance() { _correlationId = Guid.NewGuid(); _cancellationToken = new CancellationToken(); _context = new Mock<ConsumeContext<InitiateSimpleSaga>>(); _context.Setup(x => x.CorrelationId).Returns(_correlationId); _context.Setup(m => m.CancellationToken).Returns(_cancellationToken); _simpleSaga = new SimpleSaga {CorrelationId = _correlationId}; _policy = new Mock<ISagaPolicy<SimpleSaga, InitiateSimpleSaga>>(); _policy.Setup(x => x.PreInsertInstance(_context.Object, out _simpleSaga)).Returns(true); _nextPipe = new Mock<IPipe<SagaConsumeContext<SimpleSaga, InitiateSimpleSaga>>>(); _sagaConsumeContext = new Mock<SagaConsumeContext<SimpleSaga, InitiateSimpleSaga>>(); _sagaConsumeContext.Setup(x => x.CorrelationId).Returns(_correlationId); _sagaConsumeContextFactory = new Mock<IMongoDbSagaConsumeContextFactory>(); _sagaConsumeContextFactory.Setup(m => m.Create(It.IsAny<IMongoCollection<SimpleSaga>>(), _context.Object, _simpleSaga, true)).Returns( _sagaConsumeContext.Object); var repository = new MongoDbSagaRepository<SimpleSaga>(SagaRepository.Instance, _sagaConsumeContextFactory.Object); await repository.Send(_context.Object, _policy.Object, _nextPipe.Object); }