使用Powershell使用参数初始化RabbitMQ交换

使用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

我正在尝试使用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
我明白了,也许没那么容易:

参数字段处处被忽略。不能创建队列, 交换或绑定参数。队列、交换或绑定 参数不会显示这些参数


交换不绑定到DLX(死信交换),队列绑定到DLX。如果您执行以下操作,它应该可以工作:

  • 使用空参数列表创建exchange:

    $body=“{”“类型”“:”“扇出”“自动删除”“:false”“持久”“:true”“参数”“:[]}”

  • 使用DLX创建队列

  • 将exchange绑定到队列

  • 这是我在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中执行更好的解决方案。祝你好运