2016-06-23 8 views
2

に違いメッセージの種類を扱うことができます私は単一 ServiceBusキュー内異なるカスタムメッセージを処理するために、AzureのWebJobを作成しました。は、連続的なC#のWebJobは自動的にシングルServiceBusキュー

これはautomagicデシリアライゼーションでサポートされていますか?

つまり、私はちょうど2つの機能を、同じServiceBusTriggerとそれぞれを作成するが、異なるメッセージパラメータができます。

public static void ProcessMessageA([ServiceBusTrigger("MessageQueue")] MessageA message) { ... } 
public static void ProcessMessageB([ServiceBusTrigger("MessageQueue")] MessageB message) { ... } 

私はこれを試してみたが、それは動作しませんので、私はBrokeredMessageを処理する必要がないと必要に応じて手動でデシリアライズしてメッセージを処理しますか?

答えて

0

問題ここでは、webjob SDKはあなたが手動で仲介メッセージをシリアル化を解除するためのオプションを持って言ったように、メッセージがだから、タイプAまたはB

であるないアイデアを持っていないということです。私は、メッセージのタイプを指定するためにあなたの仲介されたメッセージにプロパティを追加するべきだと思います。

public static void ProcessMessageA([ServiceBusTrigger("MessageQueue")] BrokeredMessage message) 
{ 
    var messageType = (string) message.Properties["messageType"]; 
    if (messageType == "MessageA") 
    { 
     // Deserialize the message 
     var messageA = message.GetBody<MessageA>(); 
     // Process the message 
    } 
    else if (messageType == "MessageB") 
    { 
     // Deserialize the message 
     var messageB = message.GetBody<MessageB>();; 
     // Process the message 
    } 
} 

は、そうでなければ、あなたがの種類ごとに別々のキューを作成することができ、あなたのwebjobに一つだけの機能を持っているので、今

// Create the object you want to send 
var messageA = new MessageA(); 
... 

// Create the borkered message 
var message = new BrokeredMessage(messageA); 

// Add a property 
message.Properties["messageType"] = "MessageA"; 

// Send the message 
... 

だから、そのようなものになる可能性がメッセージを送信しますメッセージ または2つのサブスクリプションでservice bus topicを作成します。

サブスクリプションを作成する際に、フィルタを指定できます。

string connectionString = CloudConfigurationManager.GetSetting("Microsoft.ServiceBus.ConnectionString"); 

var namespaceManager = NamespaceManager.CreateFromConnectionString(connectionString); 

// Create the topic 
namespaceManager.CreateTopic("TestTopic"); 

// Create subscription to handle message A 
namespaceManager.CreateSubscription("TestTopic", "MessageA", new SqlFilter("messageType = 'MessageA'")); 
// Create subscription to handle message A 
namespaceManager.CreateSubscription("TestTopic", "MessageB", new SqlFilter("messageType = 'MessageB'")); 

これで、MessageAとMessageBを処理する2つの異なる機能をWebjobに持たせることができます。

public static void ProcessMessageA([ServiceBusTrigger("TestTopic", "MessageA")] MessageA message) { } 

public static void ProcessMessageB([ServiceBusTrigger("TestTopic", "MessageB")] MessageB message) { } 
0

これを試してください:あなたの2つのクラスが異なる場合は、多分、シリアライザは、それらを区別することができるようになります

[DataContract(Namespace = "JobTransactionTopic.Notification")] 
public class Notification 
{ 
    #region Public Properties 

    [DataMember] 
    public string Description { get; set; } 

    [DataMember] 
    public int LoginId { get; set; } 


    [DataMember] 
    public string Title { get; set; } 

    #endregion 
} 

:あなたのクラス定義にようなものをのDataContract属性を追加します。送信者と受信者が同じ名前空間を共有し、クラス定義が両者で同じになることが重要です。

私が助けてくれたら教えてください。私はそれについて興味があります。