在NServiceBus 5

时间:2018-08-08 14:07:59

标签: .net nservicebus

我正在尝试创建一个“一次性”流程,该流程将通过在NServiceBus 5中引发适当的事件来向我的服务预加载大量数据。但是,我正在为如何配置“伪造”而苦苦挣扎'订阅,以便将事件发布到适当的端点。

这是我的代码,用于创建总线以发送消息:

var busConfiguration = new BusConfiguration();

busConfiguration.UseSerialization<XmlSerializer>();
busConfiguration.UseTransport<MsmqTransport>();
busConfiguration.UsePersistence<InMemoryPersistence>();

using (var bus = Bus.CreateSendOnly(busConfiguration))
{       
    bus.Publish(new MyEvent());
}

但是我不确定ISubscriptionStorage如何访问InMemoryPersistence。我猜我是否可以访问,我可以做类似的事情:

var subscriptionStorage = GetSubscriptionStorage();
subscriptionStorage.Subscribe(new Address("MyQueueName", "MyMachineName"), new MessageType(typeof(MyEvent)));

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您正在创建仅发送端点。仅发送端点发送消息并且不接收消息。因此,将不会收到任何事件,也不会要求订阅。

将端点切换到完整端点将需要定义存储。您可以用自己的实现包装InMemoryPersistence存储,也可以用自定义的存储完全替换。

答案 1 :(得分:0)

我最终仅使用MSMQ API将消息推送到适当的端点队列。使用来自https://docs.particular.net/transports/msmq/operations-scripting?version=core_5https://docs.particular.net/nservicebus/messaging/headers?version=core_5的技巧。

这是我构建的帮助程序类,您可以在其中传递MessageQueue和事件消息:

private static void SendMessage<T>(MessageQueue messageQueue, T eventMessage)
{
    var xmlSerializer = new System.Xml.Serialization.XmlSerializer(typeof(T));

    using (var scope = new TransactionScope())
    {
        using (var stream = new MemoryStream())
        {
            xmlSerializer.Serialize(stream, eventMessage);

            stream.Position = 0;

            using (var message = new Message())
            {
                message.BodyStream = stream;
                message.Extension = CreateHeaders(new List<HeaderInfo>()
                {
                    new HeaderInfo() {Key = "NServiceBus.ContentType", Value = "text/xml"},
                    new HeaderInfo() {Key = "NServiceBus.EnclosedMessageTypes", Value = typeof(T).FullName},
                });
                messageQueue.Send(message, MessageQueueTransactionType.Automatic);
            }
        }

        scope.Complete();
    }
}