有没有办法暂停连续的webjob - 停止从服务总线接收消息的时间间隔? 我有一个不断接收帖子数据的系统。然后将发布的数据发送到服务总线。我想知道是否有办法停止处理消息。当然,另一种解决方案是不发送这些消息 - 将它们保存在发送方系统的队列中。
答案 0 :(得分:1)
您可以通过在应用程序设置中将WEBJOBS_STOPPED设置为1来停止webjob。这有点粗糙,但它会阻止webjob。
答案 1 :(得分:1)
您已经拥有排队机制......服务总线。听起来您使用ServiceBusTrigger属性以声明方式连接到队列。即
public static void ProcessQueueMessage([QueueTrigger("queue")] string message, TextWriter log)
但这不是在连续的webjob中接收消息的唯一方法。您可以使用QueueClient对象轻松地接收这些消息:
var connectionString = "//connection string here//";
var queueName = "samplequeue";
var client = QueueClient.CreateFromConnectionString(cnStr, queueName);
client.OnMessage(message =>
{
string msg = message.GetBody<string>();
// Process message here...
});
Console.ReadLine();
(有关详细信息,请参阅https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-dotnet-get-started-with-queues。)
因此,在您的webjob中,您可以收听两条总线:第一条是您已用于处理业务消息的运营总线。新主题是控制总线。它总是在监听,但是当您希望更改操作队列的行为时,您只会向其发送消息。
所以你将“START”发送到控制总线。收到该消息将调用上面的代码并使操作总线开始处理消息。
如果要停止处理,请将“STOP”发送到控制总线。收到此消息后,请在运营总线上呼叫client.Close();
。这会暂停处理消息,直到收到下一个“START”消息。
当然,您可以对此进行扩展。例如,您可以将“PAUSE 10 MINUTES”发送到控制总线,这可能会停止运行总线,然后设置计时器以在10分钟后重新启动它。你只受想象力的限制!
就个人而言,我可能会使用Json消息而不是纯文本,但不管你需要什么。