2016-03-21 12 views
1

Azureサービスバスサブスクリプションクライアントは、サブスクリプションでセッションが必要なときにOnMessageアクションを使用する機能をサポートしていますか?Azure、SubscriptionClient.OnMessage、およびセッション

"TestSubscription"というサブスクリプションがあります。これにはsessionIdが必要であり、SessionIdによって結ばれた複数のデータが含まれています。

if (!namespaceManager.SubscriptionExists("TestTopic", "Export")) 
{ 
    var testRule = new RuleDescription 
    { 
     Filter = new SqlFilter(@"(Action='Export')"), 
     Name = "Export" 
    }; 

var subDesc = new SubscriptionDescription("DataCollectionTopic", "Export") 
{ 
    RequiresSession = true 
}; 
namespaceManager.CreateSubscription(sub`enter code here`Desc, testRule); 
} 

は別々のプロジェクトで、私は、サービスバスモニタとWorkerRoleを持っている、とWorkerロールで、私は「testSubscriptionClient」と呼ばれるSubscriptionClient、持っている:

testSubscriptionClient = SubscriptionClient.CreateFromConnectionString(connectionString, _topicName, CloudConfigurationManager.GetSetting("testSubscription"), ReceiveMode.PeekLock); 

私は、持っていると思いますが新しいアイテムがサービスバスキューに置かれたときにトリガのonMessage:

testSubscriptionClient.OnMessage(PersistData); 

私は、コードを実行したとき、私は、次のメッセージが表示されますただし:

と、InvalidOperationException:それは私がAzureのSDKのV2.8を使用していた非sessionfulメッセージ受信

を作成するためのセッションを必要とするエンティティのために可能ではありません。

私が探していることは可能ですか?この方法でサブスクリプションからメッセージを取得できるサービスバスモニタ、サブスクリプションクライアント、または他の場所で行う必要がある特定の設定がありますか。副次的なこととして、このアプローチはセッションデータを使用していない他のケースでも完全に機能します。

testSubscriptionClient.OnMessage(PersistData); 

編集: また、あなたがセッション(RegisterSessionHandler)を処理するために、あなたのハンドラを登録することができ、このの横に

var messageSession=testSubscriptionClient.AcceptMessageSession(); 

messageSession.OnMessage(PersistData); 

答えて

1

あなたはこのコードを試すことができます。それは新しいアクションが起こるたびにあなたのハンドルを撃つでしょう。

私はこれがあなたの問題にもっと適していると思います。

彼はこの両方で、このarticleを示しています。それはキューのためですが、私はこれをトピックにも適用できると思います。

+0

起動時に1つのメッセージに有効です。 AcceptMessageSessionはサービスバス購読から次のセッションを取得し、意図したとおりに実行することを意味します。しかし、サービスバスに他のセッションされたメッセージがある場合、それらは取り出されません。この呼び出しをRun()メソッドに配置する必要がありますか? –

+0

メッセージを受け取ったら、AcceptMessageSessionを再度呼び出すべきだと思います。ここをクリックhttp://www.jayway.com/2014/08/28/routing-commands-using-azure-service-bus-sessions/これは非同期用です。 –

+0

これは意味があります。メッセージがいつサービスバスに入力されるのか分からないことを除いて。だから私は、新しいメッセージが検出され、新しいメッセージが発見されたときにイベントをトリガーできるように、私のサービスバスモニターが必要です。リンクの中の解決策のようだ、あるいは単にAcceptMessageSessionを呼び出すだけでも、新しいセッションが待っていることを知り、そのコードを呼び出すためのトリガを持っていることに気づいているようだ。 –

関連する問題