Skip to content

Fix intermittent ConcurrentModificationException (#92) #93

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -114,55 +114,62 @@ public Map<Integer, ConnectorMessage> getConnectorMessages() {
}

public ConnectorMessage getMergedConnectorMessage() {
if (mergedConnectorMessage == null) {
mergedConnectorMessage = new ConnectorMessage();
mergedConnectorMessage.setChannelId(channelId);
mergedConnectorMessage.setMessageId(messageId);
mergedConnectorMessage.setServerId(serverId);
mergedConnectorMessage.setReceivedDate(receivedDate);

Map<String, Object> sourceMap = null;
Map<String, Object> responseMap = new HashMap<String, Object>();
Map<String, Object> channelMap = new HashMap<String, Object>();

ConnectorMessage sourceConnectorMessage = connectorMessages.get(0);

if (sourceConnectorMessage != null) {
mergedConnectorMessage.setRaw(sourceConnectorMessage.getRaw());
mergedConnectorMessage.setProcessedRaw(sourceConnectorMessage.getProcessedRaw());
sourceMap = sourceConnectorMessage.getSourceMap();
responseMap.putAll(sourceConnectorMessage.getResponseMap());
channelMap.putAll(sourceConnectorMessage.getChannelMap());
}

List<ConnectorMessage> orderedConnectorMessages = new ArrayList<ConnectorMessage>(connectorMessages.values());
Collections.sort(orderedConnectorMessages, new Comparator<ConnectorMessage>() {
@Override
public int compare(ConnectorMessage m1, ConnectorMessage m2) {
if (m1.getChainId() == m2.getChainId()) {
return m1.getOrderId() - m2.getOrderId();
} else {
return m1.getChainId() - m2.getChainId();
}
if (mergedConnectorMessage != null) {
return mergedConnectorMessage;
}

synchronized (this) {
if (mergedConnectorMessage == null) {
mergedConnectorMessage = new ConnectorMessage();
mergedConnectorMessage.setChannelId(channelId);
mergedConnectorMessage.setMessageId(messageId);
mergedConnectorMessage.setServerId(serverId);
mergedConnectorMessage.setReceivedDate(receivedDate);

Map<String, Object> sourceMap = null;
Map<String, Object> responseMap = new HashMap<String, Object>();
Map<String, Object> channelMap = new HashMap<String, Object>();

ConnectorMessage sourceConnectorMessage = connectorMessages.get(0);

if (sourceConnectorMessage != null) {
mergedConnectorMessage.setRaw(sourceConnectorMessage.getRaw());
mergedConnectorMessage.setProcessedRaw(sourceConnectorMessage.getProcessedRaw());
sourceMap = sourceConnectorMessage.getSourceMap();
responseMap.putAll(sourceConnectorMessage.getResponseMap());
channelMap.putAll(sourceConnectorMessage.getChannelMap());
}
});

for (ConnectorMessage connectorMessage : orderedConnectorMessages) {
if (connectorMessage.getMetaDataId() > 0) {
if (sourceMap == null) {
sourceMap = connectorMessage.getSourceMap();
List<ConnectorMessage> orderedConnectorMessages = new ArrayList<ConnectorMessage>(connectorMessages.values());
Collections.sort(orderedConnectorMessages, new Comparator<ConnectorMessage>() {
@Override
public int compare(ConnectorMessage m1, ConnectorMessage m2) {
if (m1.getChainId() == m2.getChainId()) {
return m1.getOrderId() - m2.getOrderId();
} else {
return m1.getChainId() - m2.getChainId();
}
}
});

for (ConnectorMessage connectorMessage : orderedConnectorMessages) {
if (connectorMessage.getMetaDataId() > 0) {
if (sourceMap == null) {
sourceMap = connectorMessage.getSourceMap();
}
responseMap.putAll(connectorMessage.getResponseMap());
channelMap.putAll(connectorMessage.getChannelMap());
}
responseMap.putAll(connectorMessage.getResponseMap());
channelMap.putAll(connectorMessage.getChannelMap());
}

mergedConnectorMessage.setSourceMap(sourceMap);
mergedConnectorMessage.setResponseMap(responseMap);
mergedConnectorMessage.setChannelMap(channelMap);
}

mergedConnectorMessage.setSourceMap(sourceMap);
mergedConnectorMessage.setResponseMap(responseMap);
mergedConnectorMessage.setChannelMap(channelMap);
return mergedConnectorMessage;
}

return mergedConnectorMessage;
}

public String toString() {
Expand Down