Question

Can anyone help me with the following problem, that only seems to occur since the latest NServiceBus upgrade (4.3 -> 4.4.2).

We're creating a MVC4 application, that should receive messages from an other application. NServiceBus is self-hosted in the same application.

The following packages are used:

  • Castle Windsor 3.2.1 & Castle Core 3.2.2
    • Used for dependency resolving throughout the whole application
  • NServiceBus 4.4.2
  • NServiceBus CastleWindsor 4.4.2
    • Logical choice since I already use Castle for the rest of the application
  • NServiceBus SqlServer
    • We prefer database-tables over msmq for monitoring reasons

The following code is used to initialize NServiceBus

public class NServiceBusInstaller : IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        SetLoggingLibrary.Log4Net(log4net.Config.XmlConfigurator.Configure);
        Configure.Serialization.DontWrapSingleMessages();
        Configure.Features.Disable<AutoSubscribe>();
        Configure.Features.Disable<SecondLevelRetries>();
        Configure.Features.Disable<TimeoutManager>();
        Configure.ScaleOut(x => x.UseSingleBrokerQueue());
        Configure.With()
            .Log4Net()
            .CastleWindsorBuilder(container)
            .UseTransport<SqlServer>()
            .DefiningMessagesAs(t => (t.Namespace == "MyNamespace.Messages") && t.Name.EndsWith("Message"))
            .UnicastBus()
            .LoadMessageHandlers()
            .CreateBus()
            .Start();
    }
}

In the Global.asax Application_Start, this Installer is being installed in the global windsor-container.

When a message arrives in the queue, i get the following exception multiple times. Following trace is from the component "UnicastBus", but i get it from every level in NServiceBus where the message passes.

Castle.Windsor Warning: 0 : Exception when resolving optional dependency Dependency 'MessageSender' type 'NServiceBus.Transports.ISendMessages' on component NServiceBus.Unicast.UnicastBus., Castle.MicroKernel.ComponentActivator.ComponentActivatorException: Error setting property SqlServerMessageSender.ConnectionStringCollection in component NServiceBus.Transports.SQLServer.SqlServerMessageSender. See inner exception for more information.
If you don't want Windsor to set this property you can do it by either decorating it with DoNotWireAttribute or via registration API.
Alternatively consider making the setter non-public. ---> System.NullReferenceException: De objectverwijzing is niet op een exemplaar van een object ingesteld.
   bij Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.SetUpProperties(Object instance, CreationContext context)
   --- Einde van intern uitzonderingsstackpad ---
   bij Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.SetUpProperties(Object instance, CreationContext context)
   bij Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.InternalCreate(CreationContext context)
   bij Castle.MicroKernel.ComponentActivator.AbstractComponentActivator.Create(CreationContext context, Burden burden)
   bij Castle.MicroKernel.Lifestyle.AbstractLifestyleManager.CreateInstance(CreationContext context, Boolean trackedExternally)
   bij Castle.MicroKernel.Lifestyle.AbstractLifestyleManager.Resolve(CreationContext context, IReleasePolicy releasePolicy)
   bij Castle.MicroKernel.Handlers.DefaultHandler.ResolveCore(CreationContext context, Boolean requiresDecommission, Boolean instanceRequired, Burden& burden)
   bij Castle.MicroKernel.Handlers.DefaultHandler.Resolve(CreationContext context, Boolean instanceRequired)
   bij Castle.MicroKernel.Handlers.AbstractHandler.Resolve(CreationContext context)
   bij Castle.MicroKernel.Resolvers.DefaultDependencyResolver.ResolveFromKernelByType(CreationContext context, ComponentModel model, DependencyModel dependency)
   bij Castle.MicroKernel.Resolvers.DefaultDependencyResolver.ResolveFromKernel(CreationContext context, ComponentModel model, DependencyModel dependency)
   bij Castle.MicroKernel.Resolvers.DefaultDependencyResolver.ResolveCore(CreationContext context, ISubDependencyResolver contextHandlerResolver, ComponentModel model, DependencyModel dependency)
   bij Castle.MicroKernel.Resolvers.DefaultDependencyResolver.Resolve(CreationContext context, ISubDependencyResolver contextHandlerResolver, ComponentModel model, DependencyModel dependency)
   bij Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.ObtainPropertyValue(CreationContext context, PropertySet property, IDependencyResolver resolver)

Eventually, the message does not get forwarded towards the error queue, and NServiceBus shuts down.

While examining this exception trace, I found out that the SqlServerMessageSender.ConnectionStringCollection already has a private setter, so I wonder why Castle.Windsor does not succeed in creating an instance of the MessageSender.

To complete:

The webconfig contains

<connectionStrings>
    <add name="NServiceBus/Transport" connectionString="myconnectionstring" providerName="System.Data.SqlClient" />
</connectionStrings>

Anyone an idea why this exception occurs?

Was it helpful?

Solution

I've just released a patch that fixes this issue, see https://github.com/Particular/NServiceBus.SqlServer/releases/tag/1.2.1

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top