Push Publishing: unreachable endpoint stalls the queue; bundle pushed now shows as Scheduled with old date
@hassandotcms is already working on this.
Since Sep 7, 2026.
- Dominant language
- Java
- Stars
- 970
- Forks
- 486
- Avg merge
- 3d 33m
- Merged PRs (30d)
- 170
Description
Problem Statement
Two independent defects in sender-side Push Publishing. Both are visible in the Publishing Queue portlet (Beta and legacy, which read the same tables).
1. One unreachable endpoint stalls every other bundle.
The push-publish HTTP client has no connect timeout, so a bundle whose endpoint does not answer blocks the publisher job for about two minutes per attempt. The job is single-threaded, so every bundle pushed after it waits; bundles pushed for "now" have been processed 10 to 19 minutes late. Any unexpected exception in one bundle also ends the whole run.
2. A bundle pushed for "now" is shown as Scheduled with an old date.
GET /api/v1/publishing reports every bundle that is queued but not yet picked up as SCHEDULED, whether its publish date is in the future or already due, and uses the date the assets were added to the draft bundle as createDate. A bundle created weeks ago and pushed today with the default publish date shows status Scheduled, a weeks-old Date Entered, and a detail line Scheduled for <push time>. Normally invisible because the job picks the bundle up in about two seconds; with problem 1 it lasts minutes.
Steps to Reproduce
- Create environment
TESTwith one enabled endpoint whose connection attempts get no answer (a firewalled or non-routable address). - Push bundle A to
TESTwith the default publish date. - Within a few seconds push bundle B (any environment) whose assets were added to the bundle days earlier.
- Refresh the Publishing Queue for several minutes; open View details on B.
Expected
- A fails within seconds with a connection error. B is picked up within seconds of its publish time.
- While B waits it is reported as requested, its Date Entered is the push time, and no "Scheduled for" date is shown.
Actual
- A shows Sending for about two minutes per attempt, three attempts, plus the same wait on every status poll of A.
- B shows Scheduled with the old draft date and "Scheduled for <push time>" until the job reaches it, minutes later.
Fix scope (backend only)
- F1 A connect timeout on the HTTP clients created in
PushPublisher(bundle upload) andPublisherQueueJob(status poll), configurable viaConfig, default about 10 s. Only the TCP handshake wait is bounded. - F2 In
PublisherQueueJob, any throwable while processing one bundle finalizes that bundle (failed status with message, queue rows removed, one transaction) and processing continues with the next bundle. - F3 In the v1 API, a queued bundle whose
publish_date <= nowis reported asBUNDLE_REQUESTEDwithcreateDate = publish_dateand noscheduledPublishDate. Future-dated bundles keepSCHEDULED. Thestatusfilter follows the same split. No DB write.
Acceptance Criteria
- AC-001 With an endpoint whose TCP handshake never completes, a pushed bundle reaches
FAILED_TO_SEND_TO_ALL_GROUPSwithin the configured connect timeout plus 15 s, with the endpoint message naming the timeout. - AC-002 In that setup, a bundle pushed 7 s later to a healthy or refused endpoint has its audit row within 30 s of its publish date, and the job keeps running every minute.
- AC-003 A runtime exception while processing one bundle fails that bundle with the message recorded and its queue rows removed; remaining bundles in the same run are still processed.
- AC-004 A bundle pushed with
publishDate = nowwhose assets were added earlier is returned byGET /api/v1/publishingandGET /api/v1/publishing/{id}asBUNDLE_REQUESTED, withcreateDatewithin 5 s of the push time andscheduledPublishDate = null, until the job picks it up. - AC-005 A bundle pushed with
publishDateone hour ahead is returned asSCHEDULEDwithscheduledPublishDateset, as today.?status=SCHEDULEDreturns only future-dated bundles;?status=BUNDLE_REQUESTEDincludes due, not-yet-picked-up bundles. - AC-006 Existing push-publishing integration tests stay green; a push to a healthy receiver behaves as before.
- Verification: two new integration tests in
dotcms-integration, registered in aMainSuite: one for AC-001 to AC-003 using an endpoint whose handshake never completes (saturatedServerSocketbacklog or non-routable address) with a short configured connect timeout; one for AC-004 and AC-005 with a backdatedentered_date.
dotCMS Version
main (also seen on a 1.0.0-SNAPSHOT build of 2026-08-31).
Severity
High - Major functionality broken
Links
- Related, same stall class with other triggers: #36343, #35764, #35999
- Spec:
specs/37449-publishing-queue-dead-endpoint/spec.md - Freshdesk: NA
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Assessment
This issue has not been assessed yet.