重复的消息Masstransit rabbitmq

时间:2017-03-31 11:05:42

标签: masstransit

我正在尝试为我的应用程序实现心跳功能,因此尝试从masstransit rabbitmq实现重复出现的消息功能。我试图在masstransit的网站上给出的样本上实现它。这是所有代码。

namespace MasstransitBasicSample
{
    using System;
    using System.Threading.Tasks;
    using MassTransit;
    using MassTransit.Scheduling;

    class Program
    {
        static void Main(string[] args)
        {
            var bus = Bus.Factory.CreateUsingRabbitMq(sbc =>
            {
                var host = sbc.Host(new Uri("rabbitmq://localhost"), h =>
                {
                    h.Username("guest");
                    h.Password("guest");
                });

                sbc.UseMessageScheduler(new Uri("rabbitmq://localhost/quartz"));

                sbc.ReceiveEndpoint(host, "test_queue", ep =>
                {
                    ep.Handler<YourMessage>(context =>
                    {
                        return Console.Out.WriteLineAsync($"Received: {context.Message.Text}");
                    });
                    ep.Handler<PollExternalSystem>(context =>
                    {
                        return Console.Out.WriteLineAsync($"Received: {context.Message}");
                    });
                });
            });

            bus.Start();
            SetRecurring(bus);

            Console.WriteLine("Press any key to exit");
            Console.ReadKey();

            bus.Stop();
        }

        private static async Task SetRecurring(IBusControl bus)
        {
            var schedulerEndpoint = await bus.GetSendEndpoint(new Uri("rabbitmq://localhost/quartz"));

            var scheduledRecurringMessage = await schedulerEndpoint.ScheduleRecurringSend(
               new Uri("rabbitmq://localhost/test_queue"), new PollExternalSystemSchedule(), new PollExternalSystem());
        }
    }

    public class YourMessage { public string Text { get; set; } }

    public class PollExternalSystemSchedule : DefaultRecurringSchedule
    {
        public PollExternalSystemSchedule()
        {
            CronExpression = "* * * * *"; // this means every minute
        }
    }

    public class PollExternalSystem { }
}

我在我的rabbitmq队列中创建了一个名为quartz的队列。

当我运行应用程序时,它会向石英队列发送一条消息,该消息只停留在那里,它不会进入测试队列。

我还希望在基于cron表达式的一分钟之后将另一条消息发送到石英队列,这也不会发生。

我的设置错了吗?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

您需要运行侦听rabbitmq://localhost/quartz的调度服务,以便发送邮件。

documentation page说:

  

有一个独立的MassTransit服务,MassTransit.QuartzService,   可以在服务器上安装和使用它。它是   通过App.config文件配置,是一个很好的例子   构建一个独立的MassTransit服务。

或者,您可以通过使用内存调度described here在同一进程中托管Quartz调度,方法如下:

var busControl = Bus.Factory.CreateUsingRabbitMq(cfg =>
{
    var host = cfg.Host(new Uri("rabbitmq://localhost/"), h =>
    {
        h.Username("guest");
        h.Password("guest");
    });

    cfg.UseInMemoryScheduler();
});