From 18a8595d2150edc92084c94b9dbb8f4309d3ed36 Mon Sep 17 00:00:00 2001 From: Vitaly Takmazov Date: Fri, 16 Dec 2016 13:25:45 +0300 Subject: juick-notifications: MPNS cleanup --- .../main/java/com/juick/components/CleanUp.java | 11 +++-- .../java/com/juick/components/Notifications.java | 48 ++++++++++++++-------- 2 files changed, 39 insertions(+), 20 deletions(-) diff --git a/juick-notifications/src/main/java/com/juick/components/CleanUp.java b/juick-notifications/src/main/java/com/juick/components/CleanUp.java index 7b800fec..9714e597 100644 --- a/juick-notifications/src/main/java/com/juick/components/CleanUp.java +++ b/juick-notifications/src/main/java/com/juick/components/CleanUp.java @@ -8,8 +8,8 @@ import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import javax.inject.Inject; -import java.util.ArrayList; import java.util.Collection; +import java.util.stream.Collectors; /** * Created by vitalyster on 22.11.2016. @@ -34,12 +34,15 @@ public class CleanUp { int count = devices.size(); if (count > 0) { logger.info("{} tokens to delete", count); - tokenService.deleteTokens("apns", new ArrayList<>(devices)); + tokenService.deleteTokens("apns", devices.stream().collect(Collectors.toList())); } else { - logger.info("No APNS tokens to delete"); + logger.debug("No APNS tokens to delete"); } logger.debug("initializing GCM tokens cleanup: {} tokens", push.getInvalidGCMTokens().size()); - tokenService.deleteTokens("gcm", push.getInvalidGCMTokens()); + tokenService.deleteTokens("gcm", push.getInvalidGCMTokens().stream().collect(Collectors.toList())); push.cleanupGCMTokens(); + logger.debug("initializing MPNS tokens cleanup: {} tokens", push.getInvalidMPNSTokens().size()); + tokenService.deleteTokens("mpns", push.getInvalidMPNSTokens().stream().collect(Collectors.toList())); + push.cleanupMPNSTokens(); } } diff --git a/juick-notifications/src/main/java/com/juick/components/Notifications.java b/juick-notifications/src/main/java/com/juick/components/Notifications.java index 6de648cf..0a4d1292 100644 --- a/juick-notifications/src/main/java/com/juick/components/Notifications.java +++ b/juick-notifications/src/main/java/com/juick/components/Notifications.java @@ -26,10 +26,7 @@ import com.notnoop.apns.APNS; import com.notnoop.apns.ApnsService; import org.apache.commons.lang3.StringEscapeUtils; import org.apache.commons.lang3.math.NumberUtils; -import org.apache.http.Consts; -import org.apache.http.Header; -import org.apache.http.HttpResponse; -import org.apache.http.NameValuePair; +import org.apache.http.*; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; @@ -52,10 +49,7 @@ import rocks.xmpp.extensions.component.accept.ExternalComponent; import javax.annotation.PostConstruct; import javax.inject.Inject; import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; /** @@ -77,7 +71,8 @@ public class Notifications implements AutoCloseable { private final ObjectMapper mapper; - private final List invalidGCMTokens; + private final Set invalidGCMTokens; + private final Set invalidMPNSTokens; @Inject private ApnsService apns; @@ -96,7 +91,8 @@ public class Notifications implements AutoCloseable { mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY); mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); mapper.setSerializationInclusion(JsonInclude.Include.NON_DEFAULT); - invalidGCMTokens = Collections.synchronizedList(new ArrayList<>()); + invalidGCMTokens = Collections.synchronizedSet(new HashSet<>()); + invalidMPNSTokens = Collections.synchronizedSet(new HashSet<>()); } @PostConstruct @@ -263,7 +259,7 @@ public class Notifications implements AutoCloseable { HttpResponse response = client.execute(httppost); int statusCode = response.getStatusLine().getStatusCode(); String responseContent = EntityUtils.toString(response.getEntity(), Consts.UTF_8); - if (statusCode != 200) { + if (statusCode != HttpStatus.SC_OK) { MPNSError error = mapper.readValue(responseContent, MPNSError.class); throw new IOException(error.getError() + ": " + error.getErrorDescription()); } @@ -284,9 +280,15 @@ public class Notifications implements AutoCloseable { httpPost.setEntity(entity); HttpResponse response = client.execute(httpPost); int statusCode = response.getStatusLine().getStatusCode(); - if (statusCode != 200) { - String headersContent = stringifyWnsHttpHeaders(response.getAllHeaders()); - throw new IOException(headersContent); + if (statusCode != HttpStatus.SC_OK) { + if (statusCode == HttpStatus.SC_GONE) { + // expired + logger.info("{} is scheduled to remove", url); + addInvalidMPNSToken(url); + } else { + String headersContent = stringifyWnsHttpHeaders(response.getAllHeaders()); + throw new IOException(headersContent); + } } } @@ -302,13 +304,27 @@ public class Notifications implements AutoCloseable { invalidGCMTokens.add(token); } } - public List getInvalidGCMTokens() { + public Set getInvalidGCMTokens() { return invalidGCMTokens; } public void cleanupGCMTokens() { - logger.info("removed {} tokens", invalidGCMTokens.size()); + logger.info("removed {} GCM tokens", invalidGCMTokens.size()); synchronized (invalidGCMTokens) { invalidGCMTokens.clear(); } } + public void addInvalidMPNSToken(String token) { + synchronized (invalidMPNSTokens) { + invalidMPNSTokens.add(token); + } + } + public Set getInvalidMPNSTokens() { + return invalidMPNSTokens; + } + public void cleanupMPNSTokens() { + logger.info("removed {} MPNS tokens", invalidMPNSTokens.size()); + synchronized (invalidMPNSTokens) { + invalidMPNSTokens.clear(); + } + } } -- cgit v1.2.3