notifications scrolls

This commit is contained in:
Michele Artini 2020-07-07 12:09:03 +02:00
parent 737df27c41
commit 798294fc09
4 changed files with 37 additions and 40 deletions

View File

@ -1,6 +1,7 @@
package eu.dnetlib.lbs.openaire;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@ -20,9 +21,8 @@ import org.elasticsearch.search.aggregations.bucket.nested.ParsedNested;
import org.elasticsearch.search.aggregations.bucket.terms.ParsedStringTerms;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.elasticsearch.core.AbstractElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.ElasticSearchScrollUtils;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.SearchScrollHits;
@ -69,6 +69,8 @@ public class OpenaireBrokerController extends AbstractLbsController {
@Autowired
private ElasticSearchProperties props;
private static final long SCROLL_TIMEOUT_IN_MILLIS = 5 * 60 * 1000;
private static final Log log = LogFactory.getLog(OpenaireBrokerController.class);
@ApiOperation("Return the datasources having events")
@ -230,7 +232,7 @@ public class OpenaireBrokerController extends AbstractLbsController {
if (optSub.isPresent()) {
final AbstractElasticsearchTemplate esTemplate = (AbstractElasticsearchTemplate) esOperations;
final ElasticsearchRestTemplate esTemplate = (ElasticsearchRestTemplate) esOperations;
final NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.matchQuery("subscriptionId", subscrId))
@ -239,13 +241,12 @@ public class OpenaireBrokerController extends AbstractLbsController {
.build();
final SearchScrollHits<Notification> scroll =
ElasticSearchScrollUtils.startScroll(esTemplate, IndexCoordinates.of(props.getNotificationsIndexName()), searchQuery, Notification.class);
esTemplate.searchScrollStart(SCROLL_TIMEOUT_IN_MILLIS, searchQuery, Notification.class, IndexCoordinates.of(props.getNotificationsIndexName()));
if (scroll.hasSearchHits()) {
final List<OaBrokerEventPayload> values = calculateEventPayloads(scroll);
return new ScrollPage(scroll.getScrollId(), values.isEmpty() || scroll.getScrollId() == null, values);
} else {
ElasticSearchScrollUtils.clearScroll(esTemplate, scroll.getScrollId());
esTemplate.searchScrollClear(Arrays.asList(scroll.getScrollId()));
return new ScrollPage(null, true, new ArrayList<>());
}
@ -260,16 +261,15 @@ public class OpenaireBrokerController extends AbstractLbsController {
@GetMapping("/scroll/notifications/{scrollId}")
public ScrollPage scrollNotifications(@PathVariable final String scrollId) {
final AbstractElasticsearchTemplate esTemplate = (AbstractElasticsearchTemplate) esOperations;
final ElasticsearchRestTemplate esTemplate = (ElasticsearchRestTemplate) esOperations;
final SearchScrollHits<Notification> scroll =
ElasticSearchScrollUtils.continueScroll(esTemplate, IndexCoordinates.of(props.getNotificationsIndexName()), scrollId, Notification.class);
esTemplate.searchScrollContinue(scrollId, SCROLL_TIMEOUT_IN_MILLIS, Notification.class, IndexCoordinates.of(props.getNotificationsIndexName()));
if (scroll.hasSearchHits()) {
final List<OaBrokerEventPayload> values = calculateEventPayloads(scroll);
return new ScrollPage(scroll.getScrollId(), values.isEmpty() || scroll.getScrollId() == null, values);
} else {
ElasticSearchScrollUtils.clearScroll(esTemplate, scroll.getScrollId());
esTemplate.searchScrollClear(Arrays.asList(scroll.getScrollId()));
return new ScrollPage(null, true, new ArrayList<>());
}
}

View File

@ -1,28 +0,0 @@
package org.springframework.data.elasticsearch.core;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.core.query.Query;
public class ElasticSearchScrollUtils {
private static final long SCROLL_TIMEOUT_IN_MILLIS = 5 * 60 * 1000;
public static <T> SearchScrollHits<T> startScroll(final AbstractElasticsearchTemplate esTemplate,
final IndexCoordinates index,
final Query searchQuery,
final Class<T> clazz) {
return esTemplate.searchScrollStart(SCROLL_TIMEOUT_IN_MILLIS, searchQuery, clazz, index);
}
public static <T> SearchScrollHits<T> continueScroll(final AbstractElasticsearchTemplate esTemplate,
final IndexCoordinates index,
final String scrollId,
final Class<T> clazz) {
return esTemplate.searchScrollContinue(scrollId, SCROLL_TIMEOUT_IN_MILLIS, clazz, index);
}
public static void clearScroll(final AbstractElasticsearchTemplate esTemplate, final String scrollId) {
esTemplate.searchScrollClear(scrollId);
}
}

View File

@ -26,14 +26,14 @@ lbs.elastic.eventsIndexType = event
lbs.elastic.notificationsIndexName = notifications_beta_michele
lbs.elastic.notificationsIndexType = notification
lbs.mail.from = lbs-noreply@research-infrastructures.eu
lbs.mail.from = notifications-noreply@openaire.eu
lbs.mail.fromName = Literature Broker Service
lbs.mail.cc = michele.artini@isti.cnr.it
lbs.mail.smtpHost = smtp.isti.cnr.it
lbs.mail.smtpPort = 587
lbs.mail.smtpUser = smtp-dnet
lbs.mail.smtpPassword = hhr*7932
lbs.mail.message.template = classpath:/templates/mail.st
lbs.mail.message.template = classpath:/templates/openaire_mail.st
lbs.queues.maxReturnedValues = 1000

View File

@ -0,0 +1,25 @@
You have received this mail because you are owner of the following subscription:
<ul>
<li><b>Topic: </b>$sub.topic$</li>
<li><b>Frequency: </b>$sub.frequency$</li>
<li><b>Mode: </b>$sub.mode$</li>
</ul>
<hr />
<p>
There are $total$ event(s) related to the following publications<br />
(The list is limited to $max$ events, see the Content Provider Dashboard for all):
</p>
<ol>
$events:{e|
<li>
<b>$e.map.targetResultTitle$</b><br/>
<small style="color: grey">$e.map.targetAuthors$</small>
</li>
}$
</ol>
<hr />
This email message was auto-generated. Please do not respond.