NHibernate永続性を使用してNServiceBusSagasをセットアップしようとしていますが、127.0.0.1:8080でサービスへの接続中にエラーが発生したため、何かが正しく構成されていないと思います。sagaにコマンドメッセージを処理させることはできますが、数秒後に以下のエラーメッセージがコンソールウィンドウに表示され、同じコマンドが再度実行されて、sagaのハンドラーが再度呼び出されます。これは、アプリケーションの実行を許可している限り、繰り返し発生します。NHibernateがsagaデータのテーブルを作成するため、データベースに接続していることがわかりますが、そのテーブルには何も保持されていません。
sagaデータの永続化にエラーがあると思います。デフォルトのRavenDbsaga永続性を使用しようとしている可能性があると思いますが、なぜそうなるのかわかりません。
私が受け取るエラーメッセージは次のとおりです。
警告NServiceBus.Unicast.Transport.Transactional.TransactionalTransport[(null)] <(null)>-ID =3753b476-7501-4fd8-90d0-b10aee95a578 \22314System.Net.WebExceptionのメッセージの「transportmessagereceived」イベントの発生に失敗しました。リモートサーバーに接続できません--->System.Net.Sockets.SocketException:ターゲットマシンがSystem.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot、 SocketAddress socketAddress)at System.Net.Sockets.Socket.InternalConnect(EndPoint remoteEP)at System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure、Socket s4、Socket s6、Socket&socket、IPAddress&address、ConnectSocketState state、IAsyncResult asyncResult、Exception&例外)---内部例外スタックトレースの終了--- NServiceBus.Unicast.UnicastBus.HandleTransportMessage(IBuilder childBuilder、TransportMessage msg)at NServiceBus.Unicast.UnicastBus.TransportMessageReceived(Object sender、TransportMessageReceivedEventArgs e)at System.EventHandler`1 .Invoke(Object sender、TEventArgs e)at NServiceBus.Unicast.Transport.Transactional.TransactionalTransport.OnTransportMessageReceived(TransportMessage msg)OnTransportMessageReceived(TransportMessage msg)OnTransportMessageReceived(TransportMessage msg)
私が使用しようとしているサガのサンプルは次のとおりです(ここでは特別なことは何もありません。Handleメソッドで実際に何かを実行するかどうかに関係なく、同じことが起こります)。
public class ItemSaga : Saga<ItemData>, IAmStartedByMessages<CreateItemCommand>
{
public void Handle(CreateItemCommand message)
{
}
}
public class ItemData : ISagaEntity
{
public Guid Id { get; set; }
public string Originator { get; set; }
public string OriginalMessageId { get; set; }
}
私のエンドポイント構成は次のようになります。
public class EndpointConfig : IConfigureThisEndpoint, AsA_Publisher, IWantCustomInitialization
{
public void Init()
{
var container = new UnityContainer();
container.AddNewExtension<Domain.UnityExtension>();
Configure.With()
.UnityBuilder(container)
.JsonSerializer()
.Log4Net()
.MsmqSubscriptionStorage()
.MsmqTransport()
.PurgeOnStartup(true)
.UnicastBus()
.ImpersonateSender(false)
.DisableTimeoutManager()
.NHibernateSagaPersister()
.CreateBus()
.Start(() => Configure.Instance.ForInstallationOn<NServiceBus.Installation.Environments.Windows>().Install());
}
}
そして私のapp.configは次のようになります:
<MessageForwardingInCaseOfFaultConfig ErrorQueue="error"/>
<MsmqTransportConfig NumberOfWorkerThreads="1" MaxRetries="5"/>
<NHibernateSagaPersisterConfig UpdateSchema="true">
<NHibernateProperties>
<add Key="connection.provider" Value="NHibernate.Connection.DriverConnectionProvider"/>
<add Key="connection.driver_class" Value="NHibernate.Driver.Sql2008ClientDriver"/>
<add Key="connection.connection_string" Value="Data Source=(localdb)\v11.0;Integrated Security=True;AttachDbFileName=|DataDirectory|\App_Data\EventStore.mdf"/>
<add Key="dialect" Value="NHibernate.Dialect.MsSql2012Dialect"/>
</NHibernateProperties>
</NHibernateSagaPersisterConfig>
<connectionStrings>
<add name="EventStore" connectionString="Data Source=(localdb)\v11.0;Integrated Security=True;AttachDbFileName=|DataDirectory|\App_Data\EventStore.mdf"
providerName="System.Data.SqlClient" />
</connectionStrings>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="NHibernate" publicKeyToken="aa95f207798dfdb4" />
<bindingRedirect oldVersion="0.0.0.0-3.3.0.4000" newVersion="3.3.1.4000" />
</dependentAssembly>
</assemblyBinding>
</runtime>
ほんの2、3のメモ:
これは、この機能をテストするために使用しているサンプルアプリからのものです。localdbに添付されたローカルデータベースファイルを使用しますが、SQLServer2012を使用する私の完全なアプリケーションは同じ動作を示しています。NServiceBus.NHibernate NuGetパッケージは現在(この投稿の時点で)古いアセンブリバージョンにバインドされているため、NHibernateのdependenteAssemblyエントリも追加する必要がありました。
ご覧のとおり、私はIOCとしてUnityも使用していますが、Ninjectを使用したプロジェクトでもこれを複製しました。私はドメインストレージにEventStoreを使用していますが、これはうまく機能しています。コマンドを処理し、他のプロセスで処理されるようにEventStoreを介してイベントを公開するコマンドハンドラーがあります。ただし、コマンドハンドラーとして佐賀だけを残して、それらすべてを無効にしようとしましたが、それでも同じエラーが発生します。
誰かが私が間違っているかもしれないことについて何か考えを持っていますか?