使用 Powershell 使用参数初始化 RabbitMQ Exchange
Initialize RabbitMQ Exchange with arguments using Powershell
我正在尝试使用 Powershell 初始化 Exchange。我需要定义一个 DLQ,所以我正在尝试以下语法:
$exchangeURL = $apiURL + "/exchanges/myHost/myExchange";
$body = "{""type"":""fanout"",""auto_delete"":false,""durable"":true,""arguments"":[{""x-dead-letter-exchange"": ""myExchangeDLQ""}]}"
$response = Invoke-WebRequest -Uri $exchangeURL -Headers $headers -Method Put -ContentType "application/json" -Body $body
我收到这个错误:
Invoke-WebRequest :
{"error":"bad_request","reason":["unhandled_type",["x-dead-letter-exchange","myExchangeDLQ"]]}
+ $response = Invoke-WebRequest -Uri $exchangeURL -Headers $headers -Method Put -C ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
我在 this link 看到,也许这并不容易:
arguments fields are ignored everywhere. You cannot create a queue,
exchange or binding with arguments. Queues, exchanges or bindings with
arguments won't show those arguments
交换不会绑定到 DLX(死信交换),队列会。如果您执行以下操作,它应该会起作用:
使用空参数列表创建交换:
$body = "{""type"":""fanout"",""auto_delete"":false,""durable"":true,""arguments"":[]}"
使用 DLX 创建队列
- 将交换绑定到队列
这是我在 Pluralsight 课程中找到的纯 PowerShell 替代方案 - Michael Stephenson,RabbitMQ for Developers 第 2 部分。
$RabbitDllPath = "packages\RabbitMQ.Client.3.1.5\lib\net30\RabbitMQ.Client.dll"
$RabbitDllPath = Resolve-Path $RabbitDllPath
Write-Host "Rabbit DLL Path: "
Write-Host $RabbitDllPath -foregroundcolor green
set-ExecutionPolicy Unrestricted
$absoluteRabbitDllPath = Resolve-Path $RabbitDllPath
Write-Host "Absolute Rabbit DLL Path: "
Write-Host $absoluteRabbitDllPath -foregroundcolor green
[Reflection.Assembly]::LoadFile($absoluteRabbitDllPath)
Write-Host "Setting up RabbitMQ Connection Factory"
$factory = new-object RabbitMQ.Client.ConnectionFactory
$hostNameProp = [RabbitMQ.Client.ConnectionFactory].GetField(“HostName”)
$hostNameProp.SetValue($factory, “localhost”)
$usernameProp = [RabbitMQ.Client.ConnectionFactory].GetField(“UserName”)
$usernameProp.SetValue($factory, “guest”)
$passwordProp = [RabbitMQ.Client.ConnectionFactory].GetField(“Password”)
$passwordProp.SetValue($factory, “guest”)
$createConnectionMethod = [RabbitMQ.Client.ConnectionFactory].GetMethod(“CreateConnection”, [Type]::EmptyTypes)
$connection = $createConnectionMethod.Invoke($factory, “instance,public”, $null, $null, $null)
Write-Host "Setting up RabbitMQ Model"
$model = $connection.CreateModel()
Write-Host "Create Dead Letter Exchange"
$exchangeType = [RabbitMQ.Client.ExchangeType]::Fanout
$model.ExchangeDeclare("DeadLetterExchange", $exchangeType, $true)
Write-Host "Creating Dead Letter Queue"
$model.QueueDeclare(“DeadLetter”, $true, $false, $false, $null)
$model.QueueBind("DeadLetter", "DeadLetterExchange", "")
Write-Host "Creating Queue"
$args = @{"x-dead-letter-exchange"="DeadLetterExchange";};
$model.QueueDeclare(“Normal”, $true, $false, $false, $args)
Write-Host "Setup complete"
此方法利用了 C# 客户端。
对于 RabbitMQClient 版本 3.5.5,QueueDeclare 的 arguments 参数已从 IDictionary
更改为 IDictionary<string,object>
,因此需要稍微更改 abx78 提供的 queueArgs 参数定义,否则您会得到一个神秘的参数计算 powershell 抛出的不匹配错误
版本 3.1.5 的旧方法
$queueArgs = @{"x-dead-letter-exchange"="charges_deadletter_exchange";};
新方式
$queueArgs= New-Object "System.Collections.Generic.Dictionary``2[System.String,System.Object]"
$queueArgs.Add("x-dead-letter-exchange", "charges_deadletter_exchange")
我正在尝试使用 Powershell 初始化 Exchange。我需要定义一个 DLQ,所以我正在尝试以下语法:
$exchangeURL = $apiURL + "/exchanges/myHost/myExchange";
$body = "{""type"":""fanout"",""auto_delete"":false,""durable"":true,""arguments"":[{""x-dead-letter-exchange"": ""myExchangeDLQ""}]}"
$response = Invoke-WebRequest -Uri $exchangeURL -Headers $headers -Method Put -ContentType "application/json" -Body $body
我收到这个错误:
Invoke-WebRequest :
{"error":"bad_request","reason":["unhandled_type",["x-dead-letter-exchange","myExchangeDLQ"]]}
+ $response = Invoke-WebRequest -Uri $exchangeURL -Headers $headers -Method Put -C ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
我在 this link 看到,也许这并不容易:
arguments fields are ignored everywhere. You cannot create a queue, exchange or binding with arguments. Queues, exchanges or bindings with arguments won't show those arguments
交换不会绑定到 DLX(死信交换),队列会。如果您执行以下操作,它应该会起作用:
使用空参数列表创建交换:
$body = "{""type"":""fanout"",""auto_delete"":false,""durable"":true,""arguments"":[]}"
使用 DLX 创建队列
- 将交换绑定到队列
这是我在 Pluralsight 课程中找到的纯 PowerShell 替代方案 - Michael Stephenson,RabbitMQ for Developers 第 2 部分。
$RabbitDllPath = "packages\RabbitMQ.Client.3.1.5\lib\net30\RabbitMQ.Client.dll"
$RabbitDllPath = Resolve-Path $RabbitDllPath
Write-Host "Rabbit DLL Path: "
Write-Host $RabbitDllPath -foregroundcolor green
set-ExecutionPolicy Unrestricted
$absoluteRabbitDllPath = Resolve-Path $RabbitDllPath
Write-Host "Absolute Rabbit DLL Path: "
Write-Host $absoluteRabbitDllPath -foregroundcolor green
[Reflection.Assembly]::LoadFile($absoluteRabbitDllPath)
Write-Host "Setting up RabbitMQ Connection Factory"
$factory = new-object RabbitMQ.Client.ConnectionFactory
$hostNameProp = [RabbitMQ.Client.ConnectionFactory].GetField(“HostName”)
$hostNameProp.SetValue($factory, “localhost”)
$usernameProp = [RabbitMQ.Client.ConnectionFactory].GetField(“UserName”)
$usernameProp.SetValue($factory, “guest”)
$passwordProp = [RabbitMQ.Client.ConnectionFactory].GetField(“Password”)
$passwordProp.SetValue($factory, “guest”)
$createConnectionMethod = [RabbitMQ.Client.ConnectionFactory].GetMethod(“CreateConnection”, [Type]::EmptyTypes)
$connection = $createConnectionMethod.Invoke($factory, “instance,public”, $null, $null, $null)
Write-Host "Setting up RabbitMQ Model"
$model = $connection.CreateModel()
Write-Host "Create Dead Letter Exchange"
$exchangeType = [RabbitMQ.Client.ExchangeType]::Fanout
$model.ExchangeDeclare("DeadLetterExchange", $exchangeType, $true)
Write-Host "Creating Dead Letter Queue"
$model.QueueDeclare(“DeadLetter”, $true, $false, $false, $null)
$model.QueueBind("DeadLetter", "DeadLetterExchange", "")
Write-Host "Creating Queue"
$args = @{"x-dead-letter-exchange"="DeadLetterExchange";};
$model.QueueDeclare(“Normal”, $true, $false, $false, $args)
Write-Host "Setup complete"
此方法利用了 C# 客户端。
对于 RabbitMQClient 版本 3.5.5,QueueDeclare 的 arguments 参数已从 IDictionary
更改为 IDictionary<string,object>
,因此需要稍微更改 abx78 提供的 queueArgs 参数定义,否则您会得到一个神秘的参数计算 powershell 抛出的不匹配错误
版本 3.1.5 的旧方法
$queueArgs = @{"x-dead-letter-exchange"="charges_deadletter_exchange";};
新方式
$queueArgs= New-Object "System.Collections.Generic.Dictionary``2[System.String,System.Object]"
$queueArgs.Add("x-dead-letter-exchange", "charges_deadletter_exchange")