Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# RabbitMQ消息在没有订阅者的情况下保持活动多长时间?_C#_Rabbitmq_Masstransit - Fatal编程技术网

C# RabbitMQ消息在没有订阅者的情况下保持活动多长时间?

C# RabbitMQ消息在没有订阅者的情况下保持活动多长时间?,c#,rabbitmq,masstransit,C#,Rabbitmq,Masstransit,我正在使用MassTransit和RabbitMQ创建一个简单的发布者/订阅者。 发布服务器具有以下代码来初始化总线: /** create the bus */ var bus = Bus.Factory.CreateUsingRabbitMq(cfg => { var host = cfg.Host(new Uri("rabbitmq://localhost/"), h => { h.Username("guest"); h.Pas

我正在使用MassTransit和RabbitMQ创建一个简单的发布者/订阅者。 发布服务器具有以下代码来初始化总线:

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

/** start the bus and publish */
bus.Start();
bus.Publish<IPersonLogin>(new {FirstName = "John", LastName = "Smith"});
/**创建总线*/
var bus=bus.Factory.CreateUsingRabbitMq(cfg=>
{
var host=cfg.host(新Uri(“rabbitmq://localhost/,h=>
{
h、 用户名(“客人”);
h、 密码(“客人”);
});
});
/**启动总线并发布*/
bus.Start();
发布(新的{FirstName=“John”,LastName=“Smith”});
并且订户具有以下初始化代码:

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

    cfg.ReceiveEndpoint(host, "person_login", e =>
    {
        e.Consumer<PersonLoginConsumer>();
    });
});
var bus=bus.Factory.CreateUsingRabbitMq(cfg=>
{
var host=cfg.host(新Uri(“rabbitmq://localhost/,h=>
{
h、 用户名(“客人”);
h、 密码(“客人”);
});
ReceiveEndpoint(主机,“个人登录”,e=>
{
e、 消费者();
});
});
如果我关闭订阅服务器并发布2条消息,消息不会丢失,一旦订阅服务器恢复正常,消息就会被处理

因此,我的问题是:

  • 如何确保消息在一个订阅者出现并接收消息之前一直留在RabbitMQ队列中
  • 如果服务器正在重新启动,而某些消息没有被任何订阅者处理,会发生什么情况?这些消息是丢失了还是在重新启动后订阅者恢复活动后立即被处理
  • 这是确保处理每一条消息的正确模式还是我应该使用不同的策略
  • 最重要的是

  • 如果没有订阅者,RabbitMQ将不知道消息应该传递到哪个队列。然后消息将无法传递。(不确定这是否将移动到错误队列或跳过)
  • 如果交易所已经存在,它将被放置在已订阅活动的消费者队列中。因此,您的终端托管您的消费者可以关闭,消息仍将被传递
  • 当消息传递到队列时,消费者将拾取您的消息并对其进行处理。如果在处理消息时发生异常,它将被移动到endpoint_错误队列。(取决于您的RetryPolicy)。部署一个补丁并将消息移回主队列,消息将被处理,就好像什么都没有发生一样
  • 关于common gotcha的常见问题,请阅读


      • 默认情况下,队列中的任何消息都将保留在队列中,直到发生以下三种情况之一:

      • 消息已被使用
      • 消息“生存时间”过期(默认为永远生存)
      • 服务器崩溃或重新启动
      • 如果您有一个充满消息的队列,消息通常会一直存在,直到发生这三种情况之一。希望你能尽快让你的消费者在线,这样你就可以使用这些信息并对其进行处理

        如果您希望消息在一段时间后自动删除(假设消息未首先被消费),则只需设置生存时间(ttl)


        对于崩溃。。。如果将消息持久化到磁盘,则消息可以在崩溃/重新启动后存活。但是,如果在消息从exchange路由到队列之前服务器崩溃,消息仍有可能丢失。

        感谢您的回答,我认为它与RabbitMQ的关系比MassTransit更密切,MassTransit只是我的Transporteries,但MassTransit创建了您的交换和队列。不交换消息不将消息路由到队列。没有消息路由,没有消息处理。这正是我要找的@derick