我正在尝试为我的应用程序实现心跳功能,因此尝试从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表达式的一分钟之后将另一条消息发送到石英队列,这也不会发生。
我的设置错了吗?
非常感谢任何帮助。
答案 0 :(得分:1)
您需要运行侦听rabbitmq://localhost/quartz
的调度服务,以便发送邮件。
有一个独立的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();
});