2012-02-22 5 views
2

Après avoir ajouté la consignation (à l'aide de log4net) à mon application, il ne gère plus correctement les messages d'abonnement et les place dans la file d'attente d'erreurs. Ci-dessous, certains noms d'espaces de noms ont été modifiés pour protéger les innocents.Erreur lors de la gestion des messages d'abonnement à NServiceBus

app.config

<?xml version="1.0"?> 
<configuration> 
<configSections> 
    <section name="MsmqTransportConfig" type="NServiceBus.Config.MsmqTransportConfig, NServiceBus.Core" /> 
    <section name="UnicastBusConfig" type="NServiceBus.Config.UnicastBusConfig, NServiceBus.Core" /> 
    <section name="MsmqSubscriptionStorageConfig" type="NServiceBus.Config.MsmqSubscriptionStorageConfig, NServiceBus.Core" /> 
    <section name="Logging" type="NServiceBus.Config.Logging, NServiceBus.Core" /> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> 
</configSections> 

<Logging Threshold="INFO" /> 

<log4net> 
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> 
     <layout type="log4net.Layout.PatternLayout"> 
      <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] &lt;%X{auth}&gt; - %m%n"/> 
     </layout> 
    </appender> 
    <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender" > 
     <layout type="log4net.Layout.PatternLayout"> 
      <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] &lt;%X{auth}&gt; - %m%n"/> 
     </layout> 
    </appender> 
    <appender name="TraceAppender" type="log4net.Appender.TraceAppender"> 
     <layout type="log4net.Layout.PatternLayout"> 
      <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] &lt;%X{auth}&gt; - %m%n"/> 
     </layout> 
    </appender> 
    <appender name="FileAppender" type="log4net.Appender.FileAppender"> 
     <file value="logfile.txt" /> 
     <appendToFile value="true" /> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /> 
     </layout> 
    </appender> 
    <root> 
     <level value="INFO"/> 
     <appender-ref ref="ConsoleAppender"/> 
     <appender-ref ref="FileAppender"/> 
    </root> 
</log4net> 

<MsmqTransportConfig 
    InputQueue="BankRequestDispatcherInputQueue_DEV2" 
    ErrorQueue="error" 
    NumberOfWorkerThreads="1" 
    MaxRetries="5" 
/> 

<UnicastBusConfig ForwardReceivedMessagesTo="auditqueue"> 
    <MessageEndpointMappings> 
     <add Messages="<assembly>.BankRequestBatchClosed,<assembly>" Endpoint="ScheduledBatchAgentInputQueue_DEV2" /> 
    </MessageEndpointMappings> 
</UnicastBusConfig> 

<MsmqSubscriptionStorageConfig Queue="BRDispatcher_DEV2_subscriptions" /> 

<!-- Neccessary for Fluent/NHibernate/SQLLite dlls --> 
<startup useLegacyV2RuntimeActivationPolicy="true"> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> 
</startup> 
<appSettings> 
    <add key="TempRequestFileLocation" value="c:\temp\"/> 
    <add key="KeepRequestFiles" value="true"/> 
    <add key="Environment" value="TEST"/> 
</appSettings> 
</configuration> 

J'ai aussi changé le Endpoint config à ceci:

namespace myNamespace.BRDispatcher 
{ 
    /// <summary> 
    /// Interface tells NServiceBus which roles to setup for this class. 
    /// </summary> 
    public class BRDEndpointConfig : IConfigureThisEndpoint, IWantCustomInitialization 
    { 
     #region Class References -1- 
     /// <summary> 
     /// Reference to Logger object. 
     /// </summary> 
     private static readonly ILog Logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 
     #endregion 
    public void Init() 
    { 
     NServiceBus.SetLoggingLibrary.Log4Net(log4net.Config.XmlConfigurator.Configure); 

     Logger.Info("BankRequestDispatcher - Init()"); 

     NServiceBus.Configure.With() 
      //.Log4Net() 
      .DefaultBuilder() 
      .XmlSerializer() 
      .MsmqSubscriptionStorage() 
      .MsmqTransport() 
      .IsTransactional(true) 
      .PurgeOnStartup(false) 
      .UnicastBus() 
      .ImpersonateSender(false) 
      .LoadMessageHandlers() 
      .CreateBus() 
      .Start(); 

     Logger.Info("BankRequestDispatcher - Init() Complete"); 
    } 
} 
} 

Quand il enflamme, tout message d'abonnement reçu se fait larguer sur l'erreur file d'attente et je vois cela dans le journal:

2012-02-22 17:02:48,013 [Worker.8] ERROR NServiceBus.Unicast.Transport.Msmq.MsmqTransport [(null)] - Message has failed the maximum number of times allowed, ID=94b95c71-896f-4991-b3ba-9d2068a68c63\81504. 

Répondre

0

J'ai trouvé une cause de l'erreur/du problème. Si la file d'attente de transfert de messages est spécifiée dans app.config (ForwardReceivedMessagesTo) mais que la file d'attente n'existe pas sur la machine hôte, la même erreur se produit.

app.config

<UnicastBusConfig ForwardReceivedMessagesTo="auditqueue"> 
<MessageEndpointMappings> 
    <add Messages="<assembly>.BankRequestBatchClosed,<assembly>" Endpoint="ScheduledBatchAgentInputQueue_DEV2" /> 
</MessageEndpointMappings> 

Le problème a été causé comme un seul processus sur les six que j'ai appelé la file d'attente en cours d'exécution manquant dans l'environnement de test. Cinq ont été mis à 'auditqueue' et un était 'auditqueue_test2' qui, malheureusement, était le nom correct sauf qu'il n'existait pas et ne crée pas automatiquement la file d'attente dans cette instance, ni ne fait aucune remarque dans les instructions DEBUG que c'est le problème.

J'ai créé une nouvelle file d'attente transactionnelle appelée 'auditqueue_test2' et elle est en cours d'exécution. Je vais ajouter à la journalisation et voir si cela fonctionne.

1

Cela est dû à un bug dans RC4, s'il vous plaît essayez avec
RC5 et voir si cela résout le problème.

+0

J'ai oublié de mentionner que j'utilise la version 2.6. Est-ce que ce sera une mise à niveau difficile pour NSB 3.0? – Fellmeister

+0

En outre, la journalisation fonctionne très bien dans le débogage sur ma machine de développement, mais la version finale des dlls a ce problème sur la machine de test lorsqu'elle fonctionne en tant que service avec NServiceBus.Host.Exe – Fellmeister

+0

Devrait être assez facile (mais attendez-vous à quelques changements) –

Questions connexes