diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 diff --git a/src/main/java/com/ullink/slack/simpleslackapi/SlackSession.java b/src/main/java/com/ullink/slack/simpleslackapi/SlackSession.java index 3c8bff21..0708d8a9 100644 --- a/src/main/java/com/ullink/slack/simpleslackapi/SlackSession.java +++ b/src/main/java/com/ullink/slack/simpleslackapi/SlackSession.java @@ -41,6 +41,8 @@ public interface SlackSession void connect() throws IOException; + void disconnect() throws IOException; + SlackMessageHandle deleteMessage(String timeStamp, SlackChannel channel); SlackMessageHandle sendMessage(SlackChannel channel, String message, SlackAttachment attachment, SlackChatConfiguration chatConfiguration); diff --git a/src/main/java/com/ullink/slack/simpleslackapi/impl/SlackWebSocketSessionImpl.java b/src/main/java/com/ullink/slack/simpleslackapi/impl/SlackWebSocketSessionImpl.java index 6fd8060b..7c285664 100644 --- a/src/main/java/com/ullink/slack/simpleslackapi/impl/SlackWebSocketSessionImpl.java +++ b/src/main/java/com/ullink/slack/simpleslackapi/impl/SlackWebSocketSessionImpl.java @@ -126,6 +126,7 @@ private > void dispatchImp private long lastConnectionTime = -1; private boolean reconnectOnDisconnection; + private boolean wantDisconnect = false; private Map pendingMessageMap = new ConcurrentHashMap(); @@ -150,11 +151,21 @@ private > void dispatchImp @Override public void connect() throws IOException { + wantDisconnect = false; connectImpl(); LOGGER.debug("starting connection monitoring"); startConnectionMonitoring(); } + @Override + public void disconnect() + { + wantDisconnect = true; + LOGGER.debug("Disconnecting from the Slack server"); + disconnectImpl(); + stopConnectionMonitoring(); + } + private void connectImpl() throws IOException, ClientProtocolException, ConnectException { LOGGER.info("connecting to slack"); @@ -221,6 +232,25 @@ public void onOpen(Session session, EndpointConfig config) } } + private void disconnectImpl() + { + if (websocketSession != null) + { + try + { + websocketSession.close(); + } + catch (IOException ex) + { + // ignored. + } + finally + { + websocketSession = null; + } + } + } + private void startConnectionMonitoring() { connectionMonitoringThread = new Thread() @@ -235,6 +265,11 @@ public void run() { // heart beat of 30s (should be configurable in the future) Thread.sleep(30000); + + // disconnect() was called. + if (wantDisconnect) + this.interrupt(); + if (lastPingSent != lastPingAck || websocketSession == null) { // disconnection happened @@ -298,7 +333,29 @@ else if (reconnectOnDisconnection) LOGGER.debug("monitoring thread stopped"); } }; - connectionMonitoringThread.start(); + + if (!wantDisconnect) + connectionMonitoringThread.start(); + } + + private void stopConnectionMonitoring() + { + if (connectionMonitoringThread != null) + { + while (true) + { + try + { + connectionMonitoringThread.interrupt(); + connectionMonitoringThread.join(); + break; + } + catch (InterruptedException ex) + { + // ouch - let's try again! + } + } + } } @Override diff --git a/src/test/java/com/ullink/slack/simpleslackapi/impl/TestAbstractSlackSessionImpl.java b/src/test/java/com/ullink/slack/simpleslackapi/impl/TestAbstractSlackSessionImpl.java index b6c63969..aa5204b2 100644 --- a/src/test/java/com/ullink/slack/simpleslackapi/impl/TestAbstractSlackSessionImpl.java +++ b/src/test/java/com/ullink/slack/simpleslackapi/impl/TestAbstractSlackSessionImpl.java @@ -35,6 +35,11 @@ public void connect() } + @Override + public void disconnect() + { + } + @Override public SlackMessageHandle sendMessage(SlackChannel channel, String message, SlackAttachment attachment, SlackChatConfiguration chatConfiguration) { diff --git a/src/test/java/com/ullink/slack/simpleslackapi/impl/TestSlackJSONMessageParser.java b/src/test/java/com/ullink/slack/simpleslackapi/impl/TestSlackJSONMessageParser.java index da333795..37af92c0 100644 --- a/src/test/java/com/ullink/slack/simpleslackapi/impl/TestSlackJSONMessageParser.java +++ b/src/test/java/com/ullink/slack/simpleslackapi/impl/TestSlackJSONMessageParser.java @@ -56,6 +56,11 @@ public void connect() channels.put(channel3.getId(), channel3); } + @Override + public void disconnect() + { + } + @Override public SlackMessageHandle sendMessage(SlackChannel channel, String message, SlackAttachment attachment, SlackChatConfiguration chatConfiguration) {