了解用于Azure Groovy Java的长轮询客户端逻辑

时间:2015-12-17 18:44:52

标签: java rest azure groovy

前提: 我们有每周都执行的groovy脚本。我希望其中一个脚本打开HTTP客户端,并轮询服务总线队列/主题以获取消息。我有我的其余客户端代码工作从服务总线队列获取消息。我可以做一个" Get"每隔5秒,wireshark会显示它重用相同的TCP连接,这比我预期的更好,但它仍然不理想。

目标: 我想让这个http客户端进行长时间轮询",以提高效率并实现实际的实时处理。它似乎比我预期的更复杂。

问题: 当我做"删除"调用从服务总线队列中读取消息,它立即返回" HTTP / 1.1 204 No Content",并且连接关闭。我在客户端设置了超时,但我不认为这很重要。

这篇文章显示服务总线表示它支持长轮询,我认为这是很难的部分。 Azure Service Bus Queues

我觉得我不了解如何在代码中实现长轮询的基本知识。我的理解是,当队列中没有数据时,它应该延迟响应直到数据存在,或者直到我的客户端最终超时等待(这让我设置自己的断开连接/重新连接间隔)。我甚至不关心阻塞/非阻塞等,因为脚本执行已经分散到线程池中,并且将被强制终止并且所有这些。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

正确而简单的答案是,将以下内容添加到Azure REST API URL(带有服务总线)的末尾是使用该服务实现长轮询的方法:?timeout = 60,其中60告诉azure等待在无数据响应之前60秒。因此,您的应用程序可以每60秒检查一次数据,每个HTTP请求的内部超时为60秒。这将使TCP连接在该时间范围内保持打开状态,等待HTTP响应。

答案 1 :(得分:0)

为了理解长轮询,我建议您可以学习Wiki https://en.wikipedia.org/wiki/Comet_(programming)的条目Comet。并且有一个回答的线程(Long polling in java)解释了HttpURLConnection类支持Java长轮询的机制。

据我所知,Java Client而不是HttpURLConnection的一种简单方法是使用CometD的客户端库。您可以参考其官方文档https://docs.cometd.org/current/reference/#_java_clientClient Library部分,了解如何在Java中实现长轮询客户端。您可以在https://download.cometd.org/下载该库。

官方文档中的示例代码:

// Create (and eventually set up) Jetty's HttpClient:
HttpClient httpClient = new HttpClient();
httpClient.start();

// Prepare the transport
Map<String, Object> options = new HashMap<String, Object>();
ClientTransport transport = new LongPollingTransport(options, httpClient);

// Create the BayeuxClient
ClientSession client = new BayeuxClient("http://localhost:8080/cometd", transport);

// Here set up the BayeuxClient, for example:
// client.getChannel(Channel.META_CONNECT).addListener(new ClientSessionChannel.MessageListener() { 
    public void onMessage(ClientSessionChannel channel, Message message) {
        if (message.isSuccessful()) {
            // Here handshake is successful
        }
    }
});
client.handshake();

注意:Azure Service Bus有两个REST API,用于获取消息传递实体Get Entity https://msdn.microsoft.com/en-us/library/azure/hh780754.aspxEntities Discovery https://msdn.microsoft.com/en-us/library/azure/hh780782.aspx。您需要通过Delete Entity REST API手动删除使用过的消息传递实体。首先请求所有这些REST API需要access_token通过帖子请求Request a Token from ACS API以进行安全访问。