Skip to content

Commit e538b9e

Browse files
Fixed wait list creates performance issues (#124)
1 parent d2d5490 commit e538b9e

File tree

7 files changed

+121
-103
lines changed

7 files changed

+121
-103
lines changed

src/main/java/com/ericsson/ei/handlers/EventToObjectMapHandler.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package com.ericsson.ei.handlers;
1818

1919
import java.util.ArrayList;
20+
import java.util.List;
2021

2122
import org.slf4j.Logger;
2223
import org.slf4j.LoggerFactory;
@@ -148,5 +149,11 @@ public boolean deleteEventObjectMap(String templateName) {
148149
return mongodbhandler.dropDocument(databaseName, collectionName, condition);
149150
}
150151

152+
public boolean isEventInEventObjectMap(String eventId) {
153+
String condition = "{\"_id\" : \"" + eventId + "\"}";
154+
List<String> documents = mongodbhandler.find(databaseName, collectionName, condition);
155+
return !documents.isEmpty();
156+
}
157+
151158

152159
}

src/main/java/com/ericsson/ei/waitlist/WaitListStorageHandler.java

Lines changed: 39 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -16,30 +16,28 @@
1616
*/
1717
package com.ericsson.ei.waitlist;
1818

19-
import java.text.DateFormat;
20-
import java.text.ParseException;
21-
import java.text.SimpleDateFormat;
22-
import java.util.ArrayList;
23-
import java.util.Date;
24-
19+
import com.ericsson.ei.jmespath.JmesPathInterface;
20+
import com.ericsson.ei.mongodbhandler.MongoDBHandler;
21+
import com.ericsson.ei.rules.RulesObject;
22+
import com.fasterxml.jackson.databind.JsonNode;
2523
import lombok.Getter;
2624
import lombok.Setter;
25+
import org.json.JSONObject;
2726
import org.slf4j.Logger;
2827
import org.slf4j.LoggerFactory;
2928
import org.springframework.beans.factory.annotation.Autowired;
3029
import org.springframework.beans.factory.annotation.Value;
3130
import org.springframework.stereotype.Component;
3231

33-
import com.ericsson.ei.jmespath.JmesPathInterface;
34-
import com.ericsson.ei.mongodbhandler.MongoDBHandler;
35-
import com.ericsson.ei.rules.RulesObject;
36-
import com.fasterxml.jackson.databind.JsonNode;
37-
import com.mongodb.BasicDBObject;
38-
import com.mongodb.util.JSON;
32+
import java.text.DateFormat;
33+
import java.text.ParseException;
34+
import java.text.SimpleDateFormat;
35+
import java.util.Date;
36+
import java.util.List;
3937

4038
@Component
4139
public class WaitListStorageHandler {
42-
static Logger log = (Logger) LoggerFactory.getLogger(WaitListStorageHandler.class);
40+
private static final Logger LOGGER = (Logger) LoggerFactory.getLogger(WaitListStorageHandler.class);
4341

4442
@Getter
4543
@Value("${waitlist.collection.name}")
@@ -62,46 +60,42 @@ public class WaitListStorageHandler {
6260
private JmesPathInterface jmesPathInterface;
6361

6462
public void addEventToWaitList(String event, RulesObject rulesObject) throws Exception {
65-
String input = addProprtiesToEvent(event, rulesObject);
66-
boolean result = mongoDbHandler.insertDocument(databaseName, collectionName, input);
67-
if (result == false) {
68-
throw new Exception("failed to insert the document into database");
63+
String condition = "{\"_id\" : \"" + new JSONObject(event).getJSONObject("meta").getString("id") + "\"}";
64+
List<String> foundEventsInWaitList = mongoDbHandler.find(databaseName, collectionName, condition);
65+
if (foundEventsInWaitList.isEmpty()) {
66+
String input = addPropertiesToEvent(event, rulesObject);
67+
boolean result = mongoDbHandler.insertDocument(databaseName, collectionName, input);
68+
if (!result) {
69+
throw new Exception("Failed to insert the document into database");
70+
}
6971
}
7072
}
7173

72-
private String addProprtiesToEvent(String event, RulesObject rulesObject) {
73-
String time = null;
74-
Date date = null;
74+
public boolean dropDocumentFromWaitList(String document) {
75+
return mongoDbHandler.dropDocument(databaseName, collectionName, document);
76+
}
77+
78+
public List<String> getWaitList() {
79+
return mongoDbHandler.getAllDocuments(databaseName, collectionName);
80+
}
81+
82+
private String addPropertiesToEvent(String event, RulesObject rulesObject) {
7583
String idRule = rulesObject.getIdRule();
7684
JsonNode id = jmesPathInterface.runRuleOnEvent(idRule, event);
77-
String condition = "{Event:" + JSON.parse(event).toString() + "}";
78-
ArrayList<String> documents = mongoDbHandler.find(databaseName, collectionName, condition);
79-
if (documents.size() == 0) {
80-
DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
81-
date = new Date();
82-
time = dateFormat.format(date);
83-
try {
84-
date = dateFormat.parse(time);
85-
} catch (ParseException e) {
86-
log.info(e.getMessage(), e);
87-
}
88-
85+
DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
86+
Date date = new Date();
87+
String time = dateFormat.format(date);
88+
try {
89+
date = dateFormat.parse(time);
90+
} catch (ParseException e) {
91+
LOGGER.error(e.getMessage(), e);
8992
}
90-
BasicDBObject document = new BasicDBObject();
91-
document.put("_id", id.textValue());
92-
document.put("Time", date);
93-
document.put("Event", JSON.parse(event));
93+
JSONObject document = new JSONObject()
94+
.put("_id", id.textValue())
95+
.put("Time", date)
96+
.put("Event", event);
9497
mongoDbHandler.createTTLIndex(databaseName, collectionName, "Time", ttlValue);
9598
return document.toString();
9699
}
97100

98-
public ArrayList<String> getWaitList() {
99-
ArrayList<String> documents = mongoDbHandler.getAllDocuments(databaseName, collectionName);
100-
return documents;
101-
}
102-
103-
public boolean dropDocumentFromWaitList(String document) {
104-
boolean result = mongoDbHandler.dropDocument(databaseName, collectionName, document);
105-
return result;
106-
}
107101
}

src/main/java/com/ericsson/ei/waitlist/WaitListWorker.java

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,14 @@
1616
*/
1717
package com.ericsson.ei.waitlist;
1818

19+
import com.ericsson.ei.handlers.EventToObjectMapHandler;
1920
import com.ericsson.ei.handlers.MatchIdRulesHandler;
2021
import com.ericsson.ei.jmespath.JmesPathInterface;
2122
import com.ericsson.ei.rmqhandler.RmqHandler;
2223
import com.ericsson.ei.rules.RulesHandler;
2324
import com.ericsson.ei.rules.RulesObject;
2425
import com.fasterxml.jackson.databind.JsonNode;
25-
import com.mongodb.DBObject;
26-
import com.mongodb.util.JSON;
26+
import org.json.JSONObject;
2727
import org.slf4j.Logger;
2828
import org.slf4j.LoggerFactory;
2929
import org.springframework.beans.factory.annotation.Autowired;
@@ -38,6 +38,7 @@
3838

3939
@Component
4040
public class WaitListWorker {
41+
private static final Logger LOGGER = (Logger) LoggerFactory.getLogger(WaitListWorker.class);
4142

4243
@Autowired
4344
private WaitListStorageHandler waitListStorageHandler;
@@ -54,7 +55,8 @@ public class WaitListWorker {
5455
@Autowired
5556
private MatchIdRulesHandler matchIdRulesHandler;
5657

57-
static Logger log = (Logger) LoggerFactory.getLogger(WaitListWorker.class);
58+
@Autowired
59+
private EventToObjectMapHandler eventToObjectMapHandler;
5860

5961
@Bean
6062
public TaskScheduler taskScheduler() {
@@ -66,20 +68,21 @@ public void run() {
6668
RulesObject rulesObject;
6769
List<String> documents = waitListStorageHandler.getWaitList();
6870
for (String document : documents) {
69-
DBObject dbObject = (DBObject) JSON.parse(document);
70-
String event = dbObject.get("Event").toString();
71-
rulesObject = rulesHandler.getRulesForEvent(event);
72-
String idRule = rulesObject.getIdentifyRules();
71+
if (eventToObjectMapHandler.isEventInEventObjectMap(new JSONObject(document).getString("_id"))) {
72+
waitListStorageHandler.dropDocumentFromWaitList(document);
73+
} else {
74+
String event = new JSONObject(document).getString("Event");
75+
rulesObject = rulesHandler.getRulesForEvent(event);
76+
String idRule = rulesObject.getIdentifyRules();
7377

74-
if (idRule != null && !idRule.isEmpty()) {
75-
JsonNode ids = jmesPathInterface.runRuleOnEvent(idRule, event);
76-
if (ids.isArray()) {
77-
for (final JsonNode idJsonObj : ids) {
78-
Collection<String> objects = matchIdRulesHandler.fetchObjectsById(rulesObject,
79-
idJsonObj.textValue());
80-
if (objects.size() > 0) {
81-
rmqHandler.publishObjectToWaitlistQueue(event);
82-
waitListStorageHandler.dropDocumentFromWaitList(document);
78+
if (idRule != null && !idRule.isEmpty()) {
79+
JsonNode ids = jmesPathInterface.runRuleOnEvent(idRule, event);
80+
if (ids.isArray()) {
81+
for (final JsonNode idJsonObj : ids) {
82+
Collection<String> objects = matchIdRulesHandler.fetchObjectsById(rulesObject, idJsonObj.textValue());
83+
if (!objects.isEmpty()) {
84+
rmqHandler.publishObjectToWaitlistQueue(event);
85+
}
8386
}
8487
}
8588
}

src/test/java/com/ericsson/ei/waitlist/TestWaitListStorageHandler.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.io.File;
2222
import java.io.IOException;
2323
import java.util.ArrayList;
24+
import java.util.List;
2425

2526
import org.apache.commons.io.FileUtils;
2627
import org.junit.Before;
@@ -79,7 +80,7 @@ public void testAddEventToWaitList(){
7980

8081
@Test
8182
public void testGetWaitListEvents(){
82-
ArrayList<String> documents = waitListStorageHandler.getWaitList();
83+
List<String> documents = waitListStorageHandler.getWaitList();
8384
assertTrue(documents.size() > 0);
8485
}
8586

src/test/java/com/ericsson/ei/waitlist/TestWaitListWorker.java

Lines changed: 52 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -16,30 +16,18 @@
1616
*/
1717
package com.ericsson.ei.waitlist;
1818

19-
import static org.junit.Assert.assertFalse;
20-
import static org.junit.Assert.assertTrue;
21-
2219
import com.ericsson.ei.flowtests.AMQPBrokerManager;
20+
import com.ericsson.ei.handlers.EventToObjectMapHandler;
2321
import com.ericsson.ei.handlers.MatchIdRulesHandler;
2422
import com.ericsson.ei.jmespath.JmesPathInterface;
2523
import com.ericsson.ei.mongodbhandler.MongoDBHandler;
2624
import com.ericsson.ei.rmqhandler.RmqHandler;
2725
import com.ericsson.ei.rules.RulesHandler;
2826
import com.ericsson.ei.rules.RulesObject;
2927
import com.fasterxml.jackson.databind.JsonNode;
30-
import com.rabbitmq.client.AMQP;
31-
import com.rabbitmq.client.Channel;
32-
import com.rabbitmq.client.Connection;
33-
import com.rabbitmq.client.ConnectionFactory;
34-
import com.rabbitmq.client.Consumer;
35-
import com.rabbitmq.client.DefaultConsumer;
36-
import com.rabbitmq.client.Envelope;
37-
38-
import java.io.File;
39-
import java.io.IOException;
40-
import java.util.ArrayList;
41-
28+
import com.rabbitmq.client.*;
4229
import org.apache.commons.io.FileUtils;
30+
import org.json.JSONException;
4331
import org.junit.After;
4432
import org.junit.Before;
4533
import org.junit.Test;
@@ -54,46 +42,57 @@
5442
import org.springframework.amqp.rabbit.core.RabbitAdmin;
5543
import org.springframework.util.SocketUtils;
5644

45+
import java.io.File;
46+
import java.io.IOException;
47+
import java.util.ArrayList;
48+
import java.util.List;
49+
50+
import static org.junit.Assert.assertFalse;
51+
import static org.junit.Assert.assertTrue;
52+
5753
public class TestWaitListWorker {
5854

55+
private static final String EVENT_PATH = "src/test/resources/EiffelArtifactCreatedEvent.json";
56+
private static final String INPUT_1 = "src/test/resources/testWaitListinput1.json";
57+
private static final String INPUT_2 = "src/test/resources/testWaitListinput2.json";
58+
5959
private static File qpidConfig = null;
60+
private static String jsonFileContent;
6061
static AMQPBrokerManager amqpBrocker;
6162
static ConnectionFactory cf;
6263
static Connection conn;
63-
private static String jsonFileContent;
64-
private ArrayList<String> list = new ArrayList<>();
65-
private final static String eventPath = "src/test/resources/EiffelArtifactCreatedEvent.json";
66-
private final String input1 = "src/test/resources/testWaitListinput1.json";
67-
private final String input2 = "src/test/resources/testWaitListinput2.json";
68-
protected String message;
64+
65+
private List<String> list;
66+
private String message;
6967

7068
@InjectMocks
71-
WaitListWorker waitListWorker;
69+
private WaitListWorker waitListWorker;
7270
@Mock
73-
RulesHandler rulesHandler;
71+
private RulesHandler rulesHandler;
7472
@Mock
75-
MatchIdRulesHandler matchId;
73+
private MatchIdRulesHandler matchId;
7674
@Mock
77-
RmqHandler rmqHandler;
75+
private RmqHandler rmqHandler;
7876
@Mock
79-
WaitListStorageHandler waitListStorageHandler;
77+
private WaitListStorageHandler waitListStorageHandler;
8078
@Mock
81-
MongoDBHandler mongoDBHandler;
79+
private MongoDBHandler mongoDBHandler;
8280
@Mock
83-
ArrayList<String> newList;
81+
private JmesPathInterface jmesPathInterface;
8482
@Mock
85-
JmesPathInterface jmesPathInterface;
83+
private JsonNode jsonNode;
8684
@Mock
87-
JsonNode jsonNode;
85+
private RulesObject rulesObject;
8886
@Mock
89-
RulesObject rulesObject;
87+
private EventToObjectMapHandler eventToObjectMapHandler;
9088

9189
@Before
9290
public void init() throws Exception {
9391
MockitoAnnotations.initMocks(this);
9492
setupMB();
95-
list.add(FileUtils.readFileToString(new File(input1), "UTF-8"));
96-
list.add(FileUtils.readFileToString(new File(input2), "UTF-8"));
93+
list = new ArrayList<>();
94+
list.add(FileUtils.readFileToString(new File(INPUT_1), "UTF-8"));
95+
list.add(FileUtils.readFileToString(new File(INPUT_2), "UTF-8"));
9796
Mockito.when(waitListStorageHandler.getWaitList()).thenReturn(list);
9897
Mockito.when(rulesHandler.getRulesForEvent(Mockito.anyString())).thenReturn(rulesObject);
9998
Mockito.when(jmesPathInterface.runRuleOnEvent(Mockito.anyString(), Mockito.anyString())).thenReturn(jsonNode);
@@ -105,7 +104,7 @@ void setupMB() throws Exception {
105104
System.setProperty("rabbitmq.user", "guest");
106105
System.setProperty("rabbitmq.password", "guest");
107106
String config = "src/test/resources/configs/qpidConfig.json";
108-
jsonFileContent = FileUtils.readFileToString(new File(eventPath), "UTF-8");
107+
jsonFileContent = FileUtils.readFileToString(new File(EVENT_PATH), "UTF-8");
109108
qpidConfig = new File(config);
110109
amqpBrocker = new AMQPBrokerManager(qpidConfig.getAbsolutePath(), port);
111110
amqpBrocker.startBroker();
@@ -119,8 +118,22 @@ void setupMB() throws Exception {
119118
}
120119

121120
@Test
122-
public void testRunWithoutMatchObjects() {
123-
Mockito.when(matchId.fetchObjectsById(Mockito.anyObject(), Mockito.anyString())).thenReturn(newList);
121+
public void testRunWithoutMatchObjects() throws JSONException {
122+
Mockito.when(eventToObjectMapHandler.isEventInEventObjectMap(Mockito.anyString())).thenReturn(false);
123+
Mockito.when(matchId.fetchObjectsById(Mockito.any(RulesObject.class), Mockito.anyString())).thenReturn(new ArrayList<>());
124+
try {
125+
waitListWorker.run();
126+
assertTrue(true);
127+
} catch (Exception e) {
128+
assertFalse(true);
129+
e.printStackTrace();
130+
}
131+
}
132+
133+
@Test
134+
public void testRunWithMatchObjects() {
135+
Mockito.when(eventToObjectMapHandler.isEventInEventObjectMap(Mockito.anyString())).thenReturn(false);
136+
Mockito.when(matchId.fetchObjectsById(Mockito.any(RulesObject.class), Mockito.anyString())).thenReturn(list);
124137
try {
125138
waitListWorker.run();
126139
assertTrue(true);
@@ -131,8 +144,8 @@ public void testRunWithoutMatchObjects() {
131144
}
132145

133146
@Test
134-
public void testRunWithMatchbjects() {
135-
Mockito.when(matchId.fetchObjectsById(Mockito.anyObject(), Mockito.anyString())).thenReturn(list);
147+
public void testRunIfEventExistsInEventObjectMap() {
148+
Mockito.when(eventToObjectMapHandler.isEventInEventObjectMap(Mockito.anyString())).thenReturn(true);
136149
try {
137150
waitListWorker.run();
138151
assertTrue(true);
@@ -157,7 +170,7 @@ public void testRunWithMatchbjects() {
157170
// }
158171

159172
@Test
160-
public void testPublishandReceiveEvent() {
173+
public void testPublishAndReceiveEvent() {
161174
try {
162175
Channel channel = conn.createChannel();
163176
String queueName = "er001-eiffelxxx.eiffelintelligence.messageConsumer.durable";

src/test/resources/testWaitListinput1.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"id": "e90daae3-bf3f-4b0a-b899-67834fd5ebd0",
2+
"_id": "e90daae3-bf3f-4b0a-b899-67834fd5ebd0",
33
"Time": "2017/07/26 19:09:33",
44
"Event": {
55
"links": [{

0 commit comments

Comments
 (0)