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 --- .../java/com/juick/components/Notifications.java | 48 ++++++++++++++-------- 1 file changed, 32 insertions(+), 16 deletions(-) (limited to 'juick-notifications/src/main/java/com/juick/components/Notifications.java') 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