[英]MassTransit: Creating a callback queue in consumer
MassTransit的新手,仍在使用一些教程項目。 我將要運行大約20分鍾的服務,完成后我需要做一些事情。 因為可能要花很長時間,所以我不想遵循請求/響應模式並等待響應,而又不想拖延線程。 我認為我的另一個選擇是創建另一個隊列,供消費者在工作完成時發布到該隊列。 我看了這篇文章: MassTransit3如何從消費者發出請求 ,但是我不確定如何實現這一點。 同樣來自本教程的我的項目如下所示:
出版商:
static void Main(string[] args)
{
var bus = Bus.Factory.CreateUsingRabbitMq(x =>
x.Host(new Uri("rabbitmq://localhost/"), h => {}));
var busHandle = bus.Start();
var text = ""'
Console.WriteLine("Publisher");
while(text != "quit")
{
Console.Write("Enter a message: ");
text = Console.ReadLine();
var message = new SomethingHappenedMessage()
{
What = text,
When = DateTime.Now
}
bus.Publish(message);
}
busHandle.Stop();
}
訂戶:
static void Main(string[] args)
{
var bus = Bus.Factory.CreateUsingRabbitMq(x =>
{
var host = x.Host(new Uri("rabbitmq://localhost"), h => {});
x.ReceiveEndpoint(host, "MtPubSubExample_TestSubscriber", e =>
e.Consumer<SomethingHappenedConsumer>());
});
Console.WriteLine("Subscriber");
var busHandle = bus.Start();
Console.ReadKey();
busHandle.Stop();
}
消費者:
class SomethingHappenedConsumer : IConsumer<ISomethingHappened>
{
public Task Consume(ConsumeContext<ISomethingHappened> context)
{
Console.Write("TXT: " + context.Message.What);
Console.Write(" SENT: " + context.Message.When);
Console.Write(" PROCESSED: " + DateTime.Now);
Console.WriteLine(" (" + System.Threading.Thread.CurrentThread.ManagedThreadId + ")");
return Task.FromResult(0);
}
}
我將如何在使用者中創建回調隊列?
在您的使用者中,只需Bus.Publish(new ResponseMessage());
(或您所說的回應),並要求發布者為該消息類型注冊使用者。 您的發布者似乎沒有綁定到隊列,只是組成隊列名稱並將其也綁定到隊列。
再次感謝@Travis的幫助。 只是想展示我最終為將來的任何人使用的最終代碼。 該消息看起來很有趣,但是它已正確地發回到了發布者。
出版商:
static void Main(string[] args)
{
var bus = Bus.Factory.CreateUsingRabbitMq(x =>
{
var host = x.Host(new Uri("rabbitmq://localhost/"), h => { });
x.ReceiveEndpoint(host, "MtPubSubExample_TestPublisher", e =>
e.Consumer<ResponseConsumer>());
});
var busHandle = bus.Start();
var text = "";
Console.WriteLine("Publisher");
while(text != "quit")
{
Console.Write("Enter a message: ");
text = Console.ReadLine();
var message = new SomethingHappenedMessage()
{
What = text,
When = DateTime.Now
};
bus.Publish(message);
}
busHandle.Stop();
}
響應消費者:
class ResponseConsumer : IConsumer<IResponse>
{
public Task Consume(ConsumeContext<IResponse> context)
{
Console.WriteLine("RESPONSE MESSAGE: " + context.Message.Message);
return Task.FromResult(0);
}
}
訂戶:
static void Main(string[] args)
{
var bus = Bus.Factory.CreateUsingRabbitMq(x =>
{
var host = x.Host(new Uri("rabbitmq://localhost/"), h => { });
x.ReceiveEndpoint(host, "MtPubSubExample_TestSubscriber", e =>
e.Consumer<SomethingHappenedConsumer>());
});
Console.WriteLine("Subscriber");
var busHandle = bus.Start();
Console.ReadKey();
busHandle.Stop();
}
訂戶消費者:
class SomethingHappenedConsumer : IConsumer<ISomethingHappened>
{
private IBusControl bus = Bus.Factory.CreateUsingRabbitMq(x =>
x.Host(new Uri("rabbitmq://localhost/"), h => { }));
public Task Consume(ConsumeContext<ISomethingHappened> context)
{
var now = DateTime.Now;
Console.Write("TXT: " + context.Message.What);
Console.Write(" SENT: " + context.Message.When);
Console.Write(" PROCESSED: " + now);
Console.WriteLine(" (" + System.Threading.Thread.CurrentThread.ManagedThreadId + ")");
var response = new ResponseMessage()
{
Message = "The request was processed at " + now
};
bus.Publish(response);
return Task.FromResult(0);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.