2017-03-09 3 views
0

Ich habe einen Code, der rabbitMQ verwendet, um Joblisten im Zeitverlauf zu verwalten. Als solche habe ich eine Verbindung und einen Kanal für den RabbitMQ Server geöffnet, um Operationen mit diesen Jobs zu machen. I Warteschlange Jobs mit dem folgenden:RabbitMQ-Client (DotNet Core) verhindert das Schließen der Anwendung

public override void QueueJob(string qid, string jobId) { 
     this.VerifyReadyToGo(); 

     this.CreateQueue(qid); 
     byte[] messageBody = Encoding.UTF8.GetBytes(jobId); 
     this.channel.BasicPublish(
      exchange: Exchange, 
      routingKey: qid, 
      body: messageBody, 
      basicProperties: null 
     ); 
     OLog.Debug($"Queued job {jobId} on {qid}"); 
    } 

    public override string RetrieveJobID(string qid) { 
     this.VerifyReadyToGo(); 

     this.CreateQueue(qid); 

     BasicGetResult data = this.channel.BasicGet(qid, false); 
     string jobData = Encoding.UTF8.GetString(data.Body); 

     int addCount = 0; 
     while (!this.jobWaitingAck.TryAdd(jobData, data.DeliveryTag)) { 
      // try again. 
      Thread.Sleep(10); 
      if (addCount++ > 2) { 
       throw new JobReceptionException("Failed to add job to waiting ack list."); 
      } 
     } 
     OLog.Debug($"Found job {jobData} on queue {qid} with ackId {data.DeliveryTag}"); 
     return jobData; 
    } 

Das Problem ist, dass nach jedem Methodenaufruf so (veröffentlichen, bekommen, oder Acknowledge) schafft eine Art von Hintergrund-Thread, der nicht schließt, wenn der Kanal und die Verbindung geschlossen sind. Dies bedeutet, dass Tests bestanden werden und die Vorgänge erfolgreich abgeschlossen werden, aber wenn die Anwendung versucht, sie zu schließen, hängt sie und wird nie beendet. Hier

ist die connect-Methode Referenz

public override void Connect() { 
     if (this.Connected) { 
      return; 
     } 
     this.factory = new ConnectionFactory { 
      HostName = this.config.Hostname, 
      Password = this.config.Password, 
      UserName = this.config.Username, 
      Port = this.config.Port, 
      VirtualHost = VirtualHost 
     }; 
     this.connection = this.factory.CreateConnection(); 
     this.channel = this.connection.CreateModel(); 
     this.channel.ExchangeDeclare(
      exchange: Exchange, 
      type: "direct", 
      durable: true 
     ); 
    } 

Was kann ich tun, um dieses Problem zu beheben (rabbitmq Client verhindert Anwendung am Austreten aus)?

Antwort

0

Ich habe keine Ahnung, warum, aber diese Änderung auf die Connect-Methode macht den Unterschied:

public override void Connect() { 
     if (this.Connected) { 
      return; 
     } 
     this.factory = new ConnectionFactory { 
      HostName = this.config.Hostname, 
      Password = this.config.Password, 
      UserName = this.config.Username, 
      Port = this.config.Port, 
      UseBackgroundThreadsForIO = true 
     }; 
     this.connection = this.factory.CreateConnection(); 
     this.channel = this.connection.CreateModel(); 
     this.channel.ExchangeDeclare(
      exchange: Exchange, 
      type: "direct", 
      durable: true 
     ); 
    } 
+0

[ „a. Hintergrund-Thread nicht die verwaltete Ausführungsumgebung weiterlaufen“] (https://msdn.microsoft .com/de-de/library/h339syd0 (v = vs.110) .aspx). Wäre nicht zu ratlos, das macht Ihre "UseBackgroundThreadsForIO" Änderung jetzt;) – Tung

Verwandte Themen