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)?
[ „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