22
22
import java .net .http .HttpResponse ;
23
23
import java .util .ArrayList ;
24
24
import java .util .List ;
25
- import java .util .concurrent .Executor ;
25
+ import java .util .concurrent .ExecutorService ;
26
26
import java .util .concurrent .Executors ;
27
+ import java .util .concurrent .TimeUnit ;
27
28
28
29
public class Discord {
29
30
private static final Logger LOGGER = LogManager .getLogger ();
30
- private static final Executor EXECUTOR = Executors .newCachedThreadPool ();
31
+ private static final ExecutorService EXECUTOR = Executors .newCachedThreadPool ();
31
32
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper ();
32
33
private static final String WEBSITE = "https://javadiscord.com/" ;
33
34
@@ -45,6 +46,7 @@ public class Discord {
45
46
private final List <Object > annotatedEventListeners = new ArrayList <>();
46
47
private final List <EventListener > eventListeners = new ArrayList <>();
47
48
49
+ private WebSocketManager webSocketManager ;
48
50
private Object listenerLoader ;
49
51
50
52
public Discord (String botToken ) {
@@ -134,13 +136,14 @@ private void loadAnnotations() {
134
136
}
135
137
136
138
public void start () {
137
- WebSocketManager webSocketManager =
139
+ this . webSocketManager =
138
140
new WebSocketManager (
139
141
new GatewaySetting ().setApiVersion (10 ).setEncoding (GatewayEncoding .JSON ),
140
142
identifyRequest ,
141
143
cache );
142
144
143
- WebSocketManagerProxy webSocketManagerProxy = new WebSocketManagerProxy (webSocketManager );
145
+ WebSocketManagerProxy webSocketManagerProxy =
146
+ new WebSocketManagerProxy (this .webSocketManager );
144
147
ConnectionDetails connectionDetails =
145
148
new ConnectionDetails (gateway .url (), botToken , gatewaySetting );
146
149
ConnectionMediator connectionMediator =
@@ -152,6 +155,29 @@ public void start() {
152
155
EXECUTOR .execute (discordRequestDispatcher );
153
156
}
154
157
158
+ public void stop () {
159
+ if (this .webSocketManager != null ) {
160
+ this .webSocketManager .stop ();
161
+ }
162
+
163
+ discordRequestDispatcher .stop ();
164
+
165
+ EXECUTOR .shutdown ();
166
+ try {
167
+ if (!EXECUTOR .awaitTermination (30 , TimeUnit .SECONDS )) {
168
+ EXECUTOR .shutdownNow ();
169
+ if (!EXECUTOR .awaitTermination (30 , TimeUnit .SECONDS )) {
170
+ LOGGER .warn (
171
+ "Executor failed to shutdown within the specified time limit, some"
172
+ + " tasks may still be running" );
173
+ }
174
+ }
175
+ } catch (InterruptedException ie ) {
176
+ LOGGER .error ("Termination was interrupted within {} seconds." , 30 );
177
+ Thread .currentThread ().interrupt ();
178
+ }
179
+ }
180
+
155
181
public void startWithoutGatewayEvents () {
156
182
EXECUTOR .execute (discordRequestDispatcher );
157
183
}
0 commit comments