2010-08-06 6 views
0

Je veux avoir plusieurs bus en un seul processus. J'ai recherché sur Google à ce sujet et a constaté que c'est possible seulement si ayant plusieurs AppDomains. Mais je ne peux pas le faire fonctionner.NserviceBus. Comment démarrer plusieurs bus dans différents AppDomains?

Voici mon exemple de code (je fais tout dans une bibliothèque de classes):

using System; 
using System.Diagnostics; 
using System.Reflection; 
using MyMessages; 
using NServiceBus; 
using NServiceBus.Config; 
using NServiceBus.Config.ConfigurationSource; 

namespace Subscriber1 
{ 
public class Sender 
{ 
    public static void Main() 
    { 
     var domain = AppDomain.CreateDomain("someDomain", AppDomain.CurrentDomain.Evidence); 
     domain.Load(Assembly.GetExecutingAssembly().GetName()); 
     domain.CreateInstance(Assembly.GetExecutingAssembly().FullName, typeof (PluginBusCreator).FullName); 
     //here I have some code to send messages to "PluginQueue". 
    } 
} 

public class PluginBusCreator 
{ 
    public PluginBusCreator() 
    { 
     var Bus = Configure.With(
      Assembly.Load("NServiceBus"), Assembly.Load("NServiceBus.Core"), 
      Assembly.LoadFrom("NServiceBus.Host.exe"), Assembly.GetCallingAssembly()) 
      .CustomConfigurationSource(new PluginConfigurationSource()) 
      .SpringFrameworkBuilder() 
      .XmlSerializer().MsmqTransport() 
      .UnicastBus().LoadMessageHandlers<First<SomeHandler>>().CreateBus().Start(); 
    } 

    protected IBus Bus { get; set; } 
} 

class PluginConfigurationSource : IConfigurationSource 
{ 
    public T GetConfiguration<T>() where T : class 
    { 
     { 
      if (typeof (T) == typeof (MsmqTransportConfig)) 
       return new MsmqTransportConfig 
         { 
          ErrorQueue = "error", 
          InputQueue = "PluginQueue", 
          MaxRetries = 1, 
          NumberOfWorkerThreads = 1 
         } as T; 
      return null; 
     } 
    } 
} 

public class SomeHandler : IHandleMessages<EventMessage1> 
{ 
    public void Handle(EventMessage1 message) 
    { 
     Debugger.Break(); 
    } 
} 

}

Et je ne suis pas gestionnaire invoqué. Si vous avez des idées, s'il vous plaît aider. Je me bats ce problème beaucoup de temps. En outre, si le code complet doit être publié, s'il vous plaît dites.

J'ai besoin plusieurs bus pour résoudre le problème suivant:

J'ai mon application cible, et plusieurs plug-ins avec elle. Nous avons décidé de faire nos plugins selon le modèle de bus de service.

Chaque extension peut avoir plusieurs profils. Donc, l'application cible (c'est l'application web) est en train de publier un message, que quelque chose a changé en elle. Chaque plugin qui est abonné à ce message doit effectuer une action pour chaque profil. Mais le plugin ne sait rien de ses profils (les clients écrivent des plugins). Le plugin ne devrait avoir qu'un profil injecté, lorsque le traitement des messages a commencé.

Nous avons décidé d'avoir un RecepientList (pattern décrit dans "Enterprise Integration Patterns"), qui connait les profils de plugin, les parcourt et envoie de nouveau des messages avec des profils injectés (si plugin a plusieurs profils, plusieurs messages sera envoyé à celui-ci).

Mais je ne veux pas que chaque plugin soit appelé dans un nouveau processus. Parfaitement je veux configurer dynamiquement les bus pour chaque plugin au démarrage. Tout en un processus. Mais il semble que je doive le faire dans des AppDomains séparés. J'ai donc un problème décrit ci-dessus :-).

Répondre

1

Sergey,

Je suis pas clairement pourquoi chaque plugin doit avoir son propre bus. Pourraient-ils tous ne pas s'asseoir dans le même bus? Chaque développeur de plugin écrirait ses gestionnaires de messages comme avant, et les abonnements se produiraient automatiquement par le bus.

Ensuite, également, vous ne devez pas spécifier pour charger chaque DLL NServiceBus.

BTW, le chargement d'un assemblage par nom tend à causer des problèmes - essayez d'utiliser cette option pour spécifier des ensembles:

typeof (iMessage) .Assemblage, typeof (MsmqTransportConfig) .Assemblage, typeof (IConfigureThisEndpoint) .Assemblage

+0

Thaks pour votre réponse, Udi! Permettez-moi d'expliquer un peu plus en profondeur: , c'est-à-dire que j'ai deux plugins en train d'écouter Entity Updated message. Chaque plugin a plusieurs profils. Lorsque l'application cible envoie un message Entity Updated aux plug-ins, je souhaite que les événements suivants se produisent: 1.) Le plugin 1 reçoit deux messages. Chaque message a le même contexte, mais différents profils sont injectés. 2.) Plugin 2 - le même. Et cette fonctionnalité de données de profil d'injection dans le message est un devoir de ma liste de récepteurs. Je ne vois pas comment cela peut être implémenté s'il n'y aura qu'un seul bus pour tous les plugins. – struhtanov

Questions connexes