我可以查询Azure Web作业队列吗?

时间:2018-05-09 15:15:55

标签: c# azure azure-webjobs azure-webjobs-continuous azure-webjobs-triggered

我在Azure网络应用程序中运行了两个Azure Web作业:

  • 工作A - 持续运行
  • 工作B - 已触发

工作A的目的是根据两件事触发工作B:

  1. 过去一小时内没有为指定的帐号运行作业B(作为作业A的参数传入作业B。
  2. 从数据库确定的其他一些业务逻辑
  3. #2很容易。我有一个问题是#1。 作业A是否可以查询Web作业队列以查看作业B是否已执行?

    这是工作B(已触发):

    public class Functions
    {
        public static void ProcessQueueMessage([QueueTrigger("triggeredqueue")] string message, TextWriter log)
        {
            var accountId = message;
            //DO STUFF WITH accountId HERE...
        }
     }
    

    这是Job A(连续运行)。我在评论中添加了代码,以显示我喜欢的内容:

    class Program
    {
        static void Main()
        {
            while (true)
            {
                var accounts = getAccounts();
                foreach (var account in accounts) {
                    if (testOtherBusinessLogic(account)) {
                        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConnectionStringHelper.StorageConnectionString);
                        CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();
                        CloudQueue queue = queueClient.GetQueueReference("triggeredqueue");
                        queue.CreateIfNotExists();
                        //THIS IS WHAT IT IS DOING NOW:
                        CloudQueueMessage message = new CloudQueueMessage(account.AccountId);
                        queue.AddMessage(message);
                        //THIS IS WHAT I WOULD LIKE IT TO DO:
                        /* 
                        if (!queue.Any(x => x.RunDate > (DateTime.Now.AddMinutes(-60)) && x.Message == account.AccountId.ToString()) {                          
                            CloudQueueMessage message = new CloudQueueMessage(account.AccountId);
                            queue.AddMessage(message);
                        }
                        */
                    }
                }
                System.Threading.Thread.Sleep(7000);
            }
        }
    }
    

1 个答案:

答案 0 :(得分:2)

Azure存储队列不支持查询操作。请注意,一旦您的queuetrigger运行,触发它的消息将在队列中不久。此外,您的JobB还应该持续运行以监听队列中的更改。

我建议您使用表存储来存储执行日期。试试下面的代码。

// Add table entity class in JobA Program class and JobB Functions class
class MyEntity : TableEntity
{
    public DateTime ExecutionTime { get; set; }
}


//In JobA, achieve what you would like to do 
 var accountId = account.AccountId;
 CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
 CloudTable table = tableClient.GetTableReference("execution");
 table.CreateIfNotExists();

 // table entity use combination of partionkey and rowkey as entity identifier, so I set both of them to accountId
 TableOperation retriveOperation = TableOperation.Retrieve<MyEntity>(accountId, accountId);

 MyEntity retriveEntity = (MyEntity)table.Execute(retriveOperation).Result;

 if (retriveEntity != null)
 {
     if (retriveEntity.ExecutionTime> DateTime.UtcNow.AddMinutes(-60))
     {
         CloudQueueMessage message = new CloudQueueMessage(accountId);
         queue.AddMessage(message);
     }
 }else
 {
     CloudQueueMessage message = new CloudQueueMessage(accountId);
     queue.AddMessage(message);
 }


 //In JobB, add operations to store execution time after business logic 
 //Connection operations omitted, please add by yourself.
 CloudTable table = tableClient.GetTableReference("execution");
 table.CreateIfNotExists();
 TableOperation retriveOperation = TableOperation.Retrieve<MyEntity>(accountId, accountId);
 MyEntity retriveEntity = (MyEntity)table.Execute(retriveOperation).Result;

 if (retriveEntity != null)
 {
      retriveEntity.ExecutionTime = DateTime.UtcNow;
      TableOperation updateOperation = TableOperation.Replace(retriveEntity);
      table.Execute(updateOperation);
 }
 else
 {
      retriveEntity = new MyEntity
      {
           ExecutionTime = DateTime.UtcNow,
           PartitionKey = accountId,
           RowKey = accountId
       };
      TableOperation insertOperation = TableOperation.Insert(retriveEntity);
      table.Execute(insertOperation);
 }

最后一个建议,似乎没有必要使用queuetrigger,您只能使用JobA来实现您的目标(直接在JobA中DO STUFF WITH accountId)。