gpt4 book ai didi

azure - 使用 Java 过滤对 Windows Azure 服务总线主题的订阅

转载 作者:行者123 更新时间:2023-12-02 04:59:03 29 4
gpt4 key购买 nike

我想在我的 Java 应用程序中将 Windows Azure 服务总线主题与订阅筛选器结合使用。我正在使用Windows Azure Plugin for Eclipse with Java (by Microsoft Open Technologies)和 Windows Azure SDK 2.0。

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

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

1) 获取现有命名空间中现有“TestTopic”的 ServiceBusContract 对象。

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

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

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

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

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

我相信我找到了该示例不起作用的原因,并且我将更正后的 Java 代码作为答案包含在下面,供其他可能也想查看如何执行此操作的基本示例的其他人使用。

最佳答案

按照 the documentation 中所述从 Azure 门户获取我的默认管理凭据后我的应用程序能够获取我的服务总线命名空间的 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”主题的三个订阅。 “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.");}
}
}

关于azure - 使用 Java 过滤对 Windows Azure 服务总线主题的订阅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17436809/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com