我试图从RabbitMQ获取一条消息,并异步执行并等待消息。当从Console应用程序调用下面的方法时,它可以工作。但是当试图从MVC控制器调用这个方法时,我会被tsc.Task卡住。使用RabbitMQ UI,我知道队列中有一条消息要消费。
public async Task<string> WaitForMessage(string queueName)
{
channel.QueueDeclare(queue: queueName,
durable: true,
exclusive: false,
autoDelete: false,
arguments: null);
var consumer = new AsyncEventingBasicConsumer(channel);
var tag = channel.BasicConsume(queueName, false, consumer);
var tcs = new TaskCompletionSource<string>();
consumer.Received += async (sender, eventArgs) =>
{
string message = Encoding.UTF8.GetString(eventArgs.Body.ToArray());
await Task.Yield();
channel.BasicAck(eventArgs.DeliveryTag, false);
tcs.SetResult(message);
};
string result = await tcs.Task; //.ConfigureAwait(false);
return result;
}
我在两个应用程序中以相同的方式初始化rabbit MQ。当检查RabbitMQ的UI时,我可以看到连接是从MVC应用程序创建的。当设置BasicConsume时,我看到队列中不再有任何消息就绪,并且消息是Unacknowledged。当终止应用程序时,队列中的消息将再次获取状态就绪,并且不再是未确认的。
我使用的是RabbitMQ Client v6.4.0
1条答案
按热度按时间2sbarzqh1#
我有冲突的System.Memory版本,所以在返回到我的received-method时触发了错误。
我通过添加捕获异常的channel.CallbackException发现了这一点。