{
  "_class" : "hudson.maven.MavenBuild",
  "actions" : [
    {
      "_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/"
    },
    {
      
    },
    {
      
    },
    {
      "_class" : "org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction"
    }
  ],
  "artifacts" : [
    {
      "displayPath" : "com.trekglobal.idempiere.rest.api.test-1.0.0-SNAPSHOT.pom",
      "fileName" : "com.trekglobal.idempiere.rest.api.test-1.0.0-SNAPSHOT.pom",
      "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"
    }
  ],
  "building" : False,
  "description" : None,
  "displayName" : "com.trekglobal.idempiere.rest.api.test",
  "duration" : 0,
  "estimatedDuration" : -1,
  "executor" : None,
  "fullDisplayName" : "idempiere-rest-master » com.trekglobal.idempiere.rest.api.test com.trekglobal.idempiere.rest.api.test",
  "id" : "131",
  "inProgress" : False,
  "keepLog" : False,
  "number" : 131,
  "queueId" : -1,
  "result" : "NOT_BUILT",
  "timestamp" : 1790822647399,
  "url" : "https://jenkins.younex.de/job/idempiere-rest-master/com.trekglobal.idempiere.extensions$com.trekglobal.idempiere.rest.api.test/131/",
  "builtOn" : "",
  "changeSet" : {
    "_class" : "hudson.maven.FilteredChangeLogSet",
    "items" : [
      {
        "_class" : "hudson.plugins.git.GitChangeSet",
        "affectedPaths" : [
          "com.trekglobal.idempiere.rest.api.test/src/com/trekglobal/idempiere/rest/api/webhook/test/WebhookRetryPendingTest.java",
          "com.trekglobal.idempiere.rest.api/src/com/trekglobal/idempiere/rest/api/process/WebhookRetryProcessor.java",
          "com.trekglobal.idempiere.rest.api/src/com/trekglobal/idempiere/rest/api/model/MRestWebhookOutLog.java"
        ],
        "commitId" : "19880d6384f91804143872262e0670d9272121d0",
        "timestamp" : 1790768942000,
        "author" : {
          "absoluteUrl" : "https://jenkins.younex.de/user/noreply",
          "fullName" : "noreply"
        },
        "authorEmail" : "noreply@github.com",
        "comment" : "fix(webhook): bound WebhookRetryProcessor memory with batches, skip paused endpoints (#538)\u000a\u000a* fix(webhook): bound WebhookRetryProcessor memory with batches, skip paused endpoints\u000a\u000aFixes bxservice/idempiere-rest#537\u000a\u000aCo-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>\u000a\u000a* test(webhook): cover getPendingRetries batching and paused-endpoint exclusion\u000a\u000aRefs bxservice/idempiere-rest#537\u000a\u000aCo-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>\u000a\u000a* fix(webhook): enforce retry runtime limit per delivery, not per batch\u000a\u000aRefs bxservice/idempiere-rest#537\u000a\u000aCo-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>\u000a\u000a* refactor(webhook): use Query.iterate() for pending retries instead of keyset batches\u000a\u000aRefs bxservice/idempiere-rest#537\u000a\u000aCo-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>\u000a\u000a* perf(webhook): stream pending retries to avoid N+1 row loads\u000a\u000aQuery.iterate() loads IDs up front and re-fetches each row with a separate\u000aSELECT, which means one query per delivery on a backlog of millions.\u000aSwitch to Query.stream() so each delivery is built straight off the open\u000aresult set, and re-run the query per batch of COMMIT_INTERVAL so commits\u000anever happen while the cursor is open. Processed rows leave the WHERE\u000aclause, so each fresh batch continues where the previous one stopped.\u000a\u000aRefs #537\u000a\u000aCo-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>\u000a\u000a* fix(webhook): cap pending-retry query with SQL LIMIT per batch\u000a\u000aQuery.stream() sets no fetch size, so pgJDBC buffers the whole result set\u000abefore the first row is read; stopping after COMMIT_INTERVAL rows in Java\u000astill loaded the entire backlog. Pass the batch size into\u000astreamPendingRetries and apply it via setPageSize, so each query returns\u000aat most one batch. No OFFSET is needed since processed rows leave the\u000aWHERE clause.\u000a\u000aAlso check the runtime deadline before opening each batch query.\u000a\u000aRefs #537\u000a\u000aCo-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>\u000a\u000a---------\u000a\u000aCo-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>\u000a",
        "date" : "2026-09-30 13:49:02 +0200",
        "id" : "19880d6384f91804143872262e0670d9272121d0",
        "msg" : "fix(webhook): bound WebhookRetryProcessor memory with batches, skip paused endpoints (#538)",
        "paths" : [
          {
            "editType" : "add",
            "file" : "com.trekglobal.idempiere.rest.api.test/src/com/trekglobal/idempiere/rest/api/webhook/test/WebhookRetryPendingTest.java"
          },
          {
            "editType" : "edit",
            "file" : "com.trekglobal.idempiere.rest.api/src/com/trekglobal/idempiere/rest/api/process/WebhookRetryProcessor.java"
          },
          {
            "editType" : "edit",
            "file" : "com.trekglobal.idempiere.rest.api/src/com/trekglobal/idempiere/rest/api/model/MRestWebhookOutLog.java"
          }
        ]
      }
    ],
    "kind" : None
  },
  "culprits" : [
    {
      "absoluteUrl" : "https://jenkins.younex.de/user/noreply",
      "fullName" : "noreply"
    }
  ],
  "mavenArtifacts" : {
    "url" : "https://jenkins.younex.de/job/idempiere-rest-master/com.trekglobal.idempiere.extensions$com.trekglobal.idempiere.rest.api.test/131/mavenArtifacts/"
  }
}