|
24 | 24 | import java.nio.channels.SelectableChannel;
|
25 | 25 | import java.nio.channels.SocketChannel;
|
26 | 26 | import java.time.Duration;
|
27 |
| -import java.util.HashMap; |
28 | 27 | import java.util.List;
|
29 | 28 | import java.util.Map;
|
| 29 | +import java.util.Objects; |
| 30 | +import java.util.concurrent.ConcurrentHashMap; |
30 | 31 | import java.util.logging.Level;
|
31 | 32 | import java.util.logging.Logger;
|
32 | 33 |
|
|
57 | 58 | */
|
58 | 59 | public abstract class HeronClient implements ISelectHandler {
|
59 | 60 | private static final Logger LOG = Logger.getLogger(HeronClient.class.getName());
|
| 61 | + private static final Object DUMMY = new Object(); |
60 | 62 |
|
61 | 63 | // When we send a request, we need to:
|
62 | 64 | // record the the context for this particular RID, and prepare the response for that RID
|
@@ -99,9 +101,9 @@ public HeronClient(NIOLooper s, String host, int port, HeronSocketOptions option
|
99 | 101 | socketOptions = options;
|
100 | 102 |
|
101 | 103 | isConnected = false;
|
102 |
| - contextMap = new HashMap<REQID, Object>(); |
103 |
| - responseMessageMap = new HashMap<REQID, Message.Builder>(); |
104 |
| - messageMap = new HashMap<String, Message.Builder>(); |
| 104 | + contextMap = new ConcurrentHashMap<REQID, Object>(); |
| 105 | + responseMessageMap = new ConcurrentHashMap<REQID, Message.Builder>(); |
| 106 | + messageMap = new ConcurrentHashMap<String, Message.Builder>(); |
105 | 107 | }
|
106 | 108 |
|
107 | 109 | // Register the protobuf Message's name with protobuf Message
|
@@ -193,7 +195,7 @@ public void sendRequest(Message request, Object context, Message.Builder respons
|
193 | 195 | Duration timeout) {
|
194 | 196 | // Pack it as a no-timeout request and send it!
|
195 | 197 | final REQID rid = REQID.generate();
|
196 |
| - contextMap.put(rid, context); |
| 198 | + contextMap.put(rid, Objects.nonNull(context) ? context : DUMMY); // Fix NPE |
197 | 199 | responseMessageMap.put(rid, responseBuilder);
|
198 | 200 |
|
199 | 201 | // Add timeout for this request if necessary
|
@@ -402,15 +404,15 @@ public void forceFlushWithBestEffort() {
|
402 | 404 | // Following protected methods are just used for testing
|
403 | 405 | /////////////////////////////////////////////////////////
|
404 | 406 | protected Map<String, Message.Builder> getMessageMap() {
|
405 |
| - return new HashMap<String, Message.Builder>(messageMap); |
| 407 | + return new ConcurrentHashMap<String, Message.Builder>(messageMap); |
406 | 408 | }
|
407 | 409 |
|
408 | 410 | protected Map<REQID, Message.Builder> getResponseMessageMap() {
|
409 |
| - return new HashMap<REQID, Message.Builder>(responseMessageMap); |
| 411 | + return new ConcurrentHashMap<REQID, Message.Builder>(responseMessageMap); |
410 | 412 | }
|
411 | 413 |
|
412 | 414 | protected Map<REQID, Object> getContextMap() {
|
413 |
| - return new HashMap<REQID, Object>(contextMap); |
| 415 | + return new ConcurrentHashMap<>(contextMap); |
414 | 416 | }
|
415 | 417 |
|
416 | 418 | protected SocketChannelHelper getSocketChannelHelper() {
|
|
0 commit comments