Stephen Patten
Stephen Patten

Reputation: 6363

How to be notified of a response message when using RabbitMQ RPC and ServiceStack

Under normal circumstances messages with a response will be published to the response.inq, I understand that and it's a nifty way to notify other parties that "something" has happened. But, when using the RPC pattern, the response goes back to the temp queue and disappears. Is this correct? Is there a convenient way, short of publishing another message, to achieve this behavior, of auto-notification?

Upvotes: 1

Views: 291

Answers (1)

mythz
mythz

Reputation: 143339

The Message Workflow docs in describes the normal message workflow for calling a Service via ServiceStack.RabbitMQ:

ServiceStack RabbitMQ Message Workflow

Request / Reply

The Request/Reply alters the default message flow by specifying its own ReplyTo address to change the queue where the response gets published, e.g:

const string replyToMq = mqClient.GetTempQueueName();
mqClient.Publish(new Message<Hello>(new Hello { Name = "World" }) {
    ReplyTo = replyToMq
});

IMessage<HelloResponse> responseMsg = mqClient.Get<HelloResponse>(replyToMq);
mqClient.Ack(responseMsg);
responseMsg.GetBody().Result //= Hello, World!

When using the Request/Reply pattern no other message is published in any other RabbitMQ topic/queue, to alert other subscribers the client would need to republish the message.

RabbitMqServer callbacks

Another way to find out when a message has been published or received is to use the PublishMessageFilter and GetMessageFilter callbacks on the RabbitMqServer and Client which lets you inspect each message that they sent or received, e.g:

var mqServer = new RabbitMqServer("localhost") 
{
    PublishMessageFilter = (queueName, properties, msg) => {
        //...
    },
    GetMessageFilter = (queueName, basicMsg) => {
        //...
    }
};

Upvotes: 2

Related Questions