eclipse-ee4j / eclipse-ee4j/jersey
SSE: java.lang.IllegalArgumentException: Unknown subscriber error
- Dominant language
- Java
- Stars
- 730
- Forks
- 382
- PR merge metrics
- No merged PRs in 30d
Description
Hello,
I have an application that is reading from an AMQ topic that's publishing at 30Hz and then broadcasting information from that topic to connected web clients over SSE. The number of connected clients usually varies between 1-5 users. This application is using Jersey 2.30.1.
When a client connects via a REST endpoint, I register the sink with `SseBroadcaster.register`. I am currently calling `SseBroadcaster.broadcast` from within the JMSListener. Occasionally, I'll see the listener stop processing messages. After some time (ranges from a couple seconds to 1-2 minutes), I'll see the following error, and immediately after the listener will start processing messages
```
java.lang.IllegalArgumentException: Unknown subscriber.
at org.glassfish.jersey.internal.util.JerseyPublisher.getSubscriberWrapper(JerseyPublisher.java:286) ~[jersey-common-2.30.1.jar!/:na]
at org.glassfish.jersey.internal.util.JerseyPublisher.onDrop(JerseyPublisher.java:278) ~[jersey-common-2.30.1.jar!/:na]
at org.glassfish.jersey.internal.jsr166.SubmissionPublisher$2.test(Unknown Source) ~[jersey-common-2.30.1.jar!/:na]
at org.glassfish.jersey.internal.jsr166.SubmissionPublisher$2.test(Unknown Source) ~[jersey-common-2.30.1.jar!/:na]
at java.base/java.util.concurrent.SubmissionPublisher.retryOffer(SubmissionPublisher.java:445) ~[na:na]
at java.base/java.util.concurrent.SubmissionPublisher.doOffer(SubmissionPublisher.java:422) ~[na:na]
at java.base/java.util.concurrent.SubmissionPublisher.offer(SubmissionPublisher.java:550) ~[na:na]
at org.glassfish.jersey.internal.jsr166.SubmissionPublisher.offer(Unknown Source) ~[jersey-common-2.30.1.jar!/:na]
at org.glassfish.jersey.internal.util.JerseyPublisher.publish(JerseyPublisher.java:308) ~[jersey-common-2.30.1.jar!/:na]
at org.glassfish.jersey.media.sse.internal.JerseySseBroadcaster.broadcast(JerseySseBroadcaster.java:107) ~[jersey-media-sse-2.30.1.jar!/:na]
```
Prior to upgrading to `2.30.1`, I was running `2.27` and I'd see the same symptom with a different trace that shared a similar call stack:
```
java.lang.IllegalStateException: Calling [asyncComplete()] is not valid for a request with Async state [DISPATCHED]
at org.apache.coyote.AsyncStateMachine.doComplete(AsyncStateMachine.java:332) ~[tomcat-embed-core-9.0.19.jar!/:9.0.19]
at org.apache.coyote.AsyncStateMachine.asyncComplete(AsyncStateMachine.java:316) ~[tomcat-embed-core-9.0.19.jar!/:9.0.19]
at org.apache.coyote.AbstractProcessor.action(AbstractProcessor.java:496) ~[tomcat-embed-core-9.0.19.jar!/:9.0.19]
at org.apache.coyote.Request.action(Request.java:430) ~[tomcat-embed-core-9.0.19.jar!/:9.0.19]
at org.apache.catalina.core.AsyncContextImpl.complete(AsyncContextImpl.java:92) ~[tomcat-embed-core-9.0.19.jar!/:9.0.19]
at org.glassfish.jersey.servlet.async.AsyncContextDelegateProviderImpl$ExtensionImpl.complete(AsyncContextDelegateProviderImpl.java:126) ~[jersey-container-servlet-2.27.jar!/:na]
at org.glassfish.jersey.servlet.internal.ResponseWriter.commit(ResponseWriter.java:197) ~[jersey-container-servlet-core-2.27.jar!/:na]
at org.glassfish.jersey.server.ContainerResponse.close(ContainerResponse.java:414) ~[jersey-server-2.27.jar!/:na]
at org.glassfish.jersey.server.ChunkedOutput.flushQueue(ChunkedOutput.java:317) ~[jersey-server-2.27.jar!/:na]
at org.glassfish.jersey.server.ChunkedOutput.close(ChunkedOutput.java:345) ~[jersey-server-2.27.jar!/:na]
at org.glassfish.jersey.media.sse.internal.JerseyEventSink.close(JerseyEventSink.java:115) ~[jersey-media-sse-2.27.jar!/:na]
at org.glassfish.jersey.media.sse.internal.JerseySseBroadcaster$SseEventSinkWrapper.onError(JerseySseBroadcaster.java:170) ~[jersey-media-sse-2.27.jar!/:na]
at org.glassfish.jersey.internal.util.JerseyPublisher$SubscriberWrapper.onError(JerseyPublisher.java:420) ~[jersey-common-2.27.jar!/:na]
at org.glassfish.jersey.internal.util.JerseyPublisher.onDrop(JerseyPublisher.java:299) ~[jersey-common-2.27.jar!/:na]
at org.glassfish.jersey.internal.jsr166.SubmissionPublisher.doOffer(SubmissionPublisher.java:562) ~[jersey-common-2.27.jar!/:na]
at org.glassfish.jersey.internal.jsr166.SubmissionPublisher.offer(SubmissionPublisher.java:462) ~[jersey-common-2.27.jar!/:na]
at org.glassfish.jersey.internal.util.JerseyPublisher.publish(JerseyPublisher.java:330) ~[jersey-common-2.27.jar!/:na]
at org.glassfish.jersey.media.sse.internal.JerseySseBroadcaster.broadcast(JerseySseBroadcaster.java:129) ~[jersey-media-sse-2.27.jar!/:na]
```
I've ruled out that it's an issue with the data coming over the topic because I had a local instance running at the same time as a production instance consuming the same topic, and the local instance did not fail at the same time the production instance did.
Any chance I'm doing something wrong or am I hitting some limitation with Jersey SSE? Happy to provide more information if needed.
Contributor guide
Assessment
This issue has not been assessed yet.