2016-08-29 3 views
0

Я пытаюсь отправить сообщение в какую-то тему, но по какой-то причине сообщение занимает много времени, и я иногда получаю слишком много сообщений, я также заметил, что некоторые новых сообщений поступают перед другими более старыми сообщениями.Отправка сообщения в gcm тему

pubSub.subscribe(token, "/topics/" + topic, null); 

Код для отправки сообщения:

JSONObject jsonGcmData = new JSONObject(); 
JSONObject jsonData = new JSONObject(); 
jsonData.put("message", message); 

if (topic != null) 
{ 
    jsonGcmData.put("to", "/topics/" + topic); 
} 
else 
{ 
    // TODO: handle this 
    jsonGcmData.put("to", "/topics/Fail"); 
} 

jsonGcmData.put("data", jsonData); 

URL url = new URL("https://android.googleapis.com/gcm/send"); 
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
conn.setRequestProperty("Authorization", "key=" + API_KEY); 
conn.setRequestProperty("Content-Type", "application/json"); 
conn.setRequestMethod("POST"); 
conn.setDoOutput(true); 

OutputStream outputStream = conn.getOutputStream(); 
outputStream.write(jsonGcmData.toString().getBytes()); 

InputStream inputStream = conn.getInputStream(); 

ответ

1

Там находится несколько вещей, которые вносят вклад в вопросы, стоящие перед вами.

Прежде всего, если вы разрабатываете новое приложение, вы должны использовать Firebase Cloud Messaging, который заменяет Google Cloud Messaging. Он еще не будет закрыт, но почему-то в один прекрасный день вы попадете в плохую ситуацию. Тем не менее, версия, вероятно, не является причиной.

Во-первых, вы должны знать, что сообщения GCM/FCM не являются мгновенными. Это зависит от того, что вы считаете в режиме реального времени, но в целом у них может быть некоторое латентность, и они могут быть собраны в группы для экономии энергии, полосы пропускания, времени процессора и т. Д. Это поведение по умолчанию, когда priority установлено на normal, как в вашем случае. Set the priority to high, если вы хотите получить больше шансов, что сообщение будет немедленно доставлено. Будьте предупреждены, что это может повлиять на срок службы батареи. Я не могу сказать, в какой степени, но предупреждение есть по причине.

Вы также можете указать set the time_to_live to 0, но у вас почти нет гарантий и нет попыток.

Во-вторых, проблема, которую я боюсь, вы не можете легко решить, заказывая. FCM не гарантирует какого-либо заказа, периода.

Итак, что вы можете сделать? Во-первых, вы можете создать какой-то буфер в своем приложении, который будет ждать некоторое время для получения сообщений, переупорядочивать их и передавать их через логику. Это означает, что вы должны включать какую-то временную метку с каждым сообщением при отправке или каким-то глобальным счетчиком на каждое сообщение, чтобы вы знали, если вы пропустили некоторые (остерегайтесь, эти решения содержат драконов!). Во-вторых, упорядочивайте свои сообщения и логику на самом деле, так что они более устойчивы к сообщениям об ошибке.

И, наконец, в зависимости от вашего приложения, возможно, вы можете переключать протоколы. Рассмотрим что-то вроде MQTT, STOMP или даже websockets.

В целом, это не тривиальная проблема, а возможность ее решения для нормальной работы. Если вы строите что-то действительно важное для этого, удачи.

Смежные вопросы