1
votes

I am using SendOnlyBus with NserviceBus 5.2 and my set-up code is like

busConfiguration.UsePersistence<NHibernatePersistence,StorageType.Subscriptions>();
                busConfiguration.AssembliesToScan(AssembliesToScan);
                busConfiguration.UseTransport<MsmqTransport>();
                busConfiguration.PurgeOnStartup(false);
                busConfiguration.UseSerialization<XmlSerializer>();
                return Bus.CreateSendOnly(busConfiguration);

and web.config

    <section name="UnicastBusConfig" type="NServiceBus.Config.UnicastBusConfig,       NServiceBus.Core" />
<section name="MsmqTransportConfig" type="NServiceBus.Config.TransportConfig,  NServiceBus.Core" />

<MsmqTransportConfig InputQueue="XXX" ErrorQueue="XXX" NumberOfWorkerThreads="X" MaxRetries="X" />
<UnicastBusConfig>
    <MessageEndpointMappings>
      <add Messages="X" Endpoint="X" />
      </MessageEndpointMappings>
</UnicastBusConfig>

<add name="NServiceBus/Persistence" connectionString="Data Source=XXX;database=XXX;User ID=XX;Password=XXx;" />

<add key="NServiceBus/Persistence/NHibernate/dialect" value="NHibernate.Dialect.MsSql2005Dialect" />
    <add key="NServiceBus/Persistence/NHibernate/connection.provider" value="NHibernate.Connection.DriverConnectionProvider" />
    <add key="NServiceBus/Persistence/NHibernate/connection.driver_class" value="NHibernate.Driver.SqlClientDriver" />

this leads to error while publishing message.

Cannot publish on this endpoint - no subscription storage has been configured."

If i use Memory Persistence, it works fine but not with Hibernate DB-Subscription, Not able to find out what's missing or wrong. Appreciate any help ?.

Thanks

1

1 Answers

2
votes

Explanation

NServiceBus is not configuring subscription persistence because you have asked for a send only endpoint.

Send only endpoints do not have an input queue, which means they have no way to receive and store subscriptions. Trying to Publish makes no sense if you have no subscribers.

Either

  • keep the send only bus, but switch from using Bus.Publish() to Bus.Send()

or

  • use a complete bus by calling return Bus.Create(busConfiguration) instead of return Bus.CreateSendOnly(busConfiguration)


Code sample

The only code needed to publish an event with NHibernate as subscription persistence on NServiceBus 5.2.0 and NServiceBus.NHibernate 6.1.2 is the following:

Program.cs

using System;
using NServiceBus;
using NServiceBus.Features;
using NServiceBus.Persistence;

class Program
{

    static void Main()
    {
        BusConfiguration busConfiguration = new BusConfiguration();
        busConfiguration.DisableFeature<TimeoutManager>();
        busConfiguration.UsePersistence<NHibernatePersistence, StorageType.Subscriptions>();

        using (IStartableBus bus = Bus.Create(busConfiguration))
        {
            bus.Start();
            bus.Publish(new SomeEvent());

            Console.WriteLine("Published an event");
            Console.ReadLine();
        }
    }

    class SomeEvent : IEvent {}
}

app.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
    <add name="NServiceBus/Persistence" connectionString="Data Source=.;database=database;User ID=user;Password=password;"/>
  </connectionStrings>
  <appSettings>
    <add key="NServiceBus/Persistence/NHibernate/dialect" value="NHibernate.Dialect.MsSql2012Dialect" /> 
  </appSettings>
</configuration>