我正在使用带有MSMQ的MassTransit版本2.9.2。
我正在测试错误处理,我希望进程尝试发送我的消息5次,然后将消息放在错误队列中。
该消息正在重试5次,但随后就消失了。任何人都可以解释为什么邮件没有被发送到错误队列。
我的消费者:
public class OrderConsumer : Consumes<SAPOrder>.Context
{
public ISapServiceRepository SapServiceRepository { get; set; }
public void Consume(IConsumeContext<SAPOrder> message)
{
try
{
// Send the message to SAP
this.SapServiceRepository.SendOrder(message.Message);
}
catch (Exception ex)
{
throw;
}
}
}
我正在使用AutoFac注册服务总线和消费者。
protected override void Load(ContainerBuilder builder)
{
builder.Register(c => ServiceBusFactory.New(sbc =>
{
// other configuration options
sbc.UseMsmq(
configurator => configurator.VerifyMsmqConfiguration());
sbc.UseXmlSerializer();
sbc.ReceiveFrom("msmq://localhost/orders");
sbc.Subscribe(x => x.LoadFrom(c.Resolve<ILifetimeScope>()));
sbc.EnableMessageTracing();
sbc.UseLog4Net();
})).As<IServiceBus>()
.SingleInstance();
if (this.registerConsumers)
{
builder.RegisterAssemblyTypes(this.GetType().Assembly)
.Where(t => t.Implements<IConsumer>())
.PropertiesAutowired(PropertyWiringOptions.AllowCircularDependencies)
.AsSelf();
builder.RegisterType<SapServiceRepository>()
.As<ISapServiceRepository>()
.InstancePerLifetimeScope()
.WithProperty("Username", "xxxxxxxxxxxx")
.WithProperty("Password", "xxxxxxxxxxxx")
.WithProperty("CountryId", "xxxxxxxxxxx")
.WithProperty("UseRequestLogging", true)
.PropertiesAutowired(
PropertyWiringOptions.PreserveSetValues | PropertyWiringOptions.AllowCircularDependencies);
}
}
由于
答案 0 :(得分:0)
是否存在阻止创建_error队列的权限问题?队列是否显示在消息队列MMC窗格中?正如您所期望的那样,该消息应在五次失败后最终出现在错误队列中。还有一些单元测试可以验证这一点。是从错误队列中读取可能消耗该消息的东西吗?
答案 1 :(得分:0)
已创建错误队列。
我不认为从错误队列中读取任何内容,因为我已经发布了原始消息,我为Fault创建了一个新的消费者。一旦尝试了5次重试,就会调用它。
在故障消费者中,我收到原始失败的消息,然后可以使用代码转发到错误队列
public class OrderFaultConsumer : Consumes<Fault<SAPOrder>>.Context
{
public ILog Logger { get; set; }
public void Consume(IConsumeContext<Fault<SAPOrder>> message)
{
// need to send to the error queue
var errorQueue = message.Bus.GetEndpoint(message.Endpoint.ErrorTransport.Address.Uri);
errorQueue.Send(message.Message.FailedMessage);
}
}
然后在错误队列中可以看到该消息。
这一切似乎都有效,但在我看来是一个黑客攻击!
只是要指出我没有使用Multicast或订阅服务。将消息添加到队列的代码是执行发送而不是发布。