We are using InMemoryTransientMessageService to chain several one-way notification between services. We can not use Redis provider, and we do not really need it so far. Synchronous dispatching is enough.

We are experimenting problems when using a publish inside a service that is handling another publish. In pseudo-code:

FirstService.Method() _messageQueueClient.Publish(obj);

SecondService.Any(obj) _messageQueueClient.Publish(obj);

ThirdService.Any(obj)

The SecondMessage is never handled. In the following code of ServiceStack TransientMessageServiceBase, when the second message is processed, the service "isRunning" so it does not try to handled the second:

public virtual void Start()
    {
        if (isRunning) return;
        isRunning = true;

        this.messageHandlers = this.handlerMap.Values.ToList().ConvertAll(
            x => x.CreateMessageHandler()).ToArray();

        using (var mqClient = MessageFactory.CreateMessageQueueClient())
        {
            foreach (var handler in messageHandlers)
            {
                handler.Process(mqClient);
            }
        }

        this.Stop();
    }

I'm not sure about the impact of changing this behaviour in order to be able to nest/chain message publications. Do you think it is safe to remove this check? Some other ideas?

有帮助吗?

解决方案

After some tests, it seems there is no problem in removing the "isRunning" control. All nested publications are executed correctly.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top