You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@usergrid.apache.org by sn...@apache.org on 2014/10/01 22:01:12 UTC
[13/19] git commit: changing task manager name;
adding more queue logic to push
changing task manager name; adding more queue logic to push
Project: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/commit/377b0747
Tree: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/tree/377b0747
Diff: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/diff/377b0747
Branch: refs/heads/two-dot-o-rebuildable-index
Commit: 377b0747d75cfb8c732cb075d21176f565185e45
Parents: abbd76e
Author: Shawn Feldman <sf...@apache.org>
Authored: Wed Oct 1 10:16:55 2014 -0600
Committer: Shawn Feldman <sf...@apache.org>
Committed: Wed Oct 1 10:16:55 2014 -0600
----------------------------------------------------------------------
.../notifications/ApplicationQueueManager.java | 23 ++-
.../notifications/SingleQueueTaskManager.java | 177 ------------------
.../services/notifications/TaskManager.java | 179 +++++++++++++++++++
.../services/notifications/TaskTracker.java | 4 +-
.../gcm/NotificationsServiceIT.java | 3 +-
5 files changed, 197 insertions(+), 189 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/377b0747/stack/services/src/main/java/org/apache/usergrid/services/notifications/ApplicationQueueManager.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/services/notifications/ApplicationQueueManager.java b/stack/services/src/main/java/org/apache/usergrid/services/notifications/ApplicationQueueManager.java
index cde14a5..a00d676 100644
--- a/stack/services/src/main/java/org/apache/usergrid/services/notifications/ApplicationQueueManager.java
+++ b/stack/services/src/main/java/org/apache/usergrid/services/notifications/ApplicationQueueManager.java
@@ -47,7 +47,7 @@ import java.util.concurrent.atomic.AtomicInteger;
*/
public class ApplicationQueueManager implements QueueManager {
- public static String DEFAULT_QUEUE_NAME = "notifications/queuelistenerv1_34;notifications/queuelistenerv1_35;notifications/queuelistenerv1_36";
+ public static String DEFAULT_QUEUE_NAME = "notifications/queuelistenerv1_40;notifications/queuelistenerv1_41;notifications/queuelistenerv1_42";
public static final String DEFAULT_QUEUE_PROPERTY = "usergrid.notifications.listener.queueName";
private static final Logger LOG = LoggerFactory.getLogger(ApplicationQueueManager.class);
@@ -234,7 +234,7 @@ public class ApplicationQueueManager implements QueueManager {
//do i have devices, and have i already started batching.
if (deviceCount.get() <= 0) {
- SingleQueueTaskManager taskManager = new SingleQueueTaskManager(em, qm, this, notification,queueName);
+ TaskManager taskManager = new TaskManager(em, qm, this, notification,queueName);
//if i'm in a test value will be false, do not mark finished for test orchestration, not ideal need real tests
taskManager.finishedBatch();
}
@@ -291,12 +291,13 @@ public class ApplicationQueueManager implements QueueManager {
final Map<Object, Notifier> notifierMap = getNotifierMap();
final QueueManager proxy = this;
- final ConcurrentHashMap<UUID,SingleQueueTaskManager> taskMap = new ConcurrentHashMap<UUID, SingleQueueTaskManager>(messages.size());
+ final ConcurrentHashMap<UUID,TaskManager> taskMap = new ConcurrentHashMap<UUID, TaskManager>(messages.size());
final ConcurrentHashMap<UUID,Notification> notificationMap = new ConcurrentHashMap<UUID, Notification>(messages.size());
final Func1<ApplicationQueueMessage, ApplicationQueueMessage> func = new Func1<ApplicationQueueMessage, ApplicationQueueMessage>() {
@Override
public ApplicationQueueMessage call(ApplicationQueueMessage message) {
+ boolean messageCommitted = false;
try {
LOG.info("start sending notification for device {} for Notification: {} on thread "+Thread.currentThread().getId(), message.getDeviceId(), message.getNotificationId());
@@ -307,10 +308,9 @@ public class ApplicationQueueManager implements QueueManager {
notification = em.get(message.getNotificationId(), Notification.class);
notificationMap.put(message.getNotificationId(), notification);
}
- SingleQueueTaskManager taskManager;
- taskManager = taskMap.get(message.getNotificationId());
+ TaskManager taskManager = taskMap.get(message.getNotificationId());
if (taskManager == null) {
- taskManager = new SingleQueueTaskManager(em, qm, proxy, notification,queuePath);
+ taskManager = new TaskManager(em, qm, proxy, notification,queuePath);
taskMap.putIfAbsent(message.getNotificationId(), taskManager);
taskManager = taskMap.get(message.getNotificationId());
}
@@ -332,7 +332,6 @@ public class ApplicationQueueManager implements QueueManager {
if (payload == null) {
LOG.debug("selected device {} for notification {} doesn't have a valid payload. skipping.", deviceUUID, notification.getUuid());
tracker.failed(0, "failed to match payload to " + message.getNotifierId() + " notifier");
-
} else {
long now = System.currentTimeMillis();
try {
@@ -345,12 +344,20 @@ public class ApplicationQueueManager implements QueueManager {
}
}
}
+ messageCommitted = true;
} finally {
sendMeter.mark();
}
} catch (Exception e) {
LOG.error("Failure while sending",e);
+ try {
+ if(!messageCommitted) {
+ qm.commitTransaction(queuePath, message.getTransaction(), null);
+ }
+ }catch (Exception queueException){
+ LOG.error("Failed to commit message.",queueException);
+ }
}
return message;
}
@@ -379,7 +386,7 @@ public class ApplicationQueueManager implements QueueManager {
for (ApplicationQueueMessage message : queueMessages) {
if (notifications.get(message.getNotificationId()) == null) {
try {
- SingleQueueTaskManager taskManager = taskMap.get(message.getNotificationId());
+ TaskManager taskManager = taskMap.get(message.getNotificationId());
notifications.put(message.getNotificationId(), message);
taskManager.finishedBatch();
} catch (Exception e) {
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/377b0747/stack/services/src/main/java/org/apache/usergrid/services/notifications/SingleQueueTaskManager.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/services/notifications/SingleQueueTaskManager.java b/stack/services/src/main/java/org/apache/usergrid/services/notifications/SingleQueueTaskManager.java
deleted file mode 100644
index e89267d..0000000
--- a/stack/services/src/main/java/org/apache/usergrid/services/notifications/SingleQueueTaskManager.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.usergrid.services.notifications;
-
-import org.apache.usergrid.persistence.EntityManager;
-import org.apache.usergrid.persistence.EntityRef;
-import org.apache.usergrid.persistence.SimpleEntityRef;
-import org.apache.usergrid.persistence.entities.Device;
-import org.apache.usergrid.persistence.entities.Notification;
-import org.apache.usergrid.persistence.entities.Notifier;
-import org.apache.usergrid.persistence.entities.Receipt;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.*;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.atomic.AtomicLong;
-
-public class SingleQueueTaskManager {
-
- private static final Logger LOG = LoggerFactory
- .getLogger(SingleQueueTaskManager.class);
- private final QueueManager proxy;
- private final String queuePath;
-
- private Notification notification;
- private AtomicLong successes = new AtomicLong();
- private AtomicLong failures = new AtomicLong();
- private org.apache.usergrid.mq.QueueManager qm;
- private EntityManager em;
- private ConcurrentHashMap<UUID, ApplicationQueueMessage> messageMap;
- private boolean hasFinished;
-
- public SingleQueueTaskManager(EntityManager em, org.apache.usergrid.mq.QueueManager qm, QueueManager proxy, Notification notification,String queuePath) {
- this.em = em;
- this.qm = qm;
- this.notification = notification;
- this.proxy = proxy;
- this.messageMap = new ConcurrentHashMap<UUID, ApplicationQueueMessage>();
- hasFinished = false;
- this.queuePath = queuePath;
- }
-
- public void addMessage(UUID deviceId, ApplicationQueueMessage message) {
- messageMap.put(deviceId, message);
- }
-
- public void completed(Notifier notifier, Receipt receipt, UUID deviceUUID, String newProviderId) throws Exception {
- LOG.debug("REMOVED {}", deviceUUID);
- try {
- EntityRef deviceRef = new SimpleEntityRef(Device.ENTITY_TYPE, deviceUUID);
- if (receipt != null) {
- LOG.debug("notification {} sent to device {}. saving receipt.", notification.getUuid(), deviceUUID);
- receipt.setSent(System.currentTimeMillis());
- this.saveReceipt(notification, deviceRef, receipt);
- LOG.debug("notification {} receipt saved for device {}", notification.getUuid(), deviceUUID);
- successes.incrementAndGet();
- }
-
- LOG.debug("notification {} removing device {} from remaining", notification.getUuid(), deviceUUID);
- qm.commitTransaction(queuePath, messageMap.get(deviceUUID).getTransaction(), null);
- if (newProviderId != null) {
- LOG.debug("notification {} replacing device {} notifierId", notification.getUuid(), deviceUUID);
- replaceProviderId(deviceRef, notifier, newProviderId);
- }
-
- LOG.debug("notification {} completed device {}", notification.getUuid(), deviceUUID);
-
- } finally {
- LOG.debug("COUNT is: {}", successes.get());
- if (hasFinished) { //process has finished but notifications are still coming in
- finishedBatch();
-
- }
- }
- }
-
- public void failed(Notifier notifier, Receipt receipt, UUID deviceUUID, Object code, String message) throws Exception {
-
- try {
- if (LOG.isDebugEnabled()) {
- StringBuilder sb = new StringBuilder();
- sb.append("notification ").append(notification.getUuid());
- sb.append(" for device ").append(deviceUUID);
- sb.append(" got error ").append(code);
- LOG.debug(sb.toString());
- }
-
- failures.incrementAndGet();
- if (receipt.getUuid() != null) {
- successes.decrementAndGet();
- }
- receipt.setErrorCode(code);
- receipt.setErrorMessage(message);
- this.saveReceipt(notification, new SimpleEntityRef(Device.ENTITY_TYPE, deviceUUID), receipt);
- LOG.debug("notification {} receipt saved for device {}", notification.getUuid(), deviceUUID);
- } finally {
- completed(notifier, null, deviceUUID, null);
- }
- }
-
- /*
- * called from TaskManager - creates a persistent receipt and updates the
- * passed one w/ the UUID
- */
- private void saveReceipt(EntityRef notification, EntityRef device, Receipt receipt) throws Exception {
- if (receipt.getUuid() == null) {
- Receipt savedReceipt = em.create(receipt);
- receipt.setUuid(savedReceipt.getUuid());
-
- List<EntityRef> entities = Arrays.asList(notification, device);
-// em.addToCollections(entities, Notification.RECEIPTS_COLLECTION, savedReceipt);
- } else {
- em.update(receipt);
- }
- }
-
- protected void replaceProviderId(EntityRef device, Notifier notifier,
- String newProviderId) throws Exception {
- Object value = em.getProperty(device, notifier.getName()
- + NotificationsService.NOTIFIER_ID_POSTFIX);
- if (value != null) {
- em.setProperty(device, notifier.getName() + NotificationsService.NOTIFIER_ID_POSTFIX, newProviderId);
- } else {
- value = em.getProperty(device, notifier.getUuid()
- + NotificationsService.NOTIFIER_ID_POSTFIX);
- if (value != null) {
- em.setProperty(device, notifier.getUuid() + NotificationsService.NOTIFIER_ID_POSTFIX, newProviderId);
- }
- }
- }
-
- public void finishedBatch() throws Exception {
- long successes = this.successes.getAndSet(0); //reset counters
- long failures = this.failures.getAndSet(0); //reset counters
- this.hasFinished = true;
-
- // refresh notification
- Notification notification = em.get(this.notification.getUuid(), Notification.class);
- notification.setModified(System.currentTimeMillis());
-
- long sent = successes, errors = failures;
- //and write them out again, this will produce the most accurate count
- Map<String, Long> stats = new HashMap<>(2);
- stats.put("sent", sent);
- stats.put("errors", errors);
- notification.updateStatistics(successes, errors);
-
- //none of this is known and should you ever do this
- if (notification.getExpectedCount() <= (notification.getStatistics().get("sent") + notification.getStatistics().get("errors"))) {
- Map<String, Object> properties = new HashMap<>();
- notification.setFinished(notification.getModified());
- properties.put("finished", notification.getModified());
- properties.put("state", notification.getState());
- LOG.info("done sending to devices in {} ms", notification.getFinished() - notification.getStarted());
- notification.addProperties(properties);
- }
- LOG.info("notification finished batch: {} of {} devices", notification.getUuid(),sent+errors);
- em.update(notification);
-// Set<Notifier> notifiers = new HashSet<>(proxy.getNotifierMap().values()); // remove dups
-// proxy.asyncCheckForInactiveDevices(notifiers);
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/377b0747/stack/services/src/main/java/org/apache/usergrid/services/notifications/TaskManager.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/services/notifications/TaskManager.java b/stack/services/src/main/java/org/apache/usergrid/services/notifications/TaskManager.java
new file mode 100644
index 0000000..f163431
--- /dev/null
+++ b/stack/services/src/main/java/org/apache/usergrid/services/notifications/TaskManager.java
@@ -0,0 +1,179 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.usergrid.services.notifications;
+
+import org.apache.usergrid.persistence.EntityManager;
+import org.apache.usergrid.persistence.EntityRef;
+import org.apache.usergrid.persistence.SimpleEntityRef;
+import org.apache.usergrid.persistence.entities.Device;
+import org.apache.usergrid.persistence.entities.Notification;
+import org.apache.usergrid.persistence.entities.Notifier;
+import org.apache.usergrid.persistence.entities.Receipt;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicLong;
+
+public class TaskManager {
+
+ private static final Logger LOG = LoggerFactory
+ .getLogger(TaskManager.class);
+ private final QueueManager proxy;
+ private final String queuePath;
+
+ private Notification notification;
+ private AtomicLong successes = new AtomicLong();
+ private AtomicLong failures = new AtomicLong();
+ private org.apache.usergrid.mq.QueueManager qm;
+ private EntityManager em;
+ private ConcurrentHashMap<UUID, ApplicationQueueMessage> messageMap;
+ private boolean hasFinished;
+
+ public TaskManager(EntityManager em, org.apache.usergrid.mq.QueueManager qm, QueueManager proxy, Notification notification, String queuePath) {
+ this.em = em;
+ this.qm = qm;
+ this.notification = notification;
+ this.proxy = proxy;
+ this.messageMap = new ConcurrentHashMap<UUID, ApplicationQueueMessage>();
+ hasFinished = false;
+ this.queuePath = queuePath;
+ }
+
+ public void addMessage(UUID deviceId, ApplicationQueueMessage message) {
+ messageMap.put(deviceId, message);
+ }
+
+ public void completed(Notifier notifier, Receipt receipt, UUID deviceUUID, String newProviderId) throws Exception {
+ LOG.debug("REMOVED {}", deviceUUID);
+ try {
+ LOG.debug("notification {} removing device {} from remaining", notification.getUuid(), deviceUUID);
+ qm.commitTransaction(queuePath, messageMap.get(deviceUUID).getTransaction(), null);
+
+ EntityRef deviceRef = new SimpleEntityRef(Device.ENTITY_TYPE, deviceUUID);
+ if (receipt != null) {
+ LOG.debug("notification {} sent to device {}. saving receipt.", notification.getUuid(), deviceUUID);
+ receipt.setSent(System.currentTimeMillis());
+ this.saveReceipt(notification, deviceRef, receipt);
+ LOG.debug("notification {} receipt saved for device {}", notification.getUuid(), deviceUUID);
+ successes.incrementAndGet();
+ }
+
+
+ if (newProviderId != null) {
+ LOG.debug("notification {} replacing device {} notifierId", notification.getUuid(), deviceUUID);
+ replaceProviderId(deviceRef, notifier, newProviderId);
+ }
+
+ LOG.debug("notification {} completed device {}", notification.getUuid(), deviceUUID);
+
+ } finally {
+ LOG.debug("COUNT is: {}", successes.get());
+ if (hasFinished) { //process has finished but notifications are still coming in
+ finishedBatch();
+
+ }
+ }
+ }
+
+ public void failed(Notifier notifier, Receipt receipt, UUID deviceUUID, Object code, String message) throws Exception {
+
+ try {
+ if (LOG.isDebugEnabled()) {
+ StringBuilder sb = new StringBuilder();
+ sb.append("notification ").append(notification.getUuid());
+ sb.append(" for device ").append(deviceUUID);
+ sb.append(" got error ").append(code);
+ LOG.debug(sb.toString());
+ }
+
+ failures.incrementAndGet();
+ if (receipt.getUuid() != null) {
+ successes.decrementAndGet();
+ }
+ receipt.setErrorCode(code);
+ receipt.setErrorMessage(message);
+ this.saveReceipt(notification, new SimpleEntityRef(Device.ENTITY_TYPE, deviceUUID), receipt);
+ LOG.debug("notification {} receipt saved for device {}", notification.getUuid(), deviceUUID);
+ } finally {
+ completed(notifier, null, deviceUUID, null);
+ }
+ }
+
+ /*
+ * called from TaskManager - creates a persistent receipt and updates the
+ * passed one w/ the UUID
+ */
+ private void saveReceipt(EntityRef notification, EntityRef device, Receipt receipt) throws Exception {
+ if (receipt.getUuid() == null) {
+ Receipt savedReceipt = em.create(receipt);
+ receipt.setUuid(savedReceipt.getUuid());
+
+ List<EntityRef> entities = Arrays.asList(notification, device);
+// em.addToCollections(entities, Notification.RECEIPTS_COLLECTION, savedReceipt);
+ } else {
+ em.update(receipt);
+ }
+ }
+
+ protected void replaceProviderId(EntityRef device, Notifier notifier,
+ String newProviderId) throws Exception {
+ Object value = em.getProperty(device, notifier.getName()
+ + NotificationsService.NOTIFIER_ID_POSTFIX);
+ if (value != null) {
+ em.setProperty(device, notifier.getName() + NotificationsService.NOTIFIER_ID_POSTFIX, newProviderId);
+ } else {
+ value = em.getProperty(device, notifier.getUuid()
+ + NotificationsService.NOTIFIER_ID_POSTFIX);
+ if (value != null) {
+ em.setProperty(device, notifier.getUuid() + NotificationsService.NOTIFIER_ID_POSTFIX, newProviderId);
+ }
+ }
+ }
+
+ public void finishedBatch() throws Exception {
+ long successes = this.successes.getAndSet(0); //reset counters
+ long failures = this.failures.getAndSet(0); //reset counters
+ this.hasFinished = true;
+
+ // refresh notification
+ Notification notification = em.get(this.notification.getUuid(), Notification.class);
+ notification.setModified(System.currentTimeMillis());
+
+ long sent = successes, errors = failures;
+ //and write them out again, this will produce the most accurate count
+ Map<String, Long> stats = new HashMap<>(2);
+ stats.put("sent", sent);
+ stats.put("errors", errors);
+ notification.updateStatistics(successes, errors);
+
+ //none of this is known and should you ever do this
+ if (notification.getExpectedCount() <= (notification.getStatistics().get("sent") + notification.getStatistics().get("errors"))) {
+ Map<String, Object> properties = new HashMap<>();
+ notification.setFinished(notification.getModified());
+ properties.put("finished", notification.getModified());
+ properties.put("state", notification.getState());
+ LOG.info("done sending to devices in {} ms", notification.getFinished() - notification.getStarted());
+ notification.addProperties(properties);
+ }
+ LOG.info("notification finished batch: {} of {} devices", notification.getUuid(),sent+errors);
+ em.update(notification);
+// Set<Notifier> notifiers = new HashSet<>(proxy.getNotifierMap().values()); // remove dups
+// proxy.asyncCheckForInactiveDevices(notifiers);
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/377b0747/stack/services/src/main/java/org/apache/usergrid/services/notifications/TaskTracker.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/services/notifications/TaskTracker.java b/stack/services/src/main/java/org/apache/usergrid/services/notifications/TaskTracker.java
index 8dfa0dc..f2837dd 100644
--- a/stack/services/src/main/java/org/apache/usergrid/services/notifications/TaskTracker.java
+++ b/stack/services/src/main/java/org/apache/usergrid/services/notifications/TaskTracker.java
@@ -26,11 +26,11 @@ import java.util.UUID;
public class TaskTracker {
private Notifier notifier;
- private SingleQueueTaskManager taskManager;
+ private TaskManager taskManager;
private Receipt receipt;
private UUID deviceId;
- public TaskTracker(Notifier notifier, SingleQueueTaskManager taskManager, Receipt receipt, UUID deviceId) {
+ public TaskTracker(Notifier notifier, TaskManager taskManager, Receipt receipt, UUID deviceId) {
this.notifier = notifier;
this.taskManager = taskManager;
this.receipt = receipt;
http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/377b0747/stack/services/src/test/java/org/apache/usergrid/services/notifications/gcm/NotificationsServiceIT.java
----------------------------------------------------------------------
diff --git a/stack/services/src/test/java/org/apache/usergrid/services/notifications/gcm/NotificationsServiceIT.java b/stack/services/src/test/java/org/apache/usergrid/services/notifications/gcm/NotificationsServiceIT.java
index c540c5a..fd1c36c 100644
--- a/stack/services/src/test/java/org/apache/usergrid/services/notifications/gcm/NotificationsServiceIT.java
+++ b/stack/services/src/test/java/org/apache/usergrid/services/notifications/gcm/NotificationsServiceIT.java
@@ -47,8 +47,7 @@ public class NotificationsServiceIT extends AbstractServiceNotificationIT {
* all run correctly
*/
private static final boolean USE_REAL_CONNECTIONS = false;
- private static final String PROVIDER = USE_REAL_CONNECTIONS ? "google"
- : "noop";
+ private static final String PROVIDER = USE_REAL_CONNECTIONS ? "google" : "noop";
private static final String API_KEY = "AIzaSyCIH_7WC0mOqBGMOXyQnFgrBpOePgHvQJM";
private static final String PUSH_TOKEN = "APA91bGxRGnMK8tKgVPzSlxtCFvwSVqx0xEPjA06sBmiK0k"