2
votes

I am new here so forgive me if I am not familiar with standard operating procedure, but I have researched this topic at length and haven't found a lot of info.

I am trying to implement a client in a Java Http Servlet that can subscribe to a server-sent-event stream and parse data from that stream. Every time I have a client POST a request to my Http servlet, I need to pass on some data from that client to another server and then open an SSE listener, as that is how the other server will notify me it has data for me to hand back to the client.

It needs to be asynchronous and probably multi-threaded because I will have many requests from the client happening in a short time frame and I need to catch every event coming back from the server. The data I pass back from the server to the client can be large so I need threading so I don't miss new events coming in.

I am at a loss for where to start. I have tried implementing some of the example code using the Jersey SSE API (https://jersey.java.net/documentation/latest/sse.html) but when I implement their asynchronous SSE event handling example, the events coming in happen too fast for my handler to process all the data back to the client and the function gets called again from a new event before it finishes, or at least that's what seems to be happening.

Here is a synopsis of what I have written so far:

Client client = ClientBuilder.newBuilder().register(SseFeature.class).build();
WebTarget target = client.target("Target URL");
EventSource eventSource = new EventSource(target) {
 @Override
 public void onEvent(InboundEvent inboundEvent){
     if ("in".equals(inboundEvent.getName())) {

         //Check if the event is of the type we care about
         //If it is, open an input stream to read the payload and store in a byte array via an HttpURLConnection object
         //Open an output stream and stream the payload to a client via an HttpServletResponse Object - This never seems to happen

         }

     }     
 };
}

I know it's sloppy, I'm not as familiar with Java so I am just piecing things together so I apologize for that.

This gets called from within my servlet class but it never makes it to the point where I write to the output stream, I think because it's getting interrupted by another event coming in. If anyone has insight into how I can make this work, or another way to do it, I would greatly appreciate it. Thanks.

1

1 Answers

0
votes

I recommend you the JEaSSE library (Java Easy Server-Sent Events): http://mvnrepository.com/artifact/info.macias/jeasse

You can find some usage examples here:

https://github.com/mariomac/jeasse