Skip to content

Commit 444da9f

Browse files
committed
Fixed multi-thread issue with events
1 parent 97c63f0 commit 444da9f

File tree

2 files changed

+97
-62
lines changed

2 files changed

+97
-62
lines changed

engine/src/main/java/com/arcadedb/database/RecordEventsRegistry.java

Lines changed: 97 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -25,145 +25,181 @@
2525
import java.util.*;
2626

2727
public class RecordEventsRegistry implements RecordEvents {
28-
private final List<BeforeRecordCreateListener> beforeCreateListeners = new ArrayList<>();
28+
private final List<BeforeRecordCreateListener> beforeCreateListeners = new ArrayList<>();
2929
private final List<BeforeRecordUpdateListener> beforeUpdateListeners = new ArrayList<>();
3030
private final List<BeforeRecordDeleteListener> beforeDeleteListeners = new ArrayList<>();
3131
private final List<AfterRecordCreateListener> afterCreateListeners = new ArrayList<>();
32-
private final List<AfterRecordUpdateListener> afterUpdateListeners = new ArrayList<>();
33-
private final List<AfterRecordDeleteListener> afterDeleteListeners = new ArrayList<>();
32+
private final List<AfterRecordUpdateListener> afterUpdateListeners = new ArrayList<>();
33+
private final List<AfterRecordDeleteListener> afterDeleteListeners = new ArrayList<>();
3434

3535
@Override
36-
public synchronized RecordEventsRegistry registerListener(final BeforeRecordCreateListener listener) {
37-
if (!beforeCreateListeners.contains(listener))
38-
beforeCreateListeners.add(listener);
36+
public RecordEventsRegistry registerListener(final BeforeRecordCreateListener listener) {
37+
synchronized (beforeCreateListeners) {
38+
if (!beforeCreateListeners.contains(listener))
39+
beforeCreateListeners.add(listener);
40+
}
3941
return this;
4042
}
4143

4244
@Override
43-
public synchronized RecordEventsRegistry registerListener(final BeforeRecordUpdateListener listener) {
44-
if (!beforeUpdateListeners.contains(listener))
45-
beforeUpdateListeners.add(listener);
45+
public RecordEventsRegistry registerListener(final BeforeRecordUpdateListener listener) {
46+
synchronized (beforeUpdateListeners) {
47+
if (!beforeUpdateListeners.contains(listener))
48+
beforeUpdateListeners.add(listener);
49+
}
4650
return this;
4751
}
4852

4953
@Override
50-
public synchronized RecordEventsRegistry registerListener(final BeforeRecordDeleteListener listener) {
51-
if (!beforeDeleteListeners.contains(listener))
52-
beforeDeleteListeners.add(listener);
54+
public RecordEventsRegistry registerListener(final BeforeRecordDeleteListener listener) {
55+
synchronized (beforeDeleteListeners) {
56+
if (!beforeDeleteListeners.contains(listener))
57+
beforeDeleteListeners.add(listener);
58+
}
5359
return this;
5460
}
5561

5662
@Override
57-
public synchronized RecordEventsRegistry registerListener(final AfterRecordCreateListener listener) {
58-
if (!afterCreateListeners.contains(listener))
59-
afterCreateListeners.add(listener);
63+
public RecordEventsRegistry registerListener(final AfterRecordCreateListener listener) {
64+
synchronized (afterCreateListeners) {
65+
if (!afterCreateListeners.contains(listener))
66+
afterCreateListeners.add(listener);
67+
}
6068
return this;
6169
}
6270

6371
@Override
64-
public synchronized RecordEventsRegistry registerListener(final AfterRecordUpdateListener listener) {
65-
if (!afterUpdateListeners.contains(listener))
66-
afterUpdateListeners.add(listener);
72+
public RecordEventsRegistry registerListener(final AfterRecordUpdateListener listener) {
73+
synchronized (afterUpdateListeners) {
74+
if (!afterUpdateListeners.contains(listener))
75+
afterUpdateListeners.add(listener);
76+
}
6777
return this;
6878
}
6979

7080
@Override
71-
public synchronized RecordEventsRegistry registerListener(final AfterRecordDeleteListener listener) {
72-
if (!afterDeleteListeners.contains(listener))
73-
afterDeleteListeners.add(listener);
81+
public RecordEventsRegistry registerListener(final AfterRecordDeleteListener listener) {
82+
synchronized (afterDeleteListeners) {
83+
if (!afterDeleteListeners.contains(listener))
84+
afterDeleteListeners.add(listener);
85+
}
7486
return this;
7587
}
7688

7789
@Override
78-
public synchronized RecordEventsRegistry unregisterListener(final BeforeRecordCreateListener listener) {
79-
beforeCreateListeners.remove(listener);
90+
public RecordEventsRegistry unregisterListener(final BeforeRecordCreateListener listener) {
91+
synchronized (beforeCreateListeners) {
92+
beforeCreateListeners.remove(listener);
93+
}
8094
return this;
8195
}
8296

8397
@Override
84-
public synchronized RecordEventsRegistry unregisterListener(final BeforeRecordUpdateListener listener) {
85-
beforeUpdateListeners.remove(listener);
98+
public RecordEventsRegistry unregisterListener(final BeforeRecordUpdateListener listener) {
99+
synchronized (beforeUpdateListeners) {
100+
beforeUpdateListeners.remove(listener);
101+
}
86102
return this;
87103
}
88104

89105
@Override
90-
public synchronized RecordEventsRegistry unregisterListener(final BeforeRecordDeleteListener listener) {
91-
beforeDeleteListeners.remove(listener);
106+
public RecordEventsRegistry unregisterListener(final BeforeRecordDeleteListener listener) {
107+
synchronized (beforeDeleteListeners) {
108+
beforeDeleteListeners.remove(listener);
109+
}
92110
return this;
93111
}
94112

95113
@Override
96114
public synchronized RecordEventsRegistry unregisterListener(final AfterRecordCreateListener listener) {
97-
afterCreateListeners.remove(listener);
115+
synchronized (afterCreateListeners) {
116+
afterCreateListeners.remove(listener);
117+
}
98118
return this;
99119
}
100120

101121
@Override
102122
public synchronized RecordEventsRegistry unregisterListener(final AfterRecordUpdateListener listener) {
103-
afterUpdateListeners.remove(listener);
123+
synchronized (afterUpdateListeners) {
124+
afterUpdateListeners.remove(listener);
125+
}
104126
return this;
105127
}
106128

107129
@Override
108-
public synchronized RecordEventsRegistry unregisterListener(final AfterRecordDeleteListener listener) {
109-
afterDeleteListeners.remove(listener);
130+
public RecordEventsRegistry unregisterListener(final AfterRecordDeleteListener listener) {
131+
synchronized (afterDeleteListeners) {
132+
afterDeleteListeners.remove(listener);
133+
}
110134
return this;
111135
}
112136

113137
public boolean onBeforeCreate(final Record record) {
114-
if (beforeCreateListeners.isEmpty())
115-
return true;
116-
117-
for (int i = 0; i < beforeCreateListeners.size(); i++) {
118-
if (!beforeCreateListeners.get(i).onBeforeCreate(record))
119-
return false;
138+
synchronized (beforeCreateListeners) {
139+
if (beforeCreateListeners.isEmpty())
140+
return true;
141+
142+
for (int i = 0; i < beforeCreateListeners.size(); i++) {
143+
if (!beforeCreateListeners.get(i).onBeforeCreate(record))
144+
return false;
145+
}
120146
}
121147
return true;
122148
}
123149

124150
public boolean onBeforeUpdate(final Record record) {
125-
if (beforeUpdateListeners.isEmpty())
126-
return true;
127-
128-
for (int i = 0; i < beforeUpdateListeners.size(); i++) {
129-
if (!beforeUpdateListeners.get(i).onBeforeUpdate(record))
130-
return false;
151+
synchronized (beforeUpdateListeners) {
152+
if (beforeUpdateListeners.isEmpty())
153+
return true;
154+
155+
for (int i = 0; i < beforeUpdateListeners.size(); i++) {
156+
if (!beforeUpdateListeners.get(i).onBeforeUpdate(record))
157+
return false;
158+
}
131159
}
132160
return true;
133161
}
134162

135163
public boolean onBeforeDelete(final Record record) {
136-
if (beforeDeleteListeners.isEmpty())
137-
return true;
138-
139-
for (int i = 0; i < beforeDeleteListeners.size(); i++) {
140-
if (!beforeDeleteListeners.get(i).onBeforeDelete(record))
141-
return false;
164+
synchronized (beforeDeleteListeners) {
165+
if (beforeDeleteListeners.isEmpty())
166+
return true;
167+
168+
for (int i = 0; i < beforeDeleteListeners.size(); i++) {
169+
if (!beforeDeleteListeners.get(i).onBeforeDelete(record))
170+
return false;
171+
}
142172
}
143173
return true;
144174
}
145175

146176
public void onAfterCreate(final Record record) {
147-
if (afterCreateListeners.isEmpty())
148-
return;
177+
synchronized (afterCreateListeners) {
178+
if (afterCreateListeners.isEmpty())
179+
return;
149180

150-
for (int i = 0; i < afterCreateListeners.size(); i++)
151-
afterCreateListeners.get(i).onAfterCreate(record);
181+
for (int i = 0; i < afterCreateListeners.size(); i++)
182+
afterCreateListeners.get(i).onAfterCreate(record);
183+
}
152184
}
153185

154186
public void onAfterUpdate(final Record record) {
155-
if (afterUpdateListeners.isEmpty())
156-
return;
187+
synchronized (afterUpdateListeners) {
188+
if (afterUpdateListeners.isEmpty())
189+
return;
157190

158-
for (int i = 0; i < afterUpdateListeners.size(); i++)
159-
afterUpdateListeners.get(i).onAfterUpdate(record);
191+
for (int i = 0; i < afterUpdateListeners.size(); i++)
192+
afterUpdateListeners.get(i).onAfterUpdate(record);
193+
}
160194
}
161195

162196
public void onAfterDelete(final Record record) {
163-
if (afterDeleteListeners.isEmpty())
164-
return;
197+
synchronized (afterDeleteListeners) {
198+
if (afterDeleteListeners.isEmpty())
199+
return;
165200

166-
for (int i = 0; i < afterDeleteListeners.size(); i++)
167-
afterDeleteListeners.get(i).onAfterDelete(record);
201+
for (int i = 0; i < afterDeleteListeners.size(); i++)
202+
afterDeleteListeners.get(i).onAfterDelete(record);
203+
}
168204
}
169205
}

engine/src/test/java/com/arcadedb/event/TypeEventsTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ public void testBeforeCreate() {
4242
};
4343

4444
database.getSchema().getType("Vertex").getEvents().registerListener(listener);
45-
4645
try {
4746

4847
database.transaction(() -> {

0 commit comments

Comments
 (0)