首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Java筛选对Windows Azure Service Bus主题的订阅

使用Java筛选对Windows Azure Service Bus主题的订阅
EN

Stack Overflow用户
提问于 2013-07-03 06:22:56
回答 1查看 2.5K关注 0票数 2

我想在我的Java应用程序中使用具有订阅筛选器的Windows Azure Service Bus主题。我正在使用Windows Azure Plugin for Eclipse with Java (by Microsoft Open Technologies)和Windows Azure SDK2.0。

我发现微软网站上显示如何使用Java API执行此操作的basic example code不起作用。

在使用API的Java应用程序中,基本示例代码应该如何以编程方式完成以下任务?

1)为我已有的命名空间中已有的TestTopic获取一个ServiceBusContract对象。

2)使用默认的MatchAll过滤器创建AllMessages订阅。此订阅接收发送到其虚拟队列中的“TestTopic”的所有消息。

3)使用SqlFilter过滤器创建LowMessages订阅,过滤出MessageNumber<=3。此订阅的虚拟队列应该只接收MessageNumber自定义属性值小于或等于3的消息。

4)使用SqlFilter创建HighMessages订阅,过滤出MessageNumber<=3。此订阅的虚拟队列应该只接收MessageNumber自定义属性值大于3的消息。

5)使用( 0<= MessageNumber <7)向“TestTopic”发送一批示例代理消息

6)接收所有三个订阅的消息,并显示它们已被过滤。

我相信我找到了示例不能工作的原因,我将更正后的Java代码作为下面的答案,供其他可能也希望了解如何做到这一点的基本示例的人参考。

EN

回答 1

Stack Overflow用户

发布于 2013-07-03 06:22:56

在从the documentation中描述的Azure门户获取我的默认管理凭据后,我的应用程序能够为我的服务总线命名空间获取ServiceBusContract对象,如下所示:

代码语言:javascript
复制
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”主题的三个订阅。“jasper”命名空间中必须已经存在“TestTopic”。“AllMessages”订阅是默认的,它接收发送到主题的所有消息。“LowMessages”和“HighMessages”订阅使用SqlFilter规则根据MessageNumber自定义属性的值过滤消息。原始示例代码省略了必须提供规则名称以及必须删除默认规则的内容。如果不删除默认规则,订阅仍会接收所有消息。

代码语言:javascript
复制
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自定义属性的值。

代码语言:javascript
复制
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的值)。每条消息在被读取时都会从虚拟队列中删除,直到该订阅的队列中没有剩余的消息为止。请注意,多个订阅可以接收相同的消息,并且筛选的订阅不会接收所有消息。

代码语言:javascript
复制
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.");}                
   }    
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17436809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档