Я пытаюсь собрать прототип с использованием Nservicebus, используя ненавязчивый режим, определяя пользовательские соглашения. Я начал пытаться запустить свою конечную точку в хосте NServicebus, но мне не удавалось собрать сообщение, которое я публикую. Я взял приложение с ненавязчивым примером, доступное от Nservicebus, и заменил его содержимое моими сообщениями и обработчиками. По-видимому, он обнаруживает сообщения на основе соглашения (я вижу его на выходе консоли при запуске приложения), но, похоже, не регистрируется для этих сообщений на основе обработчиков, которые у меня есть в приложении Server. Я не вижу, чтобы сообщение помещалось в очередь, и я не могу видеть активную или неактивную конечную точку в импульсе службы либо при запуске приложения.nservicebus ненавязчивый режим, не собирающий обработчики или обработка сообщений
Я пробовал много разных «исправлений» и просматривал интернет, переполнение стека и документацию Nservicebus и не нашел никакой информации, указывающей мне в правильном направлении.
Вот мой сервер конечной конфигурация:
BusConfiguration busConfiguration = new BusConfiguration();
busConfiguration.EnableInstallers();
busConfiguration.UsePersistence<InMemoryPersistence>();
busConfiguration.UseDataBus<FileShareDataBus>()
.BasePath(@"..\..\..\DataBusShare\");
busConfiguration.RijndaelEncryptionService();
busConfiguration.ApplyCustomConventions();
using (IBus bus = Bus.Create(busConfiguration).Start())
{
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
public static void ApplyCustomConventions(this BusConfiguration busConfiguration)
{
ConventionsBuilder conventions = busConfiguration.Conventions();
conventions.DefiningCommandsAs(t => t.Namespace != null && t.Namespace.EndsWith("Commands"));
conventions.DefiningEventsAs(t => t.Namespace != null && t.Namespace.EndsWith("Events"));
conventions.DefiningMessagesAs(t => t.Namespace != null && t.Namespace == "Messages");
conventions.DefiningEncryptedPropertiesAs(p => p.Name.StartsWith("Encrypted"));
//conventions.DefiningDataBusPropertiesAs(p => p.Name.EndsWith("DataBus"));
conventions.DefiningExpressMessagesAs(t => t.Name.EndsWith("Express"));
conventions
.DefiningTimeToBeReceivedAs(t => t.Name.EndsWith("Expires")
? TimeSpan.FromSeconds(30)
: TimeSpan.MaxValue
);
}
Метод ApplyCustomConventions разделяется между моим издателем сообщений и конечной точкой сервера.
Вот моя конечная точка сервера .exe app.config:
<configuration>
<configSections>
<section name="RijndaelEncryptionServiceConfig" type="NServiceBus.Config.RijndaelEncryptionServiceConfig, NServiceBus.Core"/>
</configSections>
<RijndaelEncryptionServiceConfig Key="gdDbqRpqdRbTs3mhdZh8qCaDaxJXl+e7"/>
</configuration>
Там нет ошибки на публикацию и сообщение никогда не получил.
Обновление: Я сузил это, чтобы он не работал, когда я пытаюсь публиковать события, и конечная точка не будет подписана, если я не сделаю отображение конечной точки. Более того, даже после того, как я опубликовал событие с сопоставлением конечных точек, он по-прежнему не подхвачен моими обработчиками конечных точек.
У меня есть вопросы здесь. В ненавязчивом примере из Particular он не настраивает сопоставления конечных точек, чтобы иметь возможность отправлять команды и сообщения, он устанавливает конечную точку на основе имени сборки. Не работает ли это с событиями и публикуется? Я взял ненавязчивый пример и поместил одно сообщение в Message.dll и добавил один обработчик для этого события в Server.exe и изменил Client.exe, чтобы иметь возможность публиковать это событие, и он не работает. Я постараюсь опубликовать свой код где-нибудь, когда у меня появится шанс. Спасибо, парни.
Можете ли вы поделиться код на Dropbox или GitHub? Предполагаю, вы это видели? http://docs.particular.net/samples/unobtrusive/#Nuget-v5_x –
Для получения ServicePulse, чтобы увидеть сердцебиение конечной точки, вам нужно добавить плагин heartbeat: http://docs.particular.net/servicecontrol/plugins/heartbeat –
У меня есть настройка импульсов обслуживания и включены необходимые Nugets. – Chris