//Copyright (c) Service Stack LLC. All Rights Reserved. //License: https://raw.github.com/ServiceStack/ServiceStack/master/license.txt using System; using System.Collections.Generic; namespace ServiceStack.Messaging { public class MessageQueueClientFactory : IMessageQueueClientFactory { public IMessageQueueClient CreateMessageQueueClient() { return new InMemoryMessageQueueClient(this); } readonly object syncLock = new object(); public event EventHandler MessageReceived; void InvokeMessageReceived(EventArgs e) { var received = MessageReceived; if (received != null) received(this, e); } private readonly Dictionary> queueMessageBytesMap = new Dictionary>(); public void PublishMessage(string queueName, IMessage message) { PublishMessage(queueName, message.ToBytes()); } public void PublishMessage(string queueName, byte[] messageBytes) { lock (syncLock) { Queue bytesQueue; if (!queueMessageBytesMap.TryGetValue(queueName, out bytesQueue)) { bytesQueue = new Queue(); queueMessageBytesMap[queueName] = bytesQueue; } bytesQueue.Enqueue(messageBytes); } InvokeMessageReceived(new EventArgs()); } /// /// Returns the next message from queueName or null if no message /// /// /// public byte[] GetMessageAsync(string queueName) { lock (syncLock) { Queue bytesQueue; if (!queueMessageBytesMap.TryGetValue(queueName, out bytesQueue)) { return null; } if (bytesQueue.Count == 0) { return null; } var messageBytes = bytesQueue.Dequeue(); return messageBytes; } } public void Dispose() { } } }