我正在使用下面的代码(和RabbitMQ)连接发布观察者。当RabbitMQ运行时,它运行良好 - 我可以在PostPublish和PrePublish上看到控制台消息。
但是,当我停止RabbitMQ并发布时,PublishFault会运行一次,但是当RabbitMQ保持停止状态时再也不会。
如果发布失败,我试图将消息持久保存到另一个数据存储区(以及日志和错误) - 我认为PublishFault方法最适合这样做。如果仅检测到第一个故障,则这不起作用。
预计会出现这种情况吗?是否有更好的方法来实现失败的消息持久性。
PS ......一旦我再次启动RabbitMQ,我就会看到所有的PrePublish和PostPublish调试消息,以查找失败的消息。我认为,这是可以预期的。
using MassTransit;
using MassTransit.Pipeline;
using System;
using System.Threading.Tasks;
namespace Mtt.Publisher
{
class Program
{
static void Main(string[] args)
{
IBusControl busControl = Bus.Factory.CreateUsingRabbitMq(sbc =>
{
var host = sbc.Host(new Uri("rabbitmq://localhost"), h =>
{
h.Username("user");
h.Password("pass");
});
sbc.UseRetry(Retry.Immediate(5));
});
busControl.Start();
busControl.ConnectPublishObserver(new PublishObserver());
var input = "";
while (input != "exit")
{
input = Console.ReadLine();
busControl.Publish<Test>(new TestMessage());
}
busControl.Stop();
}
}
public interface Test { }
public class TestMessage : Test { }
public class PublishObserver : IPublishObserver
{
public async Task PostPublish<T>(MassTransit.PublishContext<T> context) where T : class
{
Console.WriteLine("--- POST PUBLISH ----");
}
public async Task PrePublish<T>(MassTransit.PublishContext<T> context) where T : class
{
Console.WriteLine("**** PRE PUBLISH ****");
}
public async Task PublishFault<T>(MassTransit.PublishContext<T> context, Exception exception) where T : class
{
Console.WriteLine("%%%%%% EXCEPTION %%%%%%%");
}
}
}