From c83e39441243b7db8293f1c161ee203faaf360ef Mon Sep 17 00:00:00 2001 From: Vitaly Takmazov Date: Thu, 15 Dec 2016 10:34:18 +0300 Subject: juick-notifications: RestService and GCM cleanup --- .../java/com/juick/components/Notifications.java | 30 +++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) (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 b06e0abf..6de648cf 100644 --- a/juick-notifications/src/main/java/com/juick/components/Notifications.java +++ b/juick-notifications/src/main/java/com/juick/components/Notifications.java @@ -54,6 +54,7 @@ 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.stream.Collectors; @@ -76,6 +77,8 @@ public class Notifications implements AutoCloseable { private final ObjectMapper mapper; + private final List invalidGCMTokens; + @Inject private ApnsService apns; @@ -93,6 +96,7 @@ 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<>()); } @PostConstruct @@ -134,7 +138,16 @@ public class Notifications implements AutoCloseable { MulticastResult result = GCMSender.send(message, regids, 3); List results = result.getResults(); for (int i = 0; i < results.size(); i++) { - logger.info("RES {}: {}", i, results.get(i)); + Result currentResult = results.get(i); + logger.info("RES {}: {}", i, currentResult); + List errorCodes = Arrays.asList(Constants.ERROR_MISMATCH_SENDER_ID, Constants.ERROR_NOT_REGISTERED); + if (errorCodes.contains(currentResult.getErrorCodeName())) { + // assuming results are in order of regids + // http://stackoverflow.com/a/11594531/1097384 + String currentId = regids.get(i); + logger.info("{} is scheduled to remove", currentId); + addInvalidGCMToken(currentId); + } } } catch (IOException ex) { logger.error(ex.getMessage(), ex); @@ -283,4 +296,19 @@ public class Notifications implements AutoCloseable { .map(x -> x.getName() + ": " + x.getValue()) .collect(Collectors.joining("\n")); } + + public void addInvalidGCMToken(String token) { + synchronized (invalidGCMTokens) { + invalidGCMTokens.add(token); + } + } + public List getInvalidGCMTokens() { + return invalidGCMTokens; + } + public void cleanupGCMTokens() { + logger.info("removed {} tokens", invalidGCMTokens.size()); + synchronized (invalidGCMTokens) { + invalidGCMTokens.clear(); + } + } } -- cgit v1.2.3