Private/rabbit.ps1

class MessagesReceiver {
    [System.Collections.ArrayList]$Observers
    [bool]$Running

    MessagesReceiver() {
        $this.Observers = [System.Collections.ArrayList]::new()
        $this.Running = $true
    }

    [void] Listen (
        [string]$QueueName ,
        [string]$Exchange ,
        [string]$ExchangeType ,
        [string]$RoutingKey
    ) {
        try {
            Write-Output 'Listening for RabbitMQ messages...'

            # Credenciais para conectar ao RabbitMQ
            $strPass = ConvertTo-SecureString -String $env:RabbitMQ_Password -AsPlainText -Force
            $Cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList ($env:RabbitMQ_User, $strPass)

            $Conn = New-RabbitMqConnectionFactory -ComputerName 82.180.136.148 -Credential $Cred -Port 3340

            $Params = @{
                ComputerName = '82.180.136.148';
                Timeout      = 100000;
                Credential   = $Cred;
                QueueName    = $QueueName;
                Exchange     = $Exchange;
                ExchangeType = $ExchangeType;
                Ssl          = "None";
                Key          = $RoutingKey;
                Port         = 3340
            }

            Connect-RabbitMqChannel -Connection $Conn  -QueueName $QueueName -Exchange $Exchange -ExchangeType $ExchangeType -Key $RoutingKey | Out-Null
            while ($this.Running) {
                $message = $(Wait-RabbitMqMessage @Params | convertfrom-json)

                if ($message.pattern) {
                    $message = $message.data;
                }

                if ($message.title -eq "STOP_LISTENER") {
                    $this.Running = $false
                    return;
                }

                $this.NotifyObservers($message);
            }
        }
        catch {
            Write-Error $_
            Start-Sleep -Seconds 5
            Write-Output 'Retrying...'
            $this.Listen()
        }
        finally {
            if ($this.Running -eq $true) {
                $this.Listen()
            }
            # start-job -Name RabbitListener -ScriptBlock { $this.Listen() }
        }
    }

    # Notifica todos os observadores registrados
    [void]  NotifyObservers($message) {
        Write-Host $message
        foreach ($observer in $this.Observers) {
            $observer.Invoke($this, $message)
        }
    }

    # Registra um observador
    [void] RegisterObserver([scriptblock]$observer) {
        $this.Observers.Add($observer) | Out-Null
    }

    # Remove um observador
    [void] UnregisterObserver([scriptblock]$observer) {
        $this.Observers.Remove($observer) | Out-Null
    }
}