我正在尝试将邮件和错误队列移回其源自的队列。 为此,我在Error Queue上创建了一个Consumer,然后将其发布到Required Queue。 当我尝试这个时,一半的消费消息被发布但另一半被发送到Error_Skipped队列。
我尝试过许多事情都没有成功,所以我可能很遗憾。
以下是我的代码示例:
public class ClaimsMessage
{
public string Description { get; set; }
public DateTime Date { get; set; }
public bool Handled { get; set; }
}
public class ClaimsMessageErrorConsumer : IConsumer<Fault<ClaimsMessage>>
{
public async Task Consume(ConsumeContext<Fault<ClaimsMessage>> context)
{
try
{
await context.Publish<ClaimsMessage>(context.Message.Message);
}
catch (Exception e)
{
string error = e.Message;
}
}
}
public static IBusControl CreateClaimsErrorConsumerBus(string endPoint)
{
var busControl = Bus.Factory.CreateUsingRabbitMq(cfg =>
{
var host = cfg.Host(new Uri("rabbitmq://localhost/"), h =>
{
h.Username("guest");
h.Password("guest");
});
cfg.ReceiveEndpoint(host, endPoint, e =>
{
e.Consumer(() => new ClaimsMessageErrorConsumer());
});
});
return busControl;
}
答案 0 :(得分:1)
如果要将消息从错误队列移回处理队列,则不应调用Publish
- 这会将消息重新发送给所有订阅者。您已经知道队列名称,因此将消息直接发送回队列。您所看到的是您在错误队列中创建了一个使用者,该队列为该消息创建了一个交换绑定。
所以,请改为:
sbc.ReceiveEndpoint("input_error", x =>
{
// this prevents extra message bindings from being created
x.BindMessageExchanges = false;
x.Consumer<MyMover>(() => new MyMover(inputQueueAddress);
});
public class MyMover :
IConsumer<ClaimsMessage>
{
public async Task Consume(ConsumeContext<ClaimsMessage> context)
{
try
{
var endpoint = await context.GetSendEndpoint(_inputQueueAddress);
await endpoint.Send<ClaimsMessage>(context.Message);
}
catch (Exception e)
{
string error = e.Message;
}
}
}
要获得额外信用,请复制原始邮件标题,以便保留邮件的保真度。