eclipse-ee4j / eclipse-ee4j/jersey

SSE: java.lang.IllegalArgumentException: Unknown subscriber error

Open
#4,551 0 comments 0 reactions 0 assignees View on GitHub
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.