2

Java アプリケーションで Windows Azure サービス バス トピックをサブスクリプション フィルターと共に使用したいと考えています。Windows Azure Plugin for Eclipse with Java (Microsoft Open Technologies)と Windows Azure SDK 2.0を使用しています。

Java API を使用してこれを行う方法を示す Microsoft Web サイト の基本的なサンプル コードが機能していないことがわかりました。

基本的なコード例は、API を使用して Java アプリケーションからプログラムで次のことをどのように達成する必要がありますか?

1) 既存の名前空間にある既存の「TestTopic」の ServiceBusContract オブジェクトを取得します。

2) デフォルトの MatchAll フィルタを使用して「AllMessages」サブスクリプションを作成します。このサブスクリプションは、「TestTopic」に送信されたすべてのメッセージをその仮想キューで受信します。

3) SqlFilter フィルターを使用して "LowMessages" サブスクリプションを作成し、"MessageNumber <=3" をフィルター処理します。このサブスクリプションの仮想キューは、MessageNumber カスタム プロパティ値が 3 以下のメッセージのみを受信する必要があります。

4) SqlFilter を使用して「MessageNumber <=3」をフィルタリングする「HighMessages」サブスクリプションを作成します。このサブスクリプションの仮想キューは、MessageNumber カスタム プロパティ値が 3 より大きいメッセージのみを受信する必要があります。

5) 仲介メッセージの例のバッチを「TestTopic」に送信します (0<= MessageNumber <7)

6) 3 つのサブスクリプションすべてのメッセージを受信し、それらがフィルター処理されたことを示します。

例が機能しない理由を見つけたと思います。これを行う方法の基本的な例も見たいと思うかもしれない他の人のために、修正された Java コードを以下の回答として含めます。

4

1 に答える 1

5

ドキュメントの説明に従って Azure portal から既定の管理資格情報を取得した後、アプリケーションは次のように Service Bus 名前空間の ServiceBusContract オブジェクトを取得できました。

public class Service 
{
private Configuration config;
public Service() 
{
   String namespace = "jasper";
   String issuer = "owner";
   String key = "BB9BB9BBBbBBBbBbbBBbB99SS9b+Bb9BbB+bbBBbBB9=";
   String serviceBusRootUri = ".servicebus.windows.net";
   String wrapRootUri = "-sb.accesscontrol.windows.net/WRAPv0.9";       
   this.config = ServiceBusConfiguration.configureWithWrapAuthentication(
      namespace, 
      issuer, 
      key,
      serviceBusRootUri,
      wrapRootUri);     
}   
public ServiceBusContract getservice()
{       
   ServiceBusContract service = ServiceBusService.create(config);
   return service;
}   
}

次に、次の Java コードを使用して、「TestTopic」トピックへの 3 つのサブスクリプションを作成できます。「TestTopic」は「jasper」ネームスペースにすでに存在している必要があります。「AllMessages」サブスクリプションはデフォルトで、トピックに送信されたすべてのメッセージを受信します。「LowMessages」および「HighMessages」サブスクリプションは、SqlFilter ルールを使用して、MessageNumber カスタム プロパティの値に基づいてメッセージをフィルタリングします。元のサンプル コードでは、ルール名を指定する必要があることと、デフォルト ルールを削除する必要があることが省略されています。デフォルト ルールを削除しない場合、サブスクリプションは引き続きすべてのメッセージを受信します。

public class Make_sub_rule 
{
public static void main(String[] args) throws ServiceException {        
   Service creds = new Service();
   ServiceBusContract service = creds.getservice();         
   SubscriptionInfo subInfo = new SubscriptionInfo("AllMessages");
   service.createSubscription("TestTopic", subInfo);
   System.out.println(subInfo.getName() + " Default Rules");

   SubscriptionInfo subInfo1 = new SubscriptionInfo("LowMessages");
   CreateSubscriptionResult result1 = service.createSubscription("TestTopic", subInfo1);
   RuleInfo ruleInfo1 = new RuleInfo("RULENAME1");
   ruleInfo1 = ruleInfo1.withSqlExpressionFilter("MessageNumber <= 3");
   CreateRuleResult ruleResult1 = 
      service.createRule("TestTopic", "LowMessages", ruleInfo1);
   service.deleteRule("TestTopic", "LowMessages", "$Default");
   System.out.println(subInfo1.getName() + " " + result1.toString());
   System.out.println(ruleInfo1.getName() + " " + ruleResult1.toString());

   SubscriptionInfo subInfo2 = new SubscriptionInfo("HighMessages");
   CreateSubscriptionResult result2 = service.createSubscription("TestTopic", subInfo2);
   RuleInfo ruleInfo2 = new RuleInfo("RULENAME2");
   ruleInfo2 = ruleInfo2.withSqlExpressionFilter("MessageNumber > 3");
   CreateRuleResult ruleResult2 = 
      service.createRule("TestTopic", "HighMessages", ruleInfo2);
   service.deleteRule("TestTopic", "HighMessages", "$Default");
   System.out.println(subInfo2.getName() + " " + result2.toString());
   System.out.println(ruleInfo2.getName() + " " + ruleResult2.toString());
    }
}

以下は、仲介メッセージのバッチを「TestTopic」に送信し、MessageNumber カスタム プロパティの値を増やします。

public class SendSbMsTopicB 
{
public static void main(String[] args) throws ServiceException {        
   Service creds = new Service();
   ServiceBusContract service = creds.getservice(); 
   for (int i=0; i<7; i++) 
   {
   BrokeredMessage message = new BrokeredMessage("Test message" + i);
   message.setLabel("Day" + i);
   message.setProperty("MessageNumber", i);
   message.setProperty("CustomProperty", "CustomTestValue" + i);
   service.sendTopicMessage("TestTopic", message);
   System.out.println("send MessageNumber " + i + " to topic");
   }
}
}

次のコードを繰り返し実行して、「AllMessages」、「LowMessages」、または「HighMessages」サブスクリプションの仮想キューを読み取ります (subscriptionName の値を変更します)。各メッセージは、そのサブスクリプションのキューに残っているメッセージがなくなるまで、読み取られるときに仮想キューから削除されます。複数のサブスクリプションが同じメッセージを受信する可能性があり、フィルタリングされたサブスクリプションがすべてのメッセージを受信するわけではないことに注意してください。

public class GetSbMessSub 
{
public static void main(String[] args) throws ServiceException {        
   Service creds = new Service();
   ServiceBusContract service = creds.getservice();     
   String subscriptionName = "LowMessages";
   ReceiveMessageOptions opts = ReceiveMessageOptions.DEFAULT;
   opts.setReceiveMode(ReceiveMode.PEEK_LOCK);
   ReceiveSubscriptionMessageResult resultQM = service.receiveSubscriptionMessage("TestTopic", subscriptionName, opts);
   BrokeredMessage message = resultQM.getValue();       
   if (message != null && message.getMessageId() != null) 
   {
   try {
   System.out.println("Subscription: " + subscriptionName);
   System.out.println("MessageNumber: " + message.getProperty("MessageNumber"));
   service.deleteMessage(message);}
   catch (Exception ex){
   System.out.println("Inner exception encountered!");
   service.unlockMessage(message);}
   }
   else {System.out.println("There are no more messages.");}                
   }    
}
于 2013-07-02T22:22:55.630 に答える