Long poll listener
This commit is contained in:
2
pom.xml
2
pom.xml
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
<groupId>ru.dmitriymx</groupId>
|
<groupId>ru.dmitriymx</groupId>
|
||||||
<artifactId>vkapiuni</artifactId>
|
<artifactId>vkapiuni</artifactId>
|
||||||
<version>1.1-SNAPSHOT</version>
|
<version>1.2-SNAPSHOT</version>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
|||||||
@@ -137,7 +137,7 @@ public class VkApi {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (logger.isDebugEnabled()) {
|
if (logger.isDebugEnabled()) {
|
||||||
logger.debug(response.getContent());
|
logger.debug(response.getContent().trim());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
19
src/main/java/ru/dmitriymx/vkapi/longpoll/Event.java
Normal file
19
src/main/java/ru/dmitriymx/vkapi/longpoll/Event.java
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* DmitriyMX <dimon550@gmail.com>
|
||||||
|
* 2017-04-11
|
||||||
|
*/
|
||||||
|
package ru.dmitriymx.vkapi.longpoll;
|
||||||
|
|
||||||
|
public interface EventListener {
|
||||||
|
void process(Event event);
|
||||||
|
}
|
||||||
60
src/main/java/ru/dmitriymx/vkapi/longpoll/LPRunner.java
Normal file
60
src/main/java/ru/dmitriymx/vkapi/longpoll/LPRunner.java
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user