shashank created CAMEL-25549:
--------------------------------
Summary: camel-atom - with sortEntries=true the consumer routes
the entries newest first, and with the default idempotent strategy only the
newest entry of a feed is routed
Key: CAMEL-25549
URL: https://issues.apache.org/jira/browse/CAMEL-25549
Project: Camel
Issue Type: Bug
Components: camel-atom
Reporter: shashank
Assignee: shashank
{{AtomUtils.readItems}} (lines 44-60 at main 9432ba16d026) sorts the items of a
feed with {{ItemComparator.oldestItemFirst()}} when {{sortEntries=true}}.
{{FeedEntryPollingConsumer.poll}} routes the entries from the end of the list
({{entryIndex = list.size() - 1}}, {{list.get(entryIndex--)}}), so the sorted
entries are routed from the newest to the oldest one. camel-rss sorts newest
first for the same loop ({{RssDateComparator}}) and routes oldest first
({{RssEntrySortTest}} expects ascending dates), and so did camel-atom up to 3.x
({{AtomEntrySortTest}}, removed when the parser was replaced in 4.0).
Since 4.21 the consumer is idempotent by default (CAMEL-23220):
{{ItemUpdatedIdempotentStrategy}} routes an entry only when its updated (or
published) date is after the date of the entry routed before it. With the
newest entry routed first, every other entry of the feed is older and is
skipped. So
{code:java}
from("atom:https://example.org/feed?sortEntries=true").to("...");
{code}
routes one entry of the feed, the newest, and silently skips all the others; at
later polls, of several new entries only the newest is routed. With
{{idempotent=false}} all entries are routed, newest first.
h3. Reproduction
New {{AtomEntrySortTest}}: one poll of {{src/test/data/unsortedfeed.atom}} (10
entries), {{splitEntries=true&throttleEntries=false}}, the consumer polled
directly. On main, twice:
{noformat}
sortedEntriesAreAllRoutedOldestFirst: All the entries of the feed must be
routed ==> expected: <10> but was: <1>
sortedEntriesAreRoutedOldestFirstWithoutIdempotency: expected:
<[2008-08-27T08:09:43-05:00, ..., 2008-11-12T08:08:35-06:00]> but was:
<[2008-11-12T08:08:35-06:00, ..., 2008-08-27T08:09:43-05:00]>
{noformat}
A third test (the same feed without {{sortEntries}}: 10 entries, oldest first)
passes on main too (the change does not touch that path).
h3. Proposed fix
{{AtomEntryPollingConsumer}} reverses the sorted list, so that the loop, which
starts at the end, routes the oldest entry first. {{AtomUtils.readItems}} and
the list that the consumer with {{splitEntries=false}} puts in the body are
unchanged. 4.23 upgrade guide note added and marked as a breaking change
(routes with {{sortEntries=true&idempotent=false}} now get the entries in the
reverse order, oldest first). camel-atom with the fix: 36 tests, 0 failures, 1
skipped (as on main).
For information, not changed: since 4.0 the entries are sorted by date also
without {{sortEntries}} ({{Comparator.naturalOrder()}} of the parser's items is
newest first, routed from the end: oldest first), so after the fix both
settings route in the same order.
Found with a Lean 4 model of the poll (an entry as its date, the idempotent
strategy as "keep an entry after the last kept date"): for every sorted feed
main is proved to route only the newest entry, so it loses entries whenever the
feed has two or more; the fix is proved to route every entry of a sorted feed,
in order. Confirmed with the real consumer.
Affected: the reversed order in main, camel-4.22.x, camel-4.18.x, camel-4.14.x
(same {{AtomUtils}}, GitHub contents API; since 4.0.0); the skipped entries in
main and camel-4.22.x (the idempotent strategy exists since 4.21.0).
Duplicate check (2026-10-11): JIRA text "sortEntries" (4: CAMEL-1156 added the
option in 2008, CAMEL-7784 is about camel-rss entries with identical dates),
summary "camel-atom" since 2023-06 (6, none about the order); GitHub pull
requests with "atom" in the title: none open. No open pull request changes
{{AtomEntryPollingConsumer}} or {{AtomUtils}}.
_Filed with Claude Code on behalf of allthingssecurity._
--
This message was sent by Atlassian Jira
(v8.20.10#820010)