Skip to content

Commit 9c84f32

Browse files
sbraconniertonygermano
authored andcommitted
Fix intermittent ConcurrentModificationException (#92)
1 parent 371f041 commit 9c84f32

File tree

1 file changed

+48
-41
lines changed
  • donkey/src/main/java/com/mirth/connect/donkey/model/message

1 file changed

+48
-41
lines changed

donkey/src/main/java/com/mirth/connect/donkey/model/message/Message.java

Lines changed: 48 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -114,55 +114,62 @@ public Map<Integer, ConnectorMessage> getConnectorMessages() {
114114
}
115115

116116
public ConnectorMessage getMergedConnectorMessage() {
117-
if (mergedConnectorMessage == null) {
118-
mergedConnectorMessage = new ConnectorMessage();
119-
mergedConnectorMessage.setChannelId(channelId);
120-
mergedConnectorMessage.setMessageId(messageId);
121-
mergedConnectorMessage.setServerId(serverId);
122-
mergedConnectorMessage.setReceivedDate(receivedDate);
123-
124-
Map<String, Object> sourceMap = null;
125-
Map<String, Object> responseMap = new HashMap<String, Object>();
126-
Map<String, Object> channelMap = new HashMap<String, Object>();
127-
128-
ConnectorMessage sourceConnectorMessage = connectorMessages.get(0);
129-
130-
if (sourceConnectorMessage != null) {
131-
mergedConnectorMessage.setRaw(sourceConnectorMessage.getRaw());
132-
mergedConnectorMessage.setProcessedRaw(sourceConnectorMessage.getProcessedRaw());
133-
sourceMap = sourceConnectorMessage.getSourceMap();
134-
responseMap.putAll(sourceConnectorMessage.getResponseMap());
135-
channelMap.putAll(sourceConnectorMessage.getChannelMap());
136-
}
137117

138-
List<ConnectorMessage> orderedConnectorMessages = new ArrayList<ConnectorMessage>(connectorMessages.values());
139-
Collections.sort(orderedConnectorMessages, new Comparator<ConnectorMessage>() {
140-
@Override
141-
public int compare(ConnectorMessage m1, ConnectorMessage m2) {
142-
if (m1.getChainId() == m2.getChainId()) {
143-
return m1.getOrderId() - m2.getOrderId();
144-
} else {
145-
return m1.getChainId() - m2.getChainId();
146-
}
118+
if (mergedConnectorMessage != null) {
119+
return mergedConnectorMessage;
120+
}
121+
122+
synchronized (this) {
123+
if (mergedConnectorMessage == null) {
124+
mergedConnectorMessage = new ConnectorMessage();
125+
mergedConnectorMessage.setChannelId(channelId);
126+
mergedConnectorMessage.setMessageId(messageId);
127+
mergedConnectorMessage.setServerId(serverId);
128+
mergedConnectorMessage.setReceivedDate(receivedDate);
129+
130+
Map<String, Object> sourceMap = null;
131+
Map<String, Object> responseMap = new HashMap<String, Object>();
132+
Map<String, Object> channelMap = new HashMap<String, Object>();
133+
134+
ConnectorMessage sourceConnectorMessage = connectorMessages.get(0);
135+
136+
if (sourceConnectorMessage != null) {
137+
mergedConnectorMessage.setRaw(sourceConnectorMessage.getRaw());
138+
mergedConnectorMessage.setProcessedRaw(sourceConnectorMessage.getProcessedRaw());
139+
sourceMap = sourceConnectorMessage.getSourceMap();
140+
responseMap.putAll(sourceConnectorMessage.getResponseMap());
141+
channelMap.putAll(sourceConnectorMessage.getChannelMap());
147142
}
148-
});
149143

150-
for (ConnectorMessage connectorMessage : orderedConnectorMessages) {
151-
if (connectorMessage.getMetaDataId() > 0) {
152-
if (sourceMap == null) {
153-
sourceMap = connectorMessage.getSourceMap();
144+
List<ConnectorMessage> orderedConnectorMessages = new ArrayList<ConnectorMessage>(connectorMessages.values());
145+
Collections.sort(orderedConnectorMessages, new Comparator<ConnectorMessage>() {
146+
@Override
147+
public int compare(ConnectorMessage m1, ConnectorMessage m2) {
148+
if (m1.getChainId() == m2.getChainId()) {
149+
return m1.getOrderId() - m2.getOrderId();
150+
} else {
151+
return m1.getChainId() - m2.getChainId();
152+
}
153+
}
154+
});
155+
156+
for (ConnectorMessage connectorMessage : orderedConnectorMessages) {
157+
if (connectorMessage.getMetaDataId() > 0) {
158+
if (sourceMap == null) {
159+
sourceMap = connectorMessage.getSourceMap();
160+
}
161+
responseMap.putAll(connectorMessage.getResponseMap());
162+
channelMap.putAll(connectorMessage.getChannelMap());
154163
}
155-
responseMap.putAll(connectorMessage.getResponseMap());
156-
channelMap.putAll(connectorMessage.getChannelMap());
157164
}
165+
166+
mergedConnectorMessage.setSourceMap(sourceMap);
167+
mergedConnectorMessage.setResponseMap(responseMap);
168+
mergedConnectorMessage.setChannelMap(channelMap);
158169
}
159170

160-
mergedConnectorMessage.setSourceMap(sourceMap);
161-
mergedConnectorMessage.setResponseMap(responseMap);
162-
mergedConnectorMessage.setChannelMap(channelMap);
171+
return mergedConnectorMessage;
163172
}
164-
165-
return mergedConnectorMessage;
166173
}
167174

168175
public String toString() {

0 commit comments

Comments
 (0)