Отправляйте сообщения в очередь хранилища Azure параллельно из PowerShel - PullRequest
0 голосов
/ 04 ноября 2018

Как вы отправляете сообщения в очередь параллельно?

Я пробовал это:

$queue = Get-AzureStorageQueue -Name 'itemsqueue' -Context $context
1..100 | % {
    $msgContent = "This is message $_"

    Start-Job {
        $queue.CloudQueue.AddMessage($msgContent)
    }
}

Get-Job | Receive-Job

но $ queue равен нулю. Я также попытался передать его как параметр ($ queue), тоже не сработало.

Есть идеи без необходимости выполнять Get-AzureStorageQueue в каждой работе?

Спасибо!

1 Ответ

0 голосов
/ 06 ноября 2018

Фоновые задания построены поверх удаленного взаимодействия PowerShell и, таким образом, выполняют аналогичные действия при передаче объектов вокруг.

Они будут сериализовывать / десериализовать их, а не передавать их со всей их сложностью, что означает, что даже если вы используете -ArgumentList parameter of start-job, очередь $ будет десериализована в строковый тип (или другие), который не имеет AddMessage () способ.

Вот обходной путь с использованием BeginInvoke, который делает то же самое, что и работа:

  $context=New-AzureStorageContext -StorageAccountName your_account -StorageAccountKey your_key
  $queue = Get-AzureStorageQueue -Name 'myqueue0905' -Context $context

  1..10 | % {

  $m1 = New-Object -TypeName Microsoft.WindowsAzure.Storage.Queue.CloudQueueMessage -ArgumentList "this is a message $_"

  $script = {param($p1,$m1) $p1.CloudQueue.AddMessage($m1)}

  $p=[powershell]::Create()

  $n=$p.AddScript($script).addargument($queue).addargument($m1)

  $job=$p.BeginInvoke()
}

Мой результат теста, как показано ниже: enter image description here

Сообщения добавляются на портал Azure: enter image description here

...