【问题标题】:How to cancel a queue triggered Azure WebJob programatically如何以编程方式取消队列触发的 Azure WebJob
【发布时间】:2018-11-23 17:49:36
【问题描述】:

我已经部署了一个连续的 Azure WebJob,其中包含一个从队列消息触发的过程。

public Task Automation([QueueTrigger("automqueue")] string message, TextWriter log, CancellationToken token)
{
     ....
}

该过程包含一个CancellationToken,从系统中用于graceful shutdown

当用户想要取消进程时,是否有任何编程方式来触发此CancellationToken

我的自动化需要分配资源才能完成,有时可能需要几个小时才能完成。这就是用户可能想要取消该进程并开始另一个进程的原因。

我可以使用我已经拥有的CancellationToken 或者我需要实施自定义解决方案吗?

【问题讨论】:

    标签: azure azure-webjobs cancellation-token


    【解决方案1】:

    CancelationToken仅用于关闭通知,在所有Process实例之间共享,不能用于其他原因。

    它仅供阅读,您无法手动更改它,所以也许您可以创建一个新的CancellationTokenSource并将令牌组合成一个令牌,如果任何令牌被取消,它将被取消。

    这是我的代码。

    public static void ProcessQueueMessage(
                [QueueTrigger("queue2")] string message,
                ILogger logger, CancellationToken token
                )
            {
    
                CancellationTokenSource tokenSource = new CancellationTokenSource();
                string flag;
                CancellationTokenSource compositeTokenSource =
                      CancellationTokenSource.CreateLinkedTokenSource(
                      tokenSource.Token, token);
    
                if (message.Equals("shutdown"))
                {
                    logger.LogInformation(message);
                    tokenSource.Cancel();
                    flag = compositeTokenSource.Token.IsCancellationRequested.ToString();
                    logger.LogInformation(flag);
                }
                else {
                    logger.LogInformation(message);
                    flag = compositeTokenSource.Token.IsCancellationRequested.ToString();
                    logger.LogInformation(flag);
                }
            }
    

    如果消息等于“shutdown”,将执行方法Cancel()。那么复合token的属性IsCancellationRequested就是true

    希望对您有所帮助,如果您仍有疑问,请告诉我。

    【讨论】:

    • 我想向正在运行的进程发送CancellationToken,此示例使用带有新消息的队列。
    • @Menelaos Vergis 我明白你的意思,你想将 CancellationToken 更改为 true ,但只能读取 Token。所以我尝试使用compositeTokenSource 来实现它。如果你不想让它关机,你必须要正常运行。这就是我使用消息的原因,您也可以通过其他方式实现它。
    • 感谢您的见解,我现在明白这个CancelationToken 仅用于关闭通知,在所有流程实例之间共享,不能用于其他原因。请在您的答案中添加此信息,以便我将其标记为解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 2015-09-26
    • 1970-01-01
    相关资源
    最近更新 更多