private static void Main(string[] args) { HorseMq mq = HorseMqBuilder.Create() .AddClientHandler <ClientHandler>() .AddQueueEventHandler <QueueEventHandler>() .UseJustAllowDeliveryHandler() .Build(); var sampleMessageRouter = mq.AddRouter("SAMPLE-MESSAGE-ROUTER", RouteMethod.Distribute); var sampleMessageQueueBinding = new QueueBinding("sample-message-queue-binding", "SAMPLE-MESSAGE-QUEUE", 1, BindingInteraction.Response); var sampleMessageDirectBinding = new DirectBinding("sample-message-direct-binding", "@type:SAMPLE-MESSAGE-CONSUMER", 2, BindingInteraction.Response, RouteMethod.RoundRobin); sampleMessageRouter.AddBinding(sampleMessageQueueBinding); sampleMessageRouter.AddBinding(sampleMessageDirectBinding); var giveMeGuidRequestRouter = mq.AddRouter("GIVE-ME-REQUEST-ROUTER", RouteMethod.Distribute); var giveMeGuidRequestHandler = new DirectBinding("sample-message-direct-binding", "@name:GIVE-ME-GUID-REQUEST-HANDLER-CONSUMER", 2, BindingInteraction.Response); giveMeGuidRequestRouter.AddBinding(giveMeGuidRequestHandler); HorseServer server = new HorseServer(); server.UseHorseMq(mq); server.Run(15500); }
public int Start(int pingInterval = 3, int requestTimeout = 4) { Random rnd = new Random(); for (int i = 0; i < 50; i++) { try { int port = rnd.Next(5000, 65000); ServerOptions serverOptions = ServerOptions.CreateDefault(); serverOptions.Hosts[0].Port = port; serverOptions.PingInterval = pingInterval; serverOptions.RequestTimeout = requestTimeout; HorseServer server = new HorseServer(serverOptions); server.UseHorseMq(Server); server.Start(); Port = port; return(port); } catch { Thread.Sleep(2); } } return(0); }
static void Main(string[] args) { HorseMq mq = HorseMqBuilder.Create() .AddOptions(o => o.Status = QueueStatus.Push) .AddClientHandler <ClientHandler>() .AddQueueEventHandler <QueueEventHandler>() .AddPersistentQueues() .UsePersistentDeliveryHandler(DeleteWhen.AfterAcknowledgeReceived, ProducerAckDecision.AfterSaved) .Build(); mq.LoadPersistentQueues(); HorseServer server = new HorseServer(); server.UseHorseMq(mq); server.Run(26222); }
public async Task InPersistentHandler() { ConfigurationFactory.Destroy(); PersistentDeliveryHandler handler = null; HorseServer server = new HorseServer(); HorseMq mq = server.UseHorseMq(cfg => cfg .AddPersistentQueues(q => q.KeepLastBackup()) .UseDeliveryHandler(async builder => { DatabaseOptions options = new DatabaseOptions { Filename = "redelivery-test.tdb", InstantFlush = true, CreateBackupOnShrink = false, ShrinkInterval = TimeSpan.FromSeconds(60) }; handler = new PersistentDeliveryHandler(builder.Queue, options, DeleteWhen.AfterSend, ProducerAckDecision.None, true); await handler.Initialize(); return(handler); })); HorseQueue queue = await mq.CreateQueue("test"); HorseMessage message = new HorseMessage(MessageType.QueueMessage, "test"); message.SetMessageId("id"); message.SetStringContent("Hello, World!"); QueueMessage queueMessage = new QueueMessage(message); await handler.BeginSend(queue, queueMessage); List <KeyValuePair <string, int> > deliveries = handler.RedeliveryService.GetDeliveries(); Assert.Single(deliveries); Assert.Equal("id", deliveries[0].Key); Assert.Equal(1, deliveries[0].Value); string header = message.FindHeader(HorseHeaders.DELIVERY); Assert.Null(header); await handler.BeginSend(queue, queueMessage); deliveries = handler.RedeliveryService.GetDeliveries(); Assert.Single(deliveries); Assert.Equal("id", deliveries[0].Key); Assert.Equal(2, deliveries[0].Value); header = message.FindHeader(HorseHeaders.DELIVERY); Assert.NotNull(header); Assert.Equal(2, Convert.ToInt32(header)); queueMessage.MarkAsSent(); await handler.EndSend(queue, queueMessage); deliveries = handler.RedeliveryService.GetDeliveries(); Assert.Empty(deliveries); }
public async Task ReloadAfterRestart() { await Task.Delay(500); ConfigurationFactory.Destroy(); RedeliveryService service = new RedeliveryService("data/reload-test.tdb.delivery"); await service.Load(); await service.Clear(); await service.Set("id", 4); await service.Close(); if (System.IO.File.Exists("data/config.json")) { System.IO.File.Delete("data/config.json"); } if (System.IO.File.Exists("data/reload-test.tdb")) { System.IO.File.Delete("data/reload-test.tdb"); } if (System.IO.File.Exists("data/reload-test.tdb.delivery")) { System.IO.File.Delete("data/reload-test.tdb.delivery"); } HorseServer server = new HorseServer(); PersistentDeliveryHandler handler = null; Func <DeliveryHandlerBuilder, Task <IMessageDeliveryHandler> > fac = async builder => { DatabaseOptions options = new DatabaseOptions { Filename = "data/reload-test.tdb", InstantFlush = true, CreateBackupOnShrink = false, ShrinkInterval = TimeSpan.FromSeconds(60) }; handler = (PersistentDeliveryHandler)await builder.CreatePersistentDeliveryHandler(o => { return(new PersistentDeliveryHandler(builder.Queue, options, DeleteWhen.AfterSend, ProducerAckDecision.None, true)); }); return(handler); }; HorseMq mq = server.UseHorseMq(cfg => cfg .AddPersistentQueues(q => q.KeepLastBackup()) .UseDeliveryHandler(fac)); HorseQueue queue = await mq.CreateQueue("reload-test", o => o.Status = QueueStatus.Push); HorseMessage msg = new HorseMessage(MessageType.QueueMessage, "reload-test"); msg.SetMessageId("id"); msg.SetStringContent("Hello, World!"); await queue.Push(msg); QueueMessage queueMsg = queue.Messages.FirstOrDefault(); await handler.BeginSend(queue, queueMsg); await handler.RedeliveryService.Close(); ConfigurationFactory.Destroy(); mq = server.UseHorseMq(cfg => cfg .AddPersistentQueues(q => q.KeepLastBackup()) .UseDeliveryHandler(fac)); await mq.LoadPersistentQueues(); HorseQueue queue2 = mq.FindQueue("reload-test"); Assert.NotNull(queue2); Assert.NotEmpty(queue2.Messages); QueueMessage loadedMsg = queue2.Messages.FirstOrDefault(); Assert.NotNull(loadedMsg); Assert.Equal(1, loadedMsg.DeliveryCount); }