Archived
0

Long poll listener

This commit is contained in:
2017-04-11 01:49:43 +03:00
parent 42afbabd30
commit e2e185ef7f
6 changed files with 144 additions and 2 deletions

View File

@@ -137,7 +137,7 @@ public class VkApi {
}
if (logger.isDebugEnabled()) {
logger.debug(response.getContent());
logger.debug(response.getContent().trim());
}
}

View File

@@ -0,0 +1,19 @@
/*
* DmitriyMX <dimon550@gmail.com>
* 2017-04-11
*/
package ru.dmitriymx.vkapi.longpoll;
import com.google.gson.JsonArray;
public class Event {
private JsonArray jsonArray;
Event(JsonArray jsonArray) {
this.jsonArray = jsonArray;
}
public JsonArray getRawData() {
return jsonArray;
}
}

View File

@@ -0,0 +1,9 @@
/*
* DmitriyMX <dimon550@gmail.com>
* 2017-04-11
*/
package ru.dmitriymx.vkapi.longpoll;
public interface EventListener {
void process(Event event);
}

View File

@@ -0,0 +1,60 @@
/*
* DmitriyMX <dimon550@gmail.com>
* 2017-04-11
*/
package ru.dmitriymx.vkapi.longpoll;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.dmitriymx.vkapi.VkApi;
import ru.dmitriymx.vkapi.VkApiException;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
class LPRunner implements Runnable {
private final Logger logger = LoggerFactory.getLogger(LPRunner.class);
private final VkApi vkApi;
private final String server;
private final String key;
private long ts;
Map<Class<? extends Event>, List<EventListener>> mapListeners = new HashMap<>();
LPRunner(VkApi vkApi, String server, String key, long ts) {
this.vkApi = vkApi;
this.server = server;
this.key = key;
this.ts = ts;
}
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
if (logger.isDebugEnabled()) {
logger.debug("next loop...");
}
try {
JsonObject jsonObject = vkApi.longExecApi(
this.server, this.key, this.ts,
25L
);
JsonArray updates = jsonObject.getAsJsonArray("updates");
if (updates.size() > 0) {
final Event event = new Event(updates);
mapListeners.getOrDefault(Event.class, Collections.emptyList())
.forEach(listener -> listener.process(event));
}
this.ts = jsonObject.get("ts").getAsLong();
} catch (VkApiException e) {
logger.error("Oops!", e);
}
}
}
}

View File

@@ -0,0 +1,54 @@
/*
* DmitriyMX <dimon550@gmail.com>
* 2017-04-11
*/
package ru.dmitriymx.vkapi.longpoll;
import com.google.gson.JsonObject;
import ru.dmitriymx.vkapi.VkApi;
import ru.dmitriymx.vkapi.VkApiException;
import java.util.*;
public class LongPollListener {
private Thread thread;
private LPRunner lpRunner;
public static LongPollListener create(VkApi vkApi) throws VkApiException {
JsonObject jsonObject = vkApi.execApi("messages.getLongPollServer",
Collections.singletonMap("need_pts", "1"));
jsonObject = jsonObject.getAsJsonObject("response");
return new LongPollListener(
vkApi,
jsonObject.get("server").getAsString(),
jsonObject.get("key").getAsString(),
jsonObject.get("ts").getAsLong()
);
}
private LongPollListener(VkApi vkApi, String server, String key, long ts) {
this.lpRunner = new LPRunner(vkApi, server, key, ts);
this.thread = new Thread(this.lpRunner, "Long poll listener");
}
public void start() {
start(false);
}
public void start(boolean join) {
thread.start();
if (join) {
try {
thread.join();
} catch (InterruptedException ignore) {
// ignore
}
}
}
public void register(Class<? extends Event> clazz, EventListener listener) {
List<EventListener> eventListeners = lpRunner.mapListeners.computeIfAbsent(clazz, list -> new ArrayList<>());
eventListeners.add(listener);
}
}