{"record":{"id":"263a276ecedaade5","repo":"quarkusio/quarkus","slug":"delay-must-be-0-reconnectdelay","errorCode":null,"errorMessage":"Delay must be > 0: <reconnectDelay>","messagePattern":"Delay must be > 0: <reconnectDelay>","errorType":"validation","errorClass":"java.lang.IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"independent-projects/resteasy-reactive/client/runtime/src/main/java/org/jboss/resteasy/reactive/client/impl/SseEventSourceImpl.java","lineNumber":54,"sourceCode":"    private final List<Consumer<InboundSseEvent>> consumers = new ArrayList<>();\n    private final List<Consumer<Throwable>> errorListeners = new ArrayList<>();\n    private final List<Runnable> completionListeners = new ArrayList<>();\n    private HttpConnection connection;\n    private final SseParser sseParser;\n    private long timerId = -1;\n    private boolean receivedClientClose;\n\n    public SseEventSourceImpl(WebTargetImpl webTarget, Invocation.Builder invocationBuilder,\n            long reconnectDelay, TimeUnit reconnectUnit) {\n        this(webTarget, invocationBuilder, reconnectDelay, reconnectUnit, null);\n    }\n\n    public SseEventSourceImpl(WebTargetImpl webTarget, Invocation.Builder invocationBuilder,\n            long reconnectDelay, TimeUnit reconnectUnit, String defaultContentType) {\n        // tests set a null endpoint\n        Objects.requireNonNull(reconnectUnit);\n        if (reconnectDelay <= 0)\n            throw new IllegalArgumentException(\"Delay must be > 0: \" + reconnectDelay);\n        this.webTarget = webTarget;\n        this.reconnectDelay = reconnectDelay;\n        this.reconnectUnit = reconnectUnit;\n        this.sseParser = new SseParser(this, defaultContentType);\n        this.invocationBuilder = invocationBuilder;\n    }\n\n    WebTargetImpl getWebTarget() {\n        return webTarget;\n    }\n\n    @Override\n    public synchronized void register(Consumer<InboundSseEvent> onEvent) {\n        consumers.add(onEvent);\n    }\n\n    @Override\n    public synchronized void register(Consumer<InboundSseEvent> onEvent, Consumer<Throwable> onError) {","sourceCodeStart":36,"sourceCodeEnd":72,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/independent-projects/resteasy-reactive/client/runtime/src/main/java/org/jboss/resteasy/reactive/client/impl/SseEventSourceImpl.java#L36-L72","documentation":"The SseEventSourceImpl constructor validates reconnectDelay and throws this IllegalArgumentException when it is zero or negative (a null TimeUnit also fails via requireNonNull). It is the constructor-level duplicate of the builder-side check, protecting the SSE parser's reconnect timer.","triggerScenarios":"Constructing SseEventSourceImpl directly (or through a custom builder path) with reconnectDelay <= 0; reading a reconnect delay from configuration where the default is 0.","commonSituations":"Programmatic construction of SSE sources without the validating builder; config properties like quarkus.rest-client.sse-reconnect-interval set to an invalid zero/negative value; wrong unit conversion producing 0.","solutions":["Pass a positive reconnectDelay (e.g. 500 with TimeUnit.MILLISECONDS)","Set the client config property to a valid duration (e.g. quarkus.rest-client.<key>.sse-reconnect-interval=PT1S)","Clamp or validate the configured value before constructing the source"],"exampleFix":"// before\nnew SseEventSourceImpl(target, builder, 0, TimeUnit.SECONDS, null);\n// after\nnew SseEventSourceImpl(target, builder, 1, TimeUnit.SECONDS, null);","handlingStrategy":"validation","validationCode":"Objects.requireNonNull(unit, \"reconnectUnit required\");\nif (reconnectDelay <= 0) {\n    throw new IllegalArgumentException(\"reconnectDelay must be > 0, got: \" + reconnectDelay);\n}\nSseEventSourceImpl source = new SseEventSourceImpl(webTarget, builder, reconnectDelay, unit, contentType);","typeGuard":"boolean canCreateSseSource(long delay, TimeUnit unit) {\n    return unit != null && delay > 0;\n}","tryCatchPattern":"try {\n    source = new SseEventSourceImpl(target, invBuilder, delay, unit, type);\n} catch (IllegalArgumentException e) {\n    if (e.getMessage().startsWith(\"Delay must be > 0\")) {\n        source = new SseEventSourceImpl(target, invBuilder, 1, TimeUnit.SECONDS, type);\n    } else throw e;\n}","preventionTips":["Prefer target.sse(...)/the validating builder over direct constructor use","Ensure configured SSE reconnect intervals are positive durations","Sanitize defaults: 0 from missing config should map to a positive default"],"tags":["sse","rest-client-reactive","illegal-argument","validation"],"backgroundTag":"invalid-delay-parameter","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}