QueryBuilder queryBuilder = termQuery("topic", topic);
SearchResponse searchResponse = client.prepareSearch()
.setIndices(pubSubIndexName)
.setTypes("subscribe")
.setSearchType(SearchType.SCAN)
.setScroll(new TimeValue(60000))
.setQuery(queryBuilder)
.addField("subscriber.channel")
.setSize(100)
.execute().actionGet();
boolean failed = searchResponse.getFailedShards() > 0 || searchResponse.isTimedOut();
if (failed) {
logger.error("searching for subscribers for topic {} failed: failed shards={} timeout={}",
topic, searchResponse.getFailedShards(), searchResponse.isTimedOut());
responseBuilder.field("subscribers", 0).field("failed", true);
channel.sendResponse(TYPE, responseBuilder.endObject());
responseBuilder.close();
return;
}
// look for subscribers
long totalHits = searchResponse.getHits().getTotalHits();
boolean zero = totalHits == 0L;
if (zero) {
responseBuilder.field("subscribers", 0).field("failed", false);
channel.sendResponse(TYPE, responseBuilder.endObject());
responseBuilder.close();
return;
}
// report the total number of subscribers online to the publisher
responseBuilder.field("subscribers", totalHits);
channel.sendResponse(TYPE, responseBuilder.endObject());
messageBuilder.close();
responseBuilder.close();
// checkpoint topic
service.checkpoint(topic);
// push phase - write the message to the subscribers. We have 60 seconds per 100 subscribers.
while (true) {
searchResponse = client.prepareSearchScroll(searchResponse.getScrollId())
.setScroll(new TimeValue(60000))
.execute().actionGet();
for (SearchHit hit : searchResponse.getHits()) {
// for message sync - update all subscribers with the current timestamp
service.checkpoint(hit.getId());
// find node address and channel ID