I am trying to create an Azure WebJob to send a BrokeredMessage
to an Azure ServiceBus Topic, the actual act of creating and sending the message is trivial however I have been unable to find a way to automate the creation of the Scheduled WebJob.
The automated workflow should work as follows:
The Azure Management Portal provides a nice UI for this functionality, which under the covers creates an Azure WebJob in the selected WebSite, an Azure Scheduler Job Collection and an Azure Scheduler Job:
There doesn't appear to be an analogous mechanism for creating a scheduled Azure WebJob with the Azure Service Management PowerShell Module. It is certainly possible to create new WebJobs, Azure Scheduler Collections and Jobs - however I have no idea what URL or Storage Queue the Azure Scheduler is posting to to schedule Azure WebJobs.
There is a close relationship between Azure Scheduler and Azure WebJobs. Specifically Azure WebJobs does not have any internal support for scheduling, WebJobs relies on the Azure Scheduler to call into the *.scm.azurewebsites.net
website.
As such it is possible to use PowerShell cmdlets for these services to setup Azure WebJobs to be triggered on schedule using Azure Scheduler.
$location = "North Europe";
$site = New-AzureWebsite -Location $location `
-Name "amido-test-website";
$job = New-AzureWebsiteJob -Name $site.Name `
-JobName "amido-test-job" `
-JobType Triggered `
-JobFile ~\Desktop\test.zip;
$jobCollection = New-AzureSchedulerJobCollection `
-Location $location `
-JobCollectionName "amido-test-job-collection";
$authPair = "$($site.PublishingUsername):$($site.PublishingPassword)";
$pairBytes = [System.Text.Encoding]::UTF8.GetBytes($authPair);
$encodedPair = [System.Convert]::ToBase64String($pairBytes);
New-AzureSchedulerHttpJob `
-JobCollectionName $jobCollection[0].JobCollectionName `
-JobName "test" `
-Method POST `
-URI "$($job.Url)\run" `
-Location $location `
-StartTime "2014-01-01" `
-Interval 1 `
-Frequency Minute `
-EndTime "2015-01-01" `
-Headers @{ `
"Content-Type" = "text/plain"; `
"Authorization" = "Basic $encodedPair"; `
};
It's a little long winded so in plain english the above script does the following:
Hope this saves a few other developers from scratching their head trying to figure this one out.