我正在尝试创建一个“一次性”流程,该流程将通过在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)));
有什么想法吗?
答案 0 :(得分:1)
您正在创建仅发送端点。仅发送端点发送消息并且不接收消息。因此,将不会收到任何事件,也不会要求订阅。
将端点切换到完整端点将需要定义存储。您可以用自己的实现包装InMemoryPersistence
存储,也可以用自定义的存储完全替换。
答案 1 :(得分:0)
我最终仅使用MSMQ API将消息推送到适当的端点队列。使用来自https://docs.particular.net/transports/msmq/operations-scripting?version=core_5和https://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();
}
}