我在Azure网络应用程序中运行了两个Azure Web作业:
工作A的目的是根据两件事触发工作B:
#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);
}
}
}
答案 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
)。