使用Powershell使用参数初始化RabbitMQ交换
我正在尝试使用Powershell初始化Exchange。我需要定义DLQ,因此我尝试以下语法:使用Powershell使用参数初始化RabbitMQ交换,powershell,rabbitmq,rabbitmq-exchange,Powershell,Rabbitmq,Rabbitmq Exchange,我正在尝试使用Powershell初始化Exchange。我需要定义DLQ,因此我尝试以下语法: $exchangeURL = $apiURL + "/exchanges/myHost/myExchange"; $body = "{""type"":""fanout"",""auto_delete"":false,""durable"":true,""arguments"":[{""x-dead-letter-exchange"": ""myExchangeDLQ""}]}" $response
$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
我明白了,也许没那么容易:
参数字段处处被忽略。不能创建队列,
交换或绑定参数。队列、交换或绑定
参数不会显示这些参数
交换不绑定到DLX(死信交换),队列绑定到DLX。如果您执行以下操作,它应该可以工作:
这是我在Pluralsight课程中发现的纯PowerShell替代方案-Michael Stephenson,RabbitMQ开发者第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#client。对于RabbitMQClient版本3.5.5,QueueDeclare的参数已从
IDictionary
更改为IDictionary
,因此需要稍微更改abx78提供的queueArgs参数定义,否则将引发一个隐藏的参数计数不匹配错误动力壳
版本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")
谢谢你的回答。不幸的是,它给出了相同的错误这里是我从我的工作设置脚本创建的要点。它所做的比你需要的更多,但它都起作用,所以你可以得到你需要的。哦,我明白了。这基本上是在代理上设置策略,以便死信交换对每个队列都有效。有趣的是正确的。您可以轻松地将其更新为在不同队列上设置不同的DLX,但我不需要这样做。我在全球范围内设置了它,这样我就不必在每个队列上都弄乱它。不客气。另一个注意事项是:我们曾经以这种方式初始化兔子队列和交换,但后来将代码放在C#中,并在应用程序启动时运行它。如果队列已经存在,那么代码什么也不做,否则它会自动创建所有内容。对我们来说,这是一个比在powershell中执行更好的解决方案。祝你好运