我正在开发一个从Azure Service Bus队列中提取消息的Java应用程序.我正在使用Java Azure API(com.microsoft.windowsazure.services).我遇到的问题是,经过处理后删除代码消息有时会失败.
我的应用程序使用peek-lock接收模式,使用ServiceBusContract对象上的receiveQueueMessage()方法从队列中提取消息.一旦消息被成功处理,我通过调用deleteMessage()方法从队列中删除消息(我相信这个方法对应于.NET API中的Complete()方法).
但是,有时此方法调用失败.comMun.jersey.api.client.UniformInterfaceException异常由deleteMessage()记录到控制台,但它不会抛出此异常(我将在下面生成输出).异常似乎告诉我无法找到该消息.发生这种情况时,消息将保留在队列中.实际上,下一次调用receiveQueueMessage()会再次检索此消息.然后删除失败一次或两次,然后成功.之后检索的消息成功删除.
以下是出现问题的代码:
ReceiveMessageOptions receiveOptions = ReceiveMessageOptions.DEFAULT;
receiveOptions.setReceiveMode(ReceiveMode.PEEK_LOCK);
BrokeredMessage message = serviceBus.receiveQueueMessage("my_queue",receiveOptions).getValue();
// Process the message
System.out.println("Delete message with ID: "+message.getMessageId());
serviceBus.deleteMessage(message);
Run Code Online (Sandbox Code Playgroud)
以下是出现问题时输出的示例:
Delete message with ID: 100790000086491
2013/01/22 12:58:29 com.microsoft.windowsazure.services.serviceBus.implementation.ServiceBusExceptionProcessor processCatch
WARNING: com.sun.jersey.api.client.UniformInterfaceException: DELETE https://voyagernetzmessaging.servicebus.windows.net/sms_queue/messages/24/efa56a1c-95e8-4cd6-931a-972eac21563a returned a response status of 404 Not Found
com.sun.jersey.api.client.UniformInterfaceException: DELETE https://voyagernetzmessaging.servicebus.windows.net/sms_queue/messages/24/efa56a1c-95e8-4cd6-931a-972eac21563a returned a response status of 404 Not Found
at com.sun.jersey.api.client.WebResource.voidHandle(WebResource.java:697)
at com.sun.jersey.api.client.WebResource.delete(WebResource.java:261)
at com.microsoft.windowsazure.services.serviceBus.implementation.ServiceBusRestProxy.deleteMessage(ServiceBusRestProxy.java:260)
at com.microsoft.windowsazure.services.serviceBus.implementation.ServiceBusExceptionProcessor.deleteMessage(ServiceBusExceptionProcessor.java:176)
at microworks.voyagernetzmessaging.smsservice.SmsSender$Runner.finalizeSms(SmsSender.java:114)
at microworks.voyagernetzmessaging.smsservice.SmsSender$Runner.finalizeSms(SmsSender.java:119)
at microworks.voyagernetzmessaging.smsservice.SmsSender$Runner.run(SmsSender.java:340)
com.microsoft.windowsazure.services.core.ServiceException: com.sun.jersey.api.client.UniformInterfaceException: DELETE …Run Code Online (Sandbox Code Playgroud) 我使用AzureQueue在角色之间进行通信.我的消息如"GoToMaintenanceMode","StopSendingEmails","DoNotAcceptRequests"等.但我意识到,当我有多个实例时,由于队列消息,它将无法用于我的场景,一次只显示1个实例.
所以我的问题是旁边的选项是否有一个优雅的方式来处理像Role.AllInstances.Run()等问题?
我正在使用它的方法: 实例查看消息,将它自己的实例id添加到消息中并将其放回队列,如果消息包含它自己的实例id,则不会查看消息.
PS我不想实现TCP侦听器,如果有的话请求原生解决方案.
延迟队列是一个队列,其中每个消息都有一个与之关联的延迟时间,并且只有在其延迟到期时才能获取消息.队列的头部是那个过去延迟到期的消息.如果没有延迟到期,则没有头,而dequeue将返回null.
实际上,我正在使用Azure编写云应用程序,而在Azure中,只有FIFO队列可用,而不是优先级/延迟队列.所以我来到这里看是否有人可以给我一些指示,从我可以从正确的方向开始.我google了很多,但只发现了Java中的延迟队列实现,而没有标准的教程/研究论文,一般性地谈论延迟队列.
编辑:
我有什么代码?
实际上,我必须首先设计这些东西并将它呈现给我的经理,一旦我们完成设计,那么只有我才能开始编码.
关于场景的更多细节
它是基于主/从模型的分布式应用程序.主服务器生成消息并将它们放入Azure Service Bus队列,并且有多个从服务器(在多台计算机上运行)从队列中读取并进行处理.如果主机发生故障,则其中一个从机充当主机并开始生成消息.我不想在主服务器中存储任何状态信息,因为如果主服务器关闭,所有状态信息也将随之而来.
如果我没有指定分区密钥并因此执行所有分区的扫描,那么扫描是否会自动与并发扫描的每个分区并行进行?
谢谢.