11package io .cloudtrust .keycloak .eventemitter ;
22
3+ import com .fasterxml .jackson .core .JsonProcessingException ;
34import io .cloudtrust .keycloak .snowflake .IdGenerator ;
45import org .apache .http .client .methods .CloseableHttpResponse ;
56import org .apache .http .client .methods .HttpPost ;
1415import java .io .IOException ;
1516import java .nio .ByteBuffer ;
1617import java .util .Base64 ;
18+ import java .util .concurrent .LinkedBlockingQueue ;
1719
1820
1921/**
@@ -36,8 +38,8 @@ public class EventEmitterProvider implements EventListenerProvider{
3638 private CloseableHttpClient httpClient ;
3739 private HttpClientContext httpContext ;
3840 private IdGenerator idGenerator ;
39- private ConcurrentEvictingQueue <IdentifiedEvent > pendingEvents ;
40- private ConcurrentEvictingQueue <IdentifiedAdminEvent > pendingAdminEvents ;
41+ private LinkedBlockingQueue <IdentifiedEvent > pendingEvents ;
42+ private LinkedBlockingQueue <IdentifiedAdminEvent > pendingAdminEvents ;
4143 private String targetUri ;
4244 private String username ;
4345 private String secretToken ;
@@ -55,8 +57,8 @@ public class EventEmitterProvider implements EventListenerProvider{
5557 */
5658 EventEmitterProvider (CloseableHttpClient httpClient , IdGenerator idGenerator ,
5759 String targetUri , SerialisationFormat format ,
58- ConcurrentEvictingQueue <IdentifiedEvent > pendingEvents ,
59- ConcurrentEvictingQueue <IdentifiedAdminEvent > pendingAdminEvents ){
60+ LinkedBlockingQueue <IdentifiedEvent > pendingEvents ,
61+ LinkedBlockingQueue <IdentifiedAdminEvent > pendingAdminEvents ){
6062 logger .debug ("EventEmitterProvider contructor call" );
6163 this .httpClient = httpClient ;
6264 this .httpContext = HttpClientContext .create ();
@@ -86,7 +88,19 @@ public void onEvent(Event event) {
8688 logger .debugf ("Pending Events to send stored in buffer: %d" , pendingEvents .size ());
8789 long uid = idGenerator .nextValidId ();
8890 IdentifiedEvent identifiedEvent = new IdentifiedEvent (uid , event );
89- pendingEvents .offer (identifiedEvent );
91+
92+ while (!pendingEvents .offer (identifiedEvent )){
93+ Event skippedEvent = pendingEvents .poll ();
94+ if (skippedEvent != null ) {
95+ String strEvent = null ;
96+ try {
97+ strEvent = SerialisationUtils .toJson (skippedEvent );
98+ } catch (JsonProcessingException e ) {
99+ strEvent = "SerializationFailure" ;
100+ }
101+ logger .errorf ("Event dropped(%s) due to full queue" , strEvent );
102+ }
103+ }
90104
91105 sendEvents ();
92106 }
@@ -97,7 +111,19 @@ public void onEvent(AdminEvent adminEvent, boolean b) {
97111 logger .debugf ("Pending AdminEvents to send stored in buffer: %d" , pendingAdminEvents .size ());
98112 long uid = idGenerator .nextValidId ();
99113 IdentifiedAdminEvent identifiedAdminEvent = new IdentifiedAdminEvent (uid , adminEvent );
100- pendingAdminEvents .offer (identifiedAdminEvent );
114+
115+ while (!pendingAdminEvents .offer (identifiedAdminEvent )){
116+ AdminEvent skippedAdminEvent = pendingAdminEvents .poll ();
117+ if (skippedAdminEvent != null ) {
118+ String strAdminEvent = null ;
119+ try {
120+ strAdminEvent = SerialisationUtils .toJson (skippedAdminEvent );
121+ } catch (JsonProcessingException e ) {
122+ strAdminEvent = "SerializationFailure" ;
123+ }
124+ logger .errorf ("AdminEvent dropped(%s) due to full queue" , strAdminEvent );
125+ }
126+ }
101127
102128 sendEvents ();
103129 }
@@ -125,27 +151,37 @@ private void sendEventsWithJsonFormat() {
125151 for (int i =0 ; i < pendingEventsSize ; i ++){
126152 IdentifiedEvent event = pendingEvents .poll ();
127153
154+ if (event == null ){
155+ break ;
156+ }
157+
128158 try {
129159 String json = SerialisationUtils .toJson (event );
130160 sendJson (json );
131161 } catch (EventEmitterException | IOException e ) {
132162 pendingEvents .offer (event );
133163 logger .infof ("Failed to send event(ID=%s), try again later." , event .getUid ());
134164 logger .debug ("Failed to serialize or send event" , e );
165+ break ;
135166 }
136167 }
137168
138169 int pendingAdminEventsSize = pendingAdminEvents .size ();
139170 for (int i =0 ; i < pendingAdminEventsSize ; i ++){
140171 IdentifiedAdminEvent event = pendingAdminEvents .poll ();
141172
173+ if (event == null ){
174+ break ;
175+ }
176+
142177 try {
143178 String json = SerialisationUtils .toJson (event );
144179 sendJson (json );
145180 } catch (EventEmitterException | IOException e ) {
146181 pendingAdminEvents .offer (event );
147182 logger .infof ("Failed to send adminEvent(ID=%s), try again later." , event .getUid ());
148183 logger .debug ("Failed to serialize or send adminEvent" , e );
184+ break ;
149185 }
150186 }
151187 }
@@ -156,27 +192,37 @@ private void sendEventsWithFlatbufferFormat() {
156192 for (int i =0 ; i < pendingEventsSize ; i ++){
157193 IdentifiedEvent event = pendingEvents .poll ();
158194
195+ if (event == null ){
196+ break ;
197+ }
198+
159199 try {
160200 ByteBuffer buffer = SerialisationUtils .toFlat (event );
161201 sendBytes (buffer , Event .class .getSimpleName ());
162202 } catch (EventEmitterException | IOException e ) {
163203 pendingEvents .offer (event );
164204 logger .infof ("Failed to send event(ID=%s), try again later." , event .getUid ());
165205 logger .debug ("Failed to serialize or send event" , e );
206+ break ;
166207 }
167208 }
168209
169210 int pendingAdminEventsSize = pendingAdminEvents .size ();
170211 for (int i =0 ; i < pendingAdminEventsSize ; i ++){
171212 IdentifiedAdminEvent event = pendingAdminEvents .poll ();
172213
214+ if (event == null ){
215+ break ;
216+ }
217+
173218 try {
174219 ByteBuffer buffer = SerialisationUtils .toFlat (event );
175220 sendBytes (buffer , AdminEvent .class .getSimpleName ());
176221 } catch (EventEmitterException | IOException e ) {
177222 pendingAdminEvents .offer (event );
178223 logger .infof ("Failed to send adminEvent(ID=%s), try again later." , event .getUid ());
179224 logger .debug ("Failed to serialize or send adminEvent" , e );
225+ break ;
180226 }
181227 }
182228 }
0 commit comments