<mavenArtifactRecord _class='hudson.maven.reporters.MavenArtifactRecord'><mainArtifact><artifactId>com.trekglobal.idempiere.rest.api.test</artifactId><canonicalName>com.trekglobal.idempiere.rest.api.test-1.0.0-SNAPSHOT.pom</canonicalName><fileName>pom.xml</fileName><groupId>com.trekglobal.idempiere.extensions</groupId><md5sum>6b92f8ef39daeb8f6844c4e5ed1a4ce2</md5sum><type>pom</type><version>1.0.0-SNAPSHOT</version></mainArtifact><parent><action _class='hudson.maven.reporters.MavenArtifactRecord'><url>https://jenkins.younex.de/job/idempiere-rest-master/com.trekglobal.idempiere.extensions$com.trekglobal.idempiere.rest.api.test/131/mavenArtifacts/</url></action><action></action><action></action><action _class='org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction'></action><artifact><displayPath>com.trekglobal.idempiere.rest.api.test-1.0.0-SNAPSHOT.pom</displayPath><fileName>com.trekglobal.idempiere.rest.api.test-1.0.0-SNAPSHOT.pom</fileName><relativePath>com.trekglobal.idempiere.extensions/com.trekglobal.idempiere.rest.api.test/1.0.0-SNAPSHOT/com.trekglobal.idempiere.rest.api.test-1.0.0-SNAPSHOT.pom</relativePath></artifact><building>false</building><displayName>com.trekglobal.idempiere.rest.api.test</displayName><duration>0</duration><estimatedDuration>-1</estimatedDuration><fullDisplayName>idempiere-rest-master » com.trekglobal.idempiere.rest.api.test com.trekglobal.idempiere.rest.api.test</fullDisplayName><id>131</id><inProgress>false</inProgress><keepLog>false</keepLog><number>131</number><queueId>-1</queueId><result>NOT_BUILT</result><timestamp>1790822647399</timestamp><url>https://jenkins.younex.de/job/idempiere-rest-master/com.trekglobal.idempiere.extensions$com.trekglobal.idempiere.rest.api.test/131/</url><builtOn></builtOn><changeSet _class='hudson.maven.FilteredChangeLogSet'><item _class='hudson.plugins.git.GitChangeSet'><affectedPath>com.trekglobal.idempiere.rest.api.test/src/com/trekglobal/idempiere/rest/api/webhook/test/WebhookRetryPendingTest.java</affectedPath><affectedPath>com.trekglobal.idempiere.rest.api/src/com/trekglobal/idempiere/rest/api/process/WebhookRetryProcessor.java</affectedPath><affectedPath>com.trekglobal.idempiere.rest.api/src/com/trekglobal/idempiere/rest/api/model/MRestWebhookOutLog.java</affectedPath><commitId>19880d6384f91804143872262e0670d9272121d0</commitId><timestamp>1790768942000</timestamp><author><absoluteUrl>https://jenkins.younex.de/user/noreply</absoluteUrl><fullName>noreply</fullName></author><authorEmail>noreply@github.com</authorEmail><comment>fix(webhook): bound WebhookRetryProcessor memory with batches, skip paused endpoints (#538)

* fix(webhook): bound WebhookRetryProcessor memory with batches, skip paused endpoints

Fixes bxservice/idempiere-rest#537

Co-Authored-By: Claude Opus 5.5 (1M context) &lt;noreply@anthropic.com&gt;

* test(webhook): cover getPendingRetries batching and paused-endpoint exclusion

Refs bxservice/idempiere-rest#537

Co-Authored-By: Claude Opus 5.5 (1M context) &lt;noreply@anthropic.com&gt;

* fix(webhook): enforce retry runtime limit per delivery, not per batch

Refs bxservice/idempiere-rest#537

Co-Authored-By: Claude Opus 5.5 (1M context) &lt;noreply@anthropic.com&gt;

* refactor(webhook): use Query.iterate() for pending retries instead of keyset batches

Refs bxservice/idempiere-rest#537

Co-Authored-By: Claude Opus 5.5 (1M context) &lt;noreply@anthropic.com&gt;

* perf(webhook): stream pending retries to avoid N+1 row loads

Query.iterate() loads IDs up front and re-fetches each row with a separate
SELECT, which means one query per delivery on a backlog of millions.
Switch to Query.stream() so each delivery is built straight off the open
result set, and re-run the query per batch of COMMIT_INTERVAL so commits
never happen while the cursor is open. Processed rows leave the WHERE
clause, so each fresh batch continues where the previous one stopped.

Refs #537

Co-Authored-By: Claude Opus 5.5 (1M context) &lt;noreply@anthropic.com&gt;

* fix(webhook): cap pending-retry query with SQL LIMIT per batch

Query.stream() sets no fetch size, so pgJDBC buffers the whole result set
before the first row is read; stopping after COMMIT_INTERVAL rows in Java
still loaded the entire backlog. Pass the batch size into
streamPendingRetries and apply it via setPageSize, so each query returns
at most one batch. No OFFSET is needed since processed rows leave the
WHERE clause.

Also check the runtime deadline before opening each batch query.

Refs #537

Co-Authored-By: Claude Opus 5.5 (1M context) &lt;noreply@anthropic.com&gt;

---------

Co-authored-by: Claude Opus 5.5 (1M context) &lt;noreply@anthropic.com&gt;
</comment><date>2026-09-30 13:49:02 +0200</date><id>19880d6384f91804143872262e0670d9272121d0</id><msg>fix(webhook): bound WebhookRetryProcessor memory with batches, skip paused endpoints (#538)</msg><path><editType>add</editType><file>com.trekglobal.idempiere.rest.api.test/src/com/trekglobal/idempiere/rest/api/webhook/test/WebhookRetryPendingTest.java</file></path><path><editType>edit</editType><file>com.trekglobal.idempiere.rest.api/src/com/trekglobal/idempiere/rest/api/process/WebhookRetryProcessor.java</file></path><path><editType>edit</editType><file>com.trekglobal.idempiere.rest.api/src/com/trekglobal/idempiere/rest/api/model/MRestWebhookOutLog.java</file></path></item></changeSet><culprit><absoluteUrl>https://jenkins.younex.de/user/noreply</absoluteUrl><fullName>noreply</fullName></culprit><mavenArtifacts><url>https://jenkins.younex.de/job/idempiere-rest-master/com.trekglobal.idempiere.extensions$com.trekglobal.idempiere.rest.api.test/131/mavenArtifacts/</url></mavenArtifacts></parent><pomArtifact><artifactId>com.trekglobal.idempiere.rest.api.test</artifactId><canonicalName>com.trekglobal.idempiere.rest.api.test-1.0.0-SNAPSHOT.pom</canonicalName><fileName>pom.xml</fileName><groupId>com.trekglobal.idempiere.extensions</groupId><md5sum>6b92f8ef39daeb8f6844c4e5ed1a4ce2</md5sum><type>pom</type><version>1.0.0-SNAPSHOT</version></pomArtifact><url>https://jenkins.younex.de/job/idempiere-rest-master/com.trekglobal.idempiere.extensions$com.trekglobal.idempiere.rest.api.test/131/mavenArtifacts/</url></mavenArtifactRecord>