You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by bt...@apache.org on 2022/09/01 15:48:48 UTC

[james-project] branch master updated: JAMES-3755 Refactor Rspamd ham/spam routes (#1171)

This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git


The following commit(s) were added to refs/heads/master by this push:
     new 3db9cccb72 JAMES-3755 Refactor Rspamd ham/spam routes (#1171)
3db9cccb72 is described below

commit 3db9cccb7291d66f084420bb0ff78eced31ea423
Author: Benoit TELLIER <bt...@linagora.com>
AuthorDate: Thu Sep 1 22:48:42 2022 +0700

    JAMES-3755 Refactor Rspamd ham/spam routes (#1171)
    
     - Avoid intermediate flattening of RunningOptions within additionInformations (we
     were doing RunningOptions (in the task) => flat (in the additionalInformation) =>
     reconstruct the RunningOptions (in the DTOs); everything is simpler by just
     keeping running options everywhere in that chain.
     - Tasks context/snapshot capture what changes during the task execution, we do
     not need to ship running options (which are immutable) within it.
     - Extract RunningOptions to a common class as it is the same between Ham / Spam
---
 .../james/rspamd/route/FeedMessageRoute.java       |  20 ++-
 .../james/rspamd/task/FeedHamToRspamdTask.java     | 137 +++------------------
 ...eedHamToRspamdTaskAdditionalInformationDTO.java |  12 +-
 .../james/rspamd/task/FeedHamToRspamdTaskDTO.java  |   2 +-
 .../james/rspamd/task/FeedSpamToRspamdTask.java    | 137 +++------------------
 ...edSpamToRspamdTaskAdditionalInformationDTO.java |  12 +-
 .../james/rspamd/task/FeedSpamToRspamdTaskDTO.java |   2 +-
 .../apache/james/rspamd/task/RunningOptions.java   |  55 +++++++++
 .../james/rspamd/route/FeedMessageRouteTest.java   |  29 ++---
 ...amToRspamdTaskAdditionalInformationDTOTest.java |  15 +--
 .../james/rspamd/task/FeedHamToRspamdTaskTest.java |  51 ++------
 ...amToRspamdTaskAdditionalInformationDTOTest.java |  16 ++-
 .../rspamd/task/FeedSpamToRspamdTaskTest.java      |  42 ++-----
 13 files changed, 153 insertions(+), 377 deletions(-)

diff --git a/third-party/rspamd/src/main/java/org/apache/james/rspamd/route/FeedMessageRoute.java b/third-party/rspamd/src/main/java/org/apache/james/rspamd/route/FeedMessageRoute.java
index a1044b83a5..ab2e59612f 100644
--- a/third-party/rspamd/src/main/java/org/apache/james/rspamd/route/FeedMessageRoute.java
+++ b/third-party/rspamd/src/main/java/org/apache/james/rspamd/route/FeedMessageRoute.java
@@ -32,6 +32,7 @@ import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
 import org.apache.james.rspamd.client.RspamdHttpClient;
 import org.apache.james.rspamd.task.FeedHamToRspamdTask;
 import org.apache.james.rspamd.task.FeedSpamToRspamdTask;
+import org.apache.james.rspamd.task.RunningOptions;
 import org.apache.james.task.Task;
 import org.apache.james.task.TaskManager;
 import org.apache.james.user.api.UsersRepository;
@@ -90,22 +91,15 @@ public class FeedMessageRoute implements Routes {
 
         return Optional.ofNullable(request.queryParams("action"))
             .filter(action -> action.equals(REPORT_SPAM_PARAM))
-            .map(any -> (Task) new FeedSpamToRspamdTask(mailboxManager, usersRepository, messageIdManager, mapperFactory, rspamdHttpClient, getFeedSpamTaskRunningOptions(request), clock))
-            .orElse(new FeedHamToRspamdTask(mailboxManager, usersRepository, messageIdManager, mapperFactory, rspamdHttpClient, getFeedHamTaskRunningOptions(request), clock));
+            .map(any -> (Task) new FeedSpamToRspamdTask(mailboxManager, usersRepository, messageIdManager, mapperFactory, rspamdHttpClient, getRunningOptions(request), clock))
+            .orElse(new FeedHamToRspamdTask(mailboxManager, usersRepository, messageIdManager, mapperFactory, rspamdHttpClient, getRunningOptions(request), clock));
     }
 
-    private FeedSpamToRspamdTask.RunningOptions getFeedSpamTaskRunningOptions(Request request) {
+    private RunningOptions getRunningOptions(Request request) {
         Optional<Long> periodInSecond = getPeriod(request);
-        int messagesPerSecond = getMessagesPerSecond(request).orElse(FeedSpamToRspamdTask.RunningOptions.DEFAULT_MESSAGES_PER_SECOND);
-        double samplingProbability = getSamplingProbability(request).orElse(FeedSpamToRspamdTask.RunningOptions.DEFAULT_SAMPLING_PROBABILITY);
-        return new FeedSpamToRspamdTask.RunningOptions(periodInSecond, messagesPerSecond, samplingProbability);
-    }
-
-    private FeedHamToRspamdTask.RunningOptions getFeedHamTaskRunningOptions(Request request) {
-        Optional<Long> periodInSecond = getPeriod(request);
-        int messagesPerSecond = getMessagesPerSecond(request).orElse(FeedHamToRspamdTask.RunningOptions.DEFAULT_MESSAGES_PER_SECOND);
-        double samplingProbability = getSamplingProbability(request).orElse(FeedHamToRspamdTask.RunningOptions.DEFAULT_SAMPLING_PROBABILITY);
-        return new FeedHamToRspamdTask.RunningOptions(periodInSecond, messagesPerSecond, samplingProbability);
+        int messagesPerSecond = getMessagesPerSecond(request).orElse(RunningOptions.DEFAULT_MESSAGES_PER_SECOND);
+        double samplingProbability = getSamplingProbability(request).orElse(RunningOptions.DEFAULT_SAMPLING_PROBABILITY);
+        return new RunningOptions(periodInSecond, messagesPerSecond, samplingProbability);
     }
 
     private Optional<Long> getPeriod(Request req) {
diff --git a/third-party/rspamd/src/main/java/org/apache/james/rspamd/task/FeedHamToRspamdTask.java b/third-party/rspamd/src/main/java/org/apache/james/rspamd/task/FeedHamToRspamdTask.java
index e7ad1bf7a5..6f489af400 100644
--- a/third-party/rspamd/src/main/java/org/apache/james/rspamd/task/FeedHamToRspamdTask.java
+++ b/third-party/rspamd/src/main/java/org/apache/james/rspamd/task/FeedHamToRspamdTask.java
@@ -39,7 +39,6 @@ import org.apache.james.user.api.UsersRepository;
 import org.apache.james.user.api.UsersRepositoryException;
 import org.apache.james.util.ReactorUtils;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
 import com.github.fge.lambdas.Throwing;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.MoreObjects;
@@ -49,68 +48,30 @@ import reactor.core.publisher.Mono;
 public class FeedHamToRspamdTask implements Task {
     public static final TaskType TASK_TYPE = TaskType.of("FeedHamToRspamdTask");
 
-    public static class RunningOptions {
-        public static final Optional<Long> DEFAULT_PERIOD = Optional.empty();
-        public static final int DEFAULT_MESSAGES_PER_SECOND = 10;
-        public static final double DEFAULT_SAMPLING_PROBABILITY = 1;
-        public static final RunningOptions DEFAULT = new RunningOptions(DEFAULT_PERIOD, DEFAULT_MESSAGES_PER_SECOND,
-            DEFAULT_SAMPLING_PROBABILITY);
-
-        private final Optional<Long> periodInSecond;
-        private final int messagesPerSecond;
-        private final double samplingProbability;
-
-        public RunningOptions(@JsonProperty("periodInSecond") Optional<Long> periodInSecond,
-                              @JsonProperty("messagesPerSecond") int messagesPerSecond,
-                              @JsonProperty("samplingProbability") double samplingProbability) {
-            this.periodInSecond = periodInSecond;
-            this.messagesPerSecond = messagesPerSecond;
-            this.samplingProbability = samplingProbability;
-        }
-
-        public Optional<Long> getPeriodInSecond() {
-            return periodInSecond;
-        }
-
-        public int getMessagesPerSecond() {
-            return messagesPerSecond;
-        }
-
-        public double getSamplingProbability() {
-            return samplingProbability;
-        }
-    }
-
     public static class AdditionalInformation implements TaskExecutionDetails.AdditionalInformation {
 
-        private static AdditionalInformation from(Context context) {
+        private static AdditionalInformation from(Context context, RunningOptions runningOptions) {
             Context.Snapshot snapshot = context.snapshot();
             return new AdditionalInformation(
                 Clock.systemUTC().instant(),
                 snapshot.getHamMessageCount(),
                 snapshot.getReportedHamMessageCount(),
                 snapshot.getErrorCount(),
-                snapshot.getMessagesPerSecond(),
-                snapshot.getPeriod(),
-                snapshot.getSamplingProbability());
+                runningOptions);
         }
 
         private final Instant timestamp;
         private final long hamMessageCount;
         private final long reportedHamMessageCount;
         private final long errorCount;
-        private final int messagesPerSecond;
-        private final Optional<Long> period;
-        private final double samplingProbability;
+        private final RunningOptions runningOptions;
 
-        public AdditionalInformation(Instant timestamp, long hamMessageCount, long reportedHamMessageCount, long errorCount, int messagesPerSecond, Optional<Long> period, double samplingProbability) {
+        public AdditionalInformation(Instant timestamp, long hamMessageCount, long reportedHamMessageCount, long errorCount, RunningOptions runningOptions) {
             this.timestamp = timestamp;
             this.hamMessageCount = hamMessageCount;
             this.reportedHamMessageCount = reportedHamMessageCount;
             this.errorCount = errorCount;
-            this.messagesPerSecond = messagesPerSecond;
-            this.period = period;
-            this.samplingProbability = samplingProbability;
+            this.runningOptions = runningOptions;
         }
 
         public long getHamMessageCount() {
@@ -125,16 +86,8 @@ public class FeedHamToRspamdTask implements Task {
             return errorCount;
         }
 
-        public int getMessagesPerSecond() {
-            return messagesPerSecond;
-        }
-
-        public Optional<Long> getPeriod() {
-            return period;
-        }
-
-        public double getSamplingProbability() {
-            return samplingProbability;
+        public RunningOptions getRunningOptions() {
+            return runningOptions;
         }
 
         @Override
@@ -155,27 +108,18 @@ public class FeedHamToRspamdTask implements Task {
                 private Optional<Long> hamMessageCount;
                 private Optional<Long> reportedHamMessageCount;
                 private Optional<Long> errorCount;
-                private Optional<Integer> messagesPerSecond;
-                private Optional<Long> period;
-                private Optional<Double> samplingProbability;
 
                 Builder() {
                     hamMessageCount = Optional.empty();
                     reportedHamMessageCount = Optional.empty();
                     errorCount = Optional.empty();
-                    messagesPerSecond = Optional.empty();
-                    period = Optional.empty();
-                    samplingProbability = Optional.empty();
                 }
 
                 public Snapshot build() {
                     return new Snapshot(
                         hamMessageCount.orElse(0L),
                         reportedHamMessageCount.orElse(0L),
-                        errorCount.orElse(0L),
-                        messagesPerSecond.orElse(0),
-                        period,
-                        samplingProbability.orElse(1D));
+                        errorCount.orElse(0L));
                 }
 
                 public Builder hamMessageCount(long hamMessageCount) {
@@ -192,38 +136,16 @@ public class FeedHamToRspamdTask implements Task {
                     this.errorCount = Optional.of(errorCount);
                     return this;
                 }
-
-                public Builder messagesPerSecond(int messagesPerSecond) {
-                    this.messagesPerSecond = Optional.of(messagesPerSecond);
-                    return this;
-                }
-
-                public Builder period(Optional<Long> period) {
-                    this.period = period;
-                    return this;
-                }
-
-                public Builder samplingProbability(double samplingProbability) {
-                    this.samplingProbability = Optional.of(samplingProbability);
-                    return this;
-                }
             }
 
             private final long hamMessageCount;
             private final long reportedHamMessageCount;
             private final long errorCount;
-            private final int messagesPerSecond;
-            private final Optional<Long> period;
-            private final double samplingProbability;
 
-            public Snapshot(long hamMessageCount, long reportedHamMessageCount, long errorCount, int messagesPerSecond, Optional<Long> period,
-                            double samplingProbability) {
+            public Snapshot(long hamMessageCount, long reportedHamMessageCount, long errorCount) {
                 this.hamMessageCount = hamMessageCount;
                 this.reportedHamMessageCount = reportedHamMessageCount;
                 this.errorCount = errorCount;
-                this.messagesPerSecond = messagesPerSecond;
-                this.period = period;
-                this.samplingProbability = samplingProbability;
             }
 
             public long getHamMessageCount() {
@@ -238,18 +160,6 @@ public class FeedHamToRspamdTask implements Task {
                 return errorCount;
             }
 
-            public int getMessagesPerSecond() {
-                return messagesPerSecond;
-            }
-
-            public Optional<Long> getPeriod() {
-                return period;
-            }
-
-            public double getSamplingProbability() {
-                return samplingProbability;
-            }
-
             @Override
             public final boolean equals(Object o) {
                 if (o instanceof Snapshot) {
@@ -257,17 +167,14 @@ public class FeedHamToRspamdTask implements Task {
 
                     return Objects.equals(this.hamMessageCount, snapshot.hamMessageCount)
                         && Objects.equals(this.reportedHamMessageCount, snapshot.reportedHamMessageCount)
-                        && Objects.equals(this.errorCount, snapshot.errorCount)
-                        && Objects.equals(this.messagesPerSecond, snapshot.messagesPerSecond)
-                        && Objects.equals(this.samplingProbability, snapshot.samplingProbability)
-                        && Objects.equals(this.period, snapshot.period);
+                        && Objects.equals(this.errorCount, snapshot.errorCount);
                 }
                 return false;
             }
 
             @Override
             public final int hashCode() {
-                return Objects.hash(hamMessageCount, reportedHamMessageCount, errorCount, messagesPerSecond, period, samplingProbability);
+                return Objects.hash(hamMessageCount, reportedHamMessageCount, errorCount);
             }
 
             @Override
@@ -276,9 +183,6 @@ public class FeedHamToRspamdTask implements Task {
                     .add("hamMessageCount", hamMessageCount)
                     .add("reportedHamMessageCount", reportedHamMessageCount)
                     .add("errorCount", errorCount)
-                    .add("messagesPerSecond", messagesPerSecond)
-                    .add("period", period)
-                    .add("samplingProbability", samplingProbability)
                     .toString();
             }
         }
@@ -286,17 +190,11 @@ public class FeedHamToRspamdTask implements Task {
         private final AtomicLong hamMessageCount;
         private final AtomicLong reportedHamMessageCount;
         private final AtomicLong errorCount;
-        private final Integer messagesPerSecond;
-        private final Optional<Long> period;
-        private final Double samplingProbability;
 
-        public Context(RunningOptions runningOptions) {
+        public Context() {
             this.hamMessageCount = new AtomicLong();
             this.reportedHamMessageCount = new AtomicLong();
             this.errorCount = new AtomicLong();
-            this.messagesPerSecond = runningOptions.messagesPerSecond;
-            this.period = runningOptions.periodInSecond;
-            this.samplingProbability = runningOptions.samplingProbability;
         }
 
         public void incrementHamMessageCount() {
@@ -316,9 +214,6 @@ public class FeedHamToRspamdTask implements Task {
                 .hamMessageCount(hamMessageCount.get())
                 .reportedHamMessageCount(reportedHamMessageCount.get())
                 .errorCount(errorCount.get())
-                .messagesPerSecond(messagesPerSecond)
-                .period(period)
-                .samplingProbability(samplingProbability)
                 .build();
         }
     }
@@ -334,17 +229,17 @@ public class FeedHamToRspamdTask implements Task {
         this.runningOptions = runningOptions;
         this.messagesService = new GetMailboxMessagesService(mailboxManager, usersRepository, mapperFactory, messageIdManager);
         this.rspamdHttpClient = rspamdHttpClient;
-        this.context = new Context(runningOptions);
+        this.context = new Context();
         this.clock = clock;
     }
 
     @Override
     public Result run() {
-        Optional<Date> afterDate = runningOptions.periodInSecond.map(periodInSecond -> Date.from(clock.instant().minusSeconds(periodInSecond)));
+        Optional<Date> afterDate = runningOptions.getPeriodInSecond().map(periodInSecond -> Date.from(clock.instant().minusSeconds(periodInSecond)));
         try {
             return messagesService.getHamMessagesOfAllUser(afterDate, runningOptions.getSamplingProbability(), context)
                 .transform(ReactorUtils.<MessageResult, Result>throttle()
-                    .elements(runningOptions.messagesPerSecond)
+                    .elements(runningOptions.getMessagesPerSecond())
                     .per(Duration.ofSeconds(1))
                     .forOperation(messageResult -> Mono.fromSupplier(Throwing.supplier(() -> rspamdHttpClient.reportAsHam(messageResult.getFullContent().getInputStream())))
                         .then(Mono.fromCallable(() -> {
@@ -372,7 +267,7 @@ public class FeedHamToRspamdTask implements Task {
 
     @Override
     public Optional<TaskExecutionDetails.AdditionalInformation> details() {
-        return Optional.of(AdditionalInformation.from(context));
+        return Optional.of(AdditionalInformation.from(context, runningOptions));
     }
 
     @VisibleForTesting
diff --git a/third-party/rspamd/src/main/java/org/apache/james/rspamd/task/FeedHamToRspamdTaskAdditionalInformationDTO.java b/third-party/rspamd/src/main/java/org/apache/james/rspamd/task/FeedHamToRspamdTaskAdditionalInformationDTO.java
index f411b8ba0d..50548335d2 100644
--- a/third-party/rspamd/src/main/java/org/apache/james/rspamd/task/FeedHamToRspamdTaskAdditionalInformationDTO.java
+++ b/third-party/rspamd/src/main/java/org/apache/james/rspamd/task/FeedHamToRspamdTaskAdditionalInformationDTO.java
@@ -42,9 +42,7 @@ public class FeedHamToRspamdTaskAdditionalInformationDTO implements AdditionalIn
             dto.hamMessageCount,
             dto.reportedHamMessageCount,
             dto.errorCount,
-            dto.runningOptions.getMessagesPerSecond(),
-            dto.runningOptions.getPeriodInSecond(),
-            dto.runningOptions.getSamplingProbability());
+            dto.runningOptions);
     }
 
     private static FeedHamToRspamdTaskAdditionalInformationDTO toDto(FeedHamToRspamdTask.AdditionalInformation domainObject, String type) {
@@ -54,7 +52,7 @@ public class FeedHamToRspamdTaskAdditionalInformationDTO implements AdditionalIn
             domainObject.getHamMessageCount(),
             domainObject.getReportedHamMessageCount(),
             domainObject.getErrorCount(),
-            new FeedHamToRspamdTask.RunningOptions(domainObject.getPeriod(), domainObject.getMessagesPerSecond(), domainObject.getSamplingProbability()));
+            domainObject.getRunningOptions());
     }
 
     private final String type;
@@ -62,14 +60,14 @@ public class FeedHamToRspamdTaskAdditionalInformationDTO implements AdditionalIn
     private final long hamMessageCount;
     private final long reportedHamMessageCount;
     private final long errorCount;
-    private final FeedHamToRspamdTask.RunningOptions runningOptions;
+    private final RunningOptions runningOptions;
 
     public FeedHamToRspamdTaskAdditionalInformationDTO(@JsonProperty("type") String type,
                                                        @JsonProperty("timestamp") Instant timestamp,
                                                        @JsonProperty("hamMessageCount") long hamMessageCount,
                                                        @JsonProperty("reportedHamMessageCount") long reportedHamMessageCount,
                                                        @JsonProperty("errorCount") long errorCount,
-                                                       @JsonProperty("runningOptions") FeedHamToRspamdTask.RunningOptions runningOptions) {
+                                                       @JsonProperty("runningOptions") RunningOptions runningOptions) {
         this.type = type;
         this.timestamp = timestamp;
         this.hamMessageCount = hamMessageCount;
@@ -100,7 +98,7 @@ public class FeedHamToRspamdTaskAdditionalInformationDTO implements AdditionalIn
         return errorCount;
     }
 
-    public FeedHamToRspamdTask.RunningOptions getRunningOptions() {
+    public RunningOptions getRunningOptions() {
         return runningOptions;
     }
 }
diff --git a/third-party/rspamd/src/main/java/org/apache/james/rspamd/task/FeedHamToRspamdTaskDTO.java b/third-party/rspamd/src/main/java/org/apache/james/rspamd/task/FeedHamToRspamdTaskDTO.java
index cd62b2262e..c42baa896e 100644
--- a/third-party/rspamd/src/main/java/org/apache/james/rspamd/task/FeedHamToRspamdTaskDTO.java
+++ b/third-party/rspamd/src/main/java/org/apache/james/rspamd/task/FeedHamToRspamdTaskDTO.java
@@ -47,7 +47,7 @@ public class FeedHamToRspamdTaskDTO implements TaskDTO {
                 messageIdManager,
                 mapperFactory,
                 rspamdHttpClient,
-                new FeedHamToRspamdTask.RunningOptions(Optional.ofNullable(dto.getPeriodInSecond()),
+                new RunningOptions(Optional.ofNullable(dto.getPeriodInSecond()),
                     dto.getMessagesPerSecond(),
                     dto.getSamplingProbability()),
                 clock))
diff --git a/third-party/rspamd/src/main/java/org/apache/james/rspamd/task/FeedSpamToRspamdTask.java b/third-party/rspamd/src/main/java/org/apache/james/rspamd/task/FeedSpamToRspamdTask.java
index c8870a89de..9a33b7440c 100644
--- a/third-party/rspamd/src/main/java/org/apache/james/rspamd/task/FeedSpamToRspamdTask.java
+++ b/third-party/rspamd/src/main/java/org/apache/james/rspamd/task/FeedSpamToRspamdTask.java
@@ -39,7 +39,6 @@ import org.apache.james.user.api.UsersRepository;
 import org.apache.james.user.api.UsersRepositoryException;
 import org.apache.james.util.ReactorUtils;
 
-import com.fasterxml.jackson.annotation.JsonProperty;
 import com.github.fge.lambdas.Throwing;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.MoreObjects;
@@ -50,68 +49,30 @@ public class FeedSpamToRspamdTask implements Task {
     public static final String SPAM_MAILBOX_NAME = "Spam";
     public static final TaskType TASK_TYPE = TaskType.of("FeedSpamToRspamdTask");
 
-    public static class RunningOptions {
-        public static final Optional<Long> DEFAULT_PERIOD = Optional.empty();
-        public static final int DEFAULT_MESSAGES_PER_SECOND = 10;
-        public static final double DEFAULT_SAMPLING_PROBABILITY = 1;
-        public static final RunningOptions DEFAULT = new RunningOptions(DEFAULT_PERIOD, DEFAULT_MESSAGES_PER_SECOND,
-            DEFAULT_SAMPLING_PROBABILITY);
-
-        private final Optional<Long> periodInSecond;
-        private final int messagesPerSecond;
-        private final double samplingProbability;
-
-        public RunningOptions(@JsonProperty("periodInSecond") Optional<Long> periodInSecond,
-                              @JsonProperty("messagesPerSecond") int messagesPerSecond,
-                              @JsonProperty("samplingProbability") double samplingProbability) {
-            this.periodInSecond = periodInSecond;
-            this.messagesPerSecond = messagesPerSecond;
-            this.samplingProbability = samplingProbability;
-        }
-
-        public Optional<Long> getPeriodInSecond() {
-            return periodInSecond;
-        }
-
-        public int getMessagesPerSecond() {
-            return messagesPerSecond;
-        }
-
-        public double getSamplingProbability() {
-            return samplingProbability;
-        }
-    }
-
     public static class AdditionalInformation implements TaskExecutionDetails.AdditionalInformation {
 
-        private static AdditionalInformation from(Context context) {
+        private static AdditionalInformation from(Context context, RunningOptions runningOptions) {
             Context.Snapshot snapshot = context.snapshot();
             return new AdditionalInformation(
                 Clock.systemUTC().instant(),
                 snapshot.getSpamMessageCount(),
                 snapshot.getReportedSpamMessageCount(),
                 snapshot.getErrorCount(),
-                snapshot.getMessagesPerSecond(),
-                snapshot.getPeriod(),
-                snapshot.getSamplingProbability());
+                runningOptions);
         }
 
         private final Instant timestamp;
         private final long spamMessageCount;
         private final long reportedSpamMessageCount;
         private final long errorCount;
-        private final int messagesPerSecond;
-        private final Optional<Long> period;
-        private final double samplingProbability;
+        private final RunningOptions runningOptions;
 
-        public AdditionalInformation(Instant timestamp, long spamMessageCount, long reportedSpamMessageCount, long errorCount, int messagesPerSecond, Optional<Long> period, double samplingProbability) {
+        public AdditionalInformation(Instant timestamp, long spamMessageCount, long reportedSpamMessageCount, long errorCount, RunningOptions runningOptions) {
             this.timestamp = timestamp;
             this.spamMessageCount = spamMessageCount;
             this.reportedSpamMessageCount = reportedSpamMessageCount;
             this.errorCount = errorCount;
-            this.messagesPerSecond = messagesPerSecond;
-            this.period = period;
-            this.samplingProbability = samplingProbability;
+            this.runningOptions = runningOptions;
         }
 
         public long getSpamMessageCount() {
@@ -126,16 +87,8 @@ public class FeedSpamToRspamdTask implements Task {
             return errorCount;
         }
 
-        public int getMessagesPerSecond() {
-            return messagesPerSecond;
-        }
-
-        public Optional<Long> getPeriod() {
-            return period;
-        }
-
-        public double getSamplingProbability() {
-            return samplingProbability;
+        public RunningOptions getRunningOptions() {
+            return runningOptions;
         }
 
         @Override
@@ -156,27 +109,18 @@ public class FeedSpamToRspamdTask implements Task {
                 private Optional<Long> spamMessageCount;
                 private Optional<Long> reportedSpamMessageCount;
                 private Optional<Long> errorCount;
-                private Optional<Integer> messagesPerSecond;
-                private Optional<Long> period;
-                private Optional<Double> samplingProbability;
 
                 Builder() {
                     spamMessageCount = Optional.empty();
                     reportedSpamMessageCount = Optional.empty();
                     errorCount = Optional.empty();
-                    messagesPerSecond = Optional.empty();
-                    period = Optional.empty();
-                    samplingProbability = Optional.empty();
                 }
 
                 public Snapshot build() {
                     return new Snapshot(
                         spamMessageCount.orElse(0L),
                         reportedSpamMessageCount.orElse(0L),
-                        errorCount.orElse(0L),
-                        messagesPerSecond.orElse(0),
-                        period,
-                        samplingProbability.orElse(1D));
+                        errorCount.orElse(0L));
                 }
 
                 public Builder spamMessageCount(long spamMessageCount) {
@@ -193,38 +137,16 @@ public class FeedSpamToRspamdTask implements Task {
                     this.errorCount = Optional.of(errorCount);
                     return this;
                 }
-
-                public Builder messagesPerSecond(int messagesPerSecond) {
-                    this.messagesPerSecond = Optional.of(messagesPerSecond);
-                    return this;
-                }
-
-                public Builder period(Optional<Long> period) {
-                    this.period = period;
-                    return this;
-                }
-
-                public Builder samplingProbability(double samplingProbability) {
-                    this.samplingProbability = Optional.of(samplingProbability);
-                    return this;
-                }
             }
 
             private final long spamMessageCount;
             private final long reportedSpamMessageCount;
             private final long errorCount;
-            private final int messagesPerSecond;
-            private final Optional<Long> period;
-            private final double samplingProbability;
 
-            public Snapshot(long spamMessageCount, long reportedSpamMessageCount, long errorCount, int messagesPerSecond, Optional<Long> period,
-                            double samplingProbability) {
+            public Snapshot(long spamMessageCount, long reportedSpamMessageCount, long errorCount) {
                 this.spamMessageCount = spamMessageCount;
                 this.reportedSpamMessageCount = reportedSpamMessageCount;
                 this.errorCount = errorCount;
-                this.messagesPerSecond = messagesPerSecond;
-                this.period = period;
-                this.samplingProbability = samplingProbability;
             }
 
             public long getSpamMessageCount() {
@@ -239,18 +161,6 @@ public class FeedSpamToRspamdTask implements Task {
                 return errorCount;
             }
 
-            public int getMessagesPerSecond() {
-                return messagesPerSecond;
-            }
-
-            public Optional<Long> getPeriod() {
-                return period;
-            }
-
-            public double getSamplingProbability() {
-                return samplingProbability;
-            }
-
             @Override
             public final boolean equals(Object o) {
                 if (o instanceof Snapshot) {
@@ -258,17 +168,14 @@ public class FeedSpamToRspamdTask implements Task {
 
                     return Objects.equals(this.spamMessageCount, snapshot.spamMessageCount)
                         && Objects.equals(this.reportedSpamMessageCount, snapshot.reportedSpamMessageCount)
-                        && Objects.equals(this.errorCount, snapshot.errorCount)
-                        && Objects.equals(this.messagesPerSecond, snapshot.messagesPerSecond)
-                        && Objects.equals(this.samplingProbability, snapshot.samplingProbability)
-                        && Objects.equals(this.period, snapshot.period);
+                        && Objects.equals(this.errorCount, snapshot.errorCount);
                 }
                 return false;
             }
 
             @Override
             public final int hashCode() {
-                return Objects.hash(spamMessageCount, reportedSpamMessageCount, errorCount, messagesPerSecond, period, samplingProbability);
+                return Objects.hash(spamMessageCount, reportedSpamMessageCount, errorCount);
             }
 
             @Override
@@ -277,9 +184,6 @@ public class FeedSpamToRspamdTask implements Task {
                     .add("spamMessageCount", spamMessageCount)
                     .add("reportedSpamMessageCount", reportedSpamMessageCount)
                     .add("errorCount", errorCount)
-                    .add("messagesPerSecond", messagesPerSecond)
-                    .add("period", period)
-                    .add("samplingProbability", samplingProbability)
                     .toString();
             }
         }
@@ -287,17 +191,11 @@ public class FeedSpamToRspamdTask implements Task {
         private final AtomicLong spamMessageCount;
         private final AtomicLong reportedSpamMessageCount;
         private final AtomicLong errorCount;
-        private final Integer messagesPerSecond;
-        private final Optional<Long> period;
-        private final Double samplingProbability;
 
-        public Context(RunningOptions runningOptions) {
+        public Context() {
             this.spamMessageCount = new AtomicLong();
             this.reportedSpamMessageCount = new AtomicLong();
             this.errorCount = new AtomicLong();
-            this.messagesPerSecond = runningOptions.messagesPerSecond;
-            this.period = runningOptions.periodInSecond;
-            this.samplingProbability = runningOptions.samplingProbability;
         }
 
         public void incrementSpamMessageCount() {
@@ -317,9 +215,6 @@ public class FeedSpamToRspamdTask implements Task {
                 .spamMessageCount(spamMessageCount.get())
                 .reportedSpamMessageCount(reportedSpamMessageCount.get())
                 .errorCount(errorCount.get())
-                .messagesPerSecond(messagesPerSecond)
-                .period(period)
-                .samplingProbability(samplingProbability)
                 .build();
         }
     }
@@ -335,17 +230,17 @@ public class FeedSpamToRspamdTask implements Task {
         this.runningOptions = runningOptions;
         this.messagesService = new GetMailboxMessagesService(mailboxManager, usersRepository, mapperFactory, messageIdManager);
         this.rspamdHttpClient = rspamdHttpClient;
-        this.context = new Context(runningOptions);
+        this.context = new Context();
         this.clock = clock;
     }
 
     @Override
     public Result run() {
-        Optional<Date> afterDate = runningOptions.periodInSecond.map(periodInSecond -> Date.from(clock.instant().minusSeconds(periodInSecond)));
+        Optional<Date> afterDate = runningOptions.getPeriodInSecond().map(periodInSecond -> Date.from(clock.instant().minusSeconds(periodInSecond)));
         try {
             return messagesService.getMailboxMessagesOfAllUser(SPAM_MAILBOX_NAME, afterDate, runningOptions.getSamplingProbability(), context)
                 .transform(ReactorUtils.<MessageResult, Task.Result>throttle()
-                    .elements(runningOptions.messagesPerSecond)
+                    .elements(runningOptions.getMessagesPerSecond())
                     .per(Duration.ofSeconds(1))
                     .forOperation(messageResult -> Mono.fromSupplier(Throwing.supplier(() -> rspamdHttpClient.reportAsSpam(messageResult.getFullContent().getInputStream())))
                         .then(Mono.fromCallable(() -> {
@@ -373,7 +268,7 @@ public class FeedSpamToRspamdTask implements Task {
 
     @Override
     public Optional<TaskExecutionDetails.AdditionalInformation> details() {
-        return Optional.of(AdditionalInformation.from(context));
+        return Optional.of(AdditionalInformation.from(context, runningOptions));
     }
 
     @VisibleForTesting
diff --git a/third-party/rspamd/src/main/java/org/apache/james/rspamd/task/FeedSpamToRspamdTaskAdditionalInformationDTO.java b/third-party/rspamd/src/main/java/org/apache/james/rspamd/task/FeedSpamToRspamdTaskAdditionalInformationDTO.java
index f4270ab400..6e58c127d6 100644
--- a/third-party/rspamd/src/main/java/org/apache/james/rspamd/task/FeedSpamToRspamdTaskAdditionalInformationDTO.java
+++ b/third-party/rspamd/src/main/java/org/apache/james/rspamd/task/FeedSpamToRspamdTaskAdditionalInformationDTO.java
@@ -42,9 +42,7 @@ public class FeedSpamToRspamdTaskAdditionalInformationDTO implements AdditionalI
             dto.spamMessageCount,
             dto.reportedSpamMessageCount,
             dto.errorCount,
-            dto.runningOptions.getMessagesPerSecond(),
-            dto.runningOptions.getPeriodInSecond(),
-            dto.runningOptions.getSamplingProbability());
+            dto.runningOptions);
     }
 
     private static FeedSpamToRspamdTaskAdditionalInformationDTO toDto(FeedSpamToRspamdTask.AdditionalInformation domainObject, String type) {
@@ -54,7 +52,7 @@ public class FeedSpamToRspamdTaskAdditionalInformationDTO implements AdditionalI
             domainObject.getSpamMessageCount(),
             domainObject.getReportedSpamMessageCount(),
             domainObject.getErrorCount(),
-            new FeedSpamToRspamdTask.RunningOptions(domainObject.getPeriod(), domainObject.getMessagesPerSecond(), domainObject.getSamplingProbability()));
+            domainObject.getRunningOptions());
     }
 
     private final String type;
@@ -62,14 +60,14 @@ public class FeedSpamToRspamdTaskAdditionalInformationDTO implements AdditionalI
     private final long spamMessageCount;
     private final long reportedSpamMessageCount;
     private final long errorCount;
-    private final FeedSpamToRspamdTask.RunningOptions runningOptions;
+    private final RunningOptions runningOptions;
 
     public FeedSpamToRspamdTaskAdditionalInformationDTO(@JsonProperty("type") String type,
                                                         @JsonProperty("timestamp") Instant timestamp,
                                                         @JsonProperty("spamMessageCount") long spamMessageCount,
                                                         @JsonProperty("reportedSpamMessageCount") long reportedSpamMessageCount,
                                                         @JsonProperty("errorCount") long errorCount,
-                                                        @JsonProperty("runningOptions") FeedSpamToRspamdTask.RunningOptions runningOptions) {
+                                                        @JsonProperty("runningOptions") RunningOptions runningOptions) {
         this.type = type;
         this.timestamp = timestamp;
         this.spamMessageCount = spamMessageCount;
@@ -100,7 +98,7 @@ public class FeedSpamToRspamdTaskAdditionalInformationDTO implements AdditionalI
         return errorCount;
     }
 
-    public FeedSpamToRspamdTask.RunningOptions getRunningOptions() {
+    public RunningOptions getRunningOptions() {
         return runningOptions;
     }
 }
diff --git a/third-party/rspamd/src/main/java/org/apache/james/rspamd/task/FeedSpamToRspamdTaskDTO.java b/third-party/rspamd/src/main/java/org/apache/james/rspamd/task/FeedSpamToRspamdTaskDTO.java
index fb68b06a18..29ce342a07 100644
--- a/third-party/rspamd/src/main/java/org/apache/james/rspamd/task/FeedSpamToRspamdTaskDTO.java
+++ b/third-party/rspamd/src/main/java/org/apache/james/rspamd/task/FeedSpamToRspamdTaskDTO.java
@@ -47,7 +47,7 @@ public class FeedSpamToRspamdTaskDTO implements TaskDTO {
                 messageIdManager,
                 mapperFactory,
                 rspamdHttpClient,
-                new FeedSpamToRspamdTask.RunningOptions(Optional.ofNullable(dto.getPeriodInSecond()),
+                new RunningOptions(Optional.ofNullable(dto.getPeriodInSecond()),
                     dto.getMessagesPerSecond(),
                     dto.getSamplingProbability()),
                 clock))
diff --git a/third-party/rspamd/src/main/java/org/apache/james/rspamd/task/RunningOptions.java b/third-party/rspamd/src/main/java/org/apache/james/rspamd/task/RunningOptions.java
new file mode 100644
index 0000000000..bc354c9511
--- /dev/null
+++ b/third-party/rspamd/src/main/java/org/apache/james/rspamd/task/RunningOptions.java
@@ -0,0 +1,55 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one   *
+ * or more contributor license agreements.  See the NOTICE file *
+ * distributed with this work for additional information        *
+ * regarding copyright ownership.  The ASF licenses this file   *
+ * to you under the Apache License, Version 2.0 (the            *
+ * "License"); you may not use this file except in compliance   *
+ * with the License.  You may obtain a copy of the License at   *
+ *                                                              *
+ *   http://www.apache.org/licenses/LICENSE-2.0                 *
+ *                                                              *
+ * Unless required by applicable law or agreed to in writing,   *
+ * software distributed under the License is distributed on an  *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
+ * KIND, either express or implied.  See the License for the    *
+ * specific language governing permissions and limitations      *
+ * under the License.                                           *
+ ****************************************************************/
+
+package org.apache.james.rspamd.task;
+
+import java.util.Optional;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public class RunningOptions {
+    public static final Optional<Long> DEFAULT_PERIOD = Optional.empty();
+    public static final int DEFAULT_MESSAGES_PER_SECOND = 10;
+    public static final double DEFAULT_SAMPLING_PROBABILITY = 1;
+    public static final RunningOptions DEFAULT = new RunningOptions(DEFAULT_PERIOD, DEFAULT_MESSAGES_PER_SECOND, DEFAULT_SAMPLING_PROBABILITY);
+
+    private final Optional<Long> periodInSecond;
+    private final int messagesPerSecond;
+    private final double samplingProbability;
+
+    public RunningOptions(@JsonProperty("periodInSecond") Optional<Long> periodInSecond,
+                          @JsonProperty("messagesPerSecond") int messagesPerSecond,
+                          @JsonProperty("samplingProbability") double samplingProbability) {
+        this.periodInSecond = periodInSecond;
+        this.messagesPerSecond = messagesPerSecond;
+        this.samplingProbability = samplingProbability;
+    }
+
+    public Optional<Long> getPeriodInSecond() {
+        return periodInSecond;
+    }
+
+    public int getMessagesPerSecond() {
+        return messagesPerSecond;
+    }
+
+    public double getSamplingProbability() {
+        return samplingProbability;
+    }
+}
diff --git a/third-party/rspamd/src/test/java/org/apache/james/rspamd/route/FeedMessageRouteTest.java b/third-party/rspamd/src/test/java/org/apache/james/rspamd/route/FeedMessageRouteTest.java
index 0a96080e76..cc45f95d75 100644
--- a/third-party/rspamd/src/test/java/org/apache/james/rspamd/route/FeedMessageRouteTest.java
+++ b/third-party/rspamd/src/test/java/org/apache/james/rspamd/route/FeedMessageRouteTest.java
@@ -69,6 +69,7 @@ import org.apache.james.rspamd.task.FeedHamToRspamdTask;
 import org.apache.james.rspamd.task.FeedHamToRspamdTaskAdditionalInformationDTO;
 import org.apache.james.rspamd.task.FeedSpamToRspamdTask;
 import org.apache.james.rspamd.task.FeedSpamToRspamdTaskAdditionalInformationDTO;
+import org.apache.james.rspamd.task.RunningOptions;
 import org.apache.james.task.Hostname;
 import org.apache.james.task.MemoryTaskManager;
 import org.apache.james.user.api.UsersRepository;
@@ -175,9 +176,9 @@ public class FeedMessageRouteTest {
                 .body("additionalInformation.spamMessageCount", is(2))
                 .body("additionalInformation.reportedSpamMessageCount", is(2))
                 .body("additionalInformation.errorCount", is(0))
-                .body("additionalInformation.runningOptions.messagesPerSecond", is(FeedSpamToRspamdTask.RunningOptions.DEFAULT_MESSAGES_PER_SECOND))
+                .body("additionalInformation.runningOptions.messagesPerSecond", is(RunningOptions.DEFAULT_MESSAGES_PER_SECOND))
                 .body("additionalInformation.runningOptions.periodInSecond", is(nullValue()))
-                .body("additionalInformation.runningOptions.samplingProbability", is((float) FeedSpamToRspamdTask.RunningOptions.DEFAULT_SAMPLING_PROBABILITY));
+                .body("additionalInformation.runningOptions.samplingProbability", is((float) RunningOptions.DEFAULT_SAMPLING_PROBABILITY));
         }
 
         @Test
@@ -202,9 +203,9 @@ public class FeedMessageRouteTest {
                 .body("additionalInformation.spamMessageCount", is(2))
                 .body("additionalInformation.reportedSpamMessageCount", is(1))
                 .body("additionalInformation.errorCount", is(0))
-                .body("additionalInformation.runningOptions.messagesPerSecond", is(FeedSpamToRspamdTask.RunningOptions.DEFAULT_MESSAGES_PER_SECOND))
+                .body("additionalInformation.runningOptions.messagesPerSecond", is(RunningOptions.DEFAULT_MESSAGES_PER_SECOND))
                 .body("additionalInformation.runningOptions.periodInSecond", is(172800))
-                .body("additionalInformation.runningOptions.samplingProbability", is((float) FeedSpamToRspamdTask.RunningOptions.DEFAULT_SAMPLING_PROBABILITY));
+                .body("additionalInformation.runningOptions.samplingProbability", is((float) RunningOptions.DEFAULT_SAMPLING_PROBABILITY));
         }
 
         @Test
@@ -229,7 +230,7 @@ public class FeedMessageRouteTest {
                 .body("additionalInformation.spamMessageCount", is(10))
                 .body("additionalInformation.reportedSpamMessageCount", is(allOf(greaterThan(0), lessThan(10))))
                 .body("additionalInformation.errorCount", is(0))
-                .body("additionalInformation.runningOptions.messagesPerSecond", is(FeedSpamToRspamdTask.RunningOptions.DEFAULT_MESSAGES_PER_SECOND))
+                .body("additionalInformation.runningOptions.messagesPerSecond", is(RunningOptions.DEFAULT_MESSAGES_PER_SECOND))
                 .body("additionalInformation.runningOptions.periodInSecond", is(nullValue()))
                 .body("additionalInformation.runningOptions.samplingProbability", is(0.5F));
         }
@@ -295,9 +296,9 @@ public class FeedMessageRouteTest {
                 .body("additionalInformation.spamMessageCount", is(0))
                 .body("additionalInformation.reportedSpamMessageCount", is(0))
                 .body("additionalInformation.errorCount", is(0))
-                .body("additionalInformation.runningOptions.messagesPerSecond", is(FeedSpamToRspamdTask.RunningOptions.DEFAULT_MESSAGES_PER_SECOND))
+                .body("additionalInformation.runningOptions.messagesPerSecond", is(RunningOptions.DEFAULT_MESSAGES_PER_SECOND))
                 .body("additionalInformation.runningOptions.periodInSecond", is(nullValue()))
-                .body("additionalInformation.runningOptions.samplingProbability", is((float) FeedSpamToRspamdTask.RunningOptions.DEFAULT_SAMPLING_PROBABILITY));
+                .body("additionalInformation.runningOptions.samplingProbability", is((float) RunningOptions.DEFAULT_SAMPLING_PROBABILITY));
         }
 
         @ParameterizedTest
@@ -423,9 +424,9 @@ public class FeedMessageRouteTest {
                 .body("additionalInformation.hamMessageCount", is(2))
                 .body("additionalInformation.reportedHamMessageCount", is(2))
                 .body("additionalInformation.errorCount", is(0))
-                .body("additionalInformation.runningOptions.messagesPerSecond", is(FeedHamToRspamdTask.RunningOptions.DEFAULT_MESSAGES_PER_SECOND))
+                .body("additionalInformation.runningOptions.messagesPerSecond", is(RunningOptions.DEFAULT_MESSAGES_PER_SECOND))
                 .body("additionalInformation.runningOptions.periodInSecond", is(nullValue()))
-                .body("additionalInformation.runningOptions.samplingProbability", is((float) FeedHamToRspamdTask.RunningOptions.DEFAULT_SAMPLING_PROBABILITY));
+                .body("additionalInformation.runningOptions.samplingProbability", is((float) RunningOptions.DEFAULT_SAMPLING_PROBABILITY));
         }
 
         @Test
@@ -450,9 +451,9 @@ public class FeedMessageRouteTest {
                 .body("additionalInformation.hamMessageCount", is(2))
                 .body("additionalInformation.reportedHamMessageCount", is(1))
                 .body("additionalInformation.errorCount", is(0))
-                .body("additionalInformation.runningOptions.messagesPerSecond", is(FeedHamToRspamdTask.RunningOptions.DEFAULT_MESSAGES_PER_SECOND))
+                .body("additionalInformation.runningOptions.messagesPerSecond", is(RunningOptions.DEFAULT_MESSAGES_PER_SECOND))
                 .body("additionalInformation.runningOptions.periodInSecond", is(172800))
-                .body("additionalInformation.runningOptions.samplingProbability", is((float) FeedHamToRspamdTask.RunningOptions.DEFAULT_SAMPLING_PROBABILITY));
+                .body("additionalInformation.runningOptions.samplingProbability", is((float) RunningOptions.DEFAULT_SAMPLING_PROBABILITY));
         }
 
         @Test
@@ -477,7 +478,7 @@ public class FeedMessageRouteTest {
                 .body("additionalInformation.hamMessageCount", is(10))
                 .body("additionalInformation.reportedHamMessageCount", is(allOf(greaterThan(0), lessThan(10))))
                 .body("additionalInformation.errorCount", is(0))
-                .body("additionalInformation.runningOptions.messagesPerSecond", is(FeedHamToRspamdTask.RunningOptions.DEFAULT_MESSAGES_PER_SECOND))
+                .body("additionalInformation.runningOptions.messagesPerSecond", is(RunningOptions.DEFAULT_MESSAGES_PER_SECOND))
                 .body("additionalInformation.runningOptions.periodInSecond", is(nullValue()))
                 .body("additionalInformation.runningOptions.samplingProbability", is(0.5F));
         }
@@ -543,9 +544,9 @@ public class FeedMessageRouteTest {
                 .body("additionalInformation.hamMessageCount", is(0))
                 .body("additionalInformation.reportedHamMessageCount", is(0))
                 .body("additionalInformation.errorCount", is(0))
-                .body("additionalInformation.runningOptions.messagesPerSecond", is(FeedHamToRspamdTask.RunningOptions.DEFAULT_MESSAGES_PER_SECOND))
+                .body("additionalInformation.runningOptions.messagesPerSecond", is(RunningOptions.DEFAULT_MESSAGES_PER_SECOND))
                 .body("additionalInformation.runningOptions.periodInSecond", is(nullValue()))
-                .body("additionalInformation.runningOptions.samplingProbability", is((float) FeedHamToRspamdTask.RunningOptions.DEFAULT_SAMPLING_PROBABILITY));
+                .body("additionalInformation.runningOptions.samplingProbability", is((float) RunningOptions.DEFAULT_SAMPLING_PROBABILITY));
         }
 
         @ParameterizedTest
diff --git a/third-party/rspamd/src/test/java/org/apache/james/rspamd/task/FeedHamToRspamdTaskAdditionalInformationDTOTest.java b/third-party/rspamd/src/test/java/org/apache/james/rspamd/task/FeedHamToRspamdTaskAdditionalInformationDTOTest.java
index b7bbbacb04..2705eca987 100644
--- a/third-party/rspamd/src/test/java/org/apache/james/rspamd/task/FeedHamToRspamdTaskAdditionalInformationDTOTest.java
+++ b/third-party/rspamd/src/test/java/org/apache/james/rspamd/task/FeedHamToRspamdTaskAdditionalInformationDTOTest.java
@@ -19,10 +19,6 @@
 
 package org.apache.james.rspamd.task;
 
-import static org.apache.james.rspamd.task.FeedHamToRspamdTask.RunningOptions.DEFAULT_MESSAGES_PER_SECOND;
-import static org.apache.james.rspamd.task.FeedHamToRspamdTask.RunningOptions.DEFAULT_PERIOD;
-import static org.apache.james.rspamd.task.FeedHamToRspamdTask.RunningOptions.DEFAULT_SAMPLING_PROBABILITY;
-
 import java.time.Instant;
 import java.util.Optional;
 
@@ -39,9 +35,7 @@ class FeedHamToRspamdTaskAdditionalInformationDTOTest {
                 4,
                 2,
                 1,
-                DEFAULT_MESSAGES_PER_SECOND,
-                DEFAULT_PERIOD,
-                DEFAULT_SAMPLING_PROBABILITY))
+                RunningOptions.DEFAULT))
             .json(ClassLoaderUtils.getSystemResourceAsString("json/feedHamEmptyPeriod.additionalInformation.json"))
             .verify();
     }
@@ -54,9 +48,10 @@ class FeedHamToRspamdTaskAdditionalInformationDTOTest {
                 4,
                 2,
                 1,
-                DEFAULT_MESSAGES_PER_SECOND,
-                Optional.of(3600L),
-                DEFAULT_SAMPLING_PROBABILITY))
+                new RunningOptions(
+                    Optional.of(3600L),
+                    RunningOptions.DEFAULT_MESSAGES_PER_SECOND,
+                    RunningOptions.DEFAULT_SAMPLING_PROBABILITY)))
             .json(ClassLoaderUtils.getSystemResourceAsString("json/feedHamNonEmptyPeriod.additionalInformation.json"))
             .verify();
     }
diff --git a/third-party/rspamd/src/test/java/org/apache/james/rspamd/task/FeedHamToRspamdTaskTest.java b/third-party/rspamd/src/test/java/org/apache/james/rspamd/task/FeedHamToRspamdTaskTest.java
index cc1d42e468..65a187e9dc 100644
--- a/third-party/rspamd/src/test/java/org/apache/james/rspamd/task/FeedHamToRspamdTaskTest.java
+++ b/third-party/rspamd/src/test/java/org/apache/james/rspamd/task/FeedHamToRspamdTaskTest.java
@@ -20,10 +20,9 @@
 package org.apache.james.rspamd.task;
 
 import static org.apache.james.rspamd.DockerRspamd.PASSWORD;
-import static org.apache.james.rspamd.task.FeedHamToRspamdTask.RunningOptions.DEFAULT_MESSAGES_PER_SECOND;
-import static org.apache.james.rspamd.task.FeedHamToRspamdTask.RunningOptions.DEFAULT_PERIOD;
-import static org.apache.james.rspamd.task.FeedHamToRspamdTask.RunningOptions.DEFAULT_SAMPLING_PROBABILITY;
 import static org.apache.james.rspamd.task.FeedSpamToRspamdTaskTest.BOB_SPAM_MAILBOX;
+import static org.apache.james.rspamd.task.RunningOptions.DEFAULT_MESSAGES_PER_SECOND;
+import static org.apache.james.rspamd.task.RunningOptions.DEFAULT_SAMPLING_PROBABILITY;
 import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.mock;
@@ -110,7 +109,7 @@ public class FeedHamToRspamdTaskTest {
         client = new RspamdHttpClient(new RspamdClientConfiguration(rspamdExtension.getBaseUrl(), PASSWORD, Optional.empty()));
         messageIdManager = inMemoryIntegrationResources.getMessageIdManager();
         mapperFactory = mailboxManager.getMapperFactory();
-        task = new FeedHamToRspamdTask(mailboxManager, usersRepository, messageIdManager, mapperFactory, client, FeedHamToRspamdTask.RunningOptions.DEFAULT, clock);
+        task = new FeedHamToRspamdTask(mailboxManager, usersRepository, messageIdManager, mapperFactory, client, RunningOptions.DEFAULT, clock);
     }
 
     @Test
@@ -123,9 +122,6 @@ public class FeedHamToRspamdTaskTest {
                 .hamMessageCount(0)
                 .reportedHamMessageCount(0)
                 .errorCount(0)
-                .messagesPerSecond(DEFAULT_MESSAGES_PER_SECOND)
-                .period(DEFAULT_PERIOD)
-                .samplingProbability(DEFAULT_SAMPLING_PROBABILITY)
                 .build());
     }
 
@@ -142,15 +138,12 @@ public class FeedHamToRspamdTaskTest {
                 .hamMessageCount(2)
                 .reportedHamMessageCount(2)
                 .errorCount(0)
-                .messagesPerSecond(DEFAULT_MESSAGES_PER_SECOND)
-                .period(DEFAULT_PERIOD)
-                .samplingProbability(DEFAULT_SAMPLING_PROBABILITY)
                 .build());
     }
 
     @Test
     void taskShouldReportHamMessageInPeriod() throws MailboxException {
-        FeedHamToRspamdTask.RunningOptions runningOptions = new FeedHamToRspamdTask.RunningOptions(Optional.of(TWO_DAYS_IN_SECOND),
+        RunningOptions runningOptions = new RunningOptions(Optional.of(TWO_DAYS_IN_SECOND),
             DEFAULT_MESSAGES_PER_SECOND, DEFAULT_SAMPLING_PROBABILITY);
         task = new FeedHamToRspamdTask(mailboxManager, usersRepository, messageIdManager, mapperFactory, client, runningOptions, clock);
 
@@ -164,15 +157,12 @@ public class FeedHamToRspamdTaskTest {
                 .hamMessageCount(1)
                 .reportedHamMessageCount(1)
                 .errorCount(0)
-                .messagesPerSecond(DEFAULT_MESSAGES_PER_SECOND)
-                .period(Optional.of(TWO_DAYS_IN_SECOND))
-                .samplingProbability(DEFAULT_SAMPLING_PROBABILITY)
                 .build());
     }
 
     @Test
     void taskShouldNotReportHamMessageNotInPeriod() throws MailboxException {
-        FeedHamToRspamdTask.RunningOptions runningOptions = new FeedHamToRspamdTask.RunningOptions(Optional.of(TWO_DAYS_IN_SECOND),
+        RunningOptions runningOptions = new RunningOptions(Optional.of(TWO_DAYS_IN_SECOND),
             DEFAULT_MESSAGES_PER_SECOND, DEFAULT_SAMPLING_PROBABILITY);
         task = new FeedHamToRspamdTask(mailboxManager, usersRepository, messageIdManager, mapperFactory, client, runningOptions, clock);
 
@@ -186,15 +176,12 @@ public class FeedHamToRspamdTaskTest {
                 .hamMessageCount(1)
                 .reportedHamMessageCount(0)
                 .errorCount(0)
-                .messagesPerSecond(DEFAULT_MESSAGES_PER_SECOND)
-                .period(Optional.of(TWO_DAYS_IN_SECOND))
-                .samplingProbability(DEFAULT_SAMPLING_PROBABILITY)
                 .build());
     }
 
     @Test
     void mixedInternalDateCase() throws MailboxException {
-        FeedHamToRspamdTask.RunningOptions runningOptions = new FeedHamToRspamdTask.RunningOptions(Optional.of(TWO_DAYS_IN_SECOND),
+        RunningOptions runningOptions = new RunningOptions(Optional.of(TWO_DAYS_IN_SECOND),
             DEFAULT_MESSAGES_PER_SECOND, DEFAULT_SAMPLING_PROBABILITY);
         task = new FeedHamToRspamdTask(mailboxManager, usersRepository, messageIdManager, mapperFactory, client, runningOptions, clock);
 
@@ -209,15 +196,12 @@ public class FeedHamToRspamdTaskTest {
                 .hamMessageCount(2)
                 .reportedHamMessageCount(1)
                 .errorCount(0)
-                .messagesPerSecond(DEFAULT_MESSAGES_PER_SECOND)
-                .period(Optional.of(TWO_DAYS_IN_SECOND))
-                .samplingProbability(DEFAULT_SAMPLING_PROBABILITY)
                 .build());
     }
 
     @Test
     void taskWithSamplingProbabilityIsZeroShouldReportNonHamMessage() {
-        FeedHamToRspamdTask.RunningOptions runningOptions = new FeedHamToRspamdTask.RunningOptions(Optional.empty(),
+        RunningOptions runningOptions = new RunningOptions(Optional.empty(),
             DEFAULT_MESSAGES_PER_SECOND, 0);
         task = new FeedHamToRspamdTask(mailboxManager, usersRepository, messageIdManager, mapperFactory, client, runningOptions, clock);
 
@@ -232,9 +216,6 @@ public class FeedHamToRspamdTaskTest {
                 .hamMessageCount(10)
                 .reportedHamMessageCount(0)
                 .errorCount(0)
-                .messagesPerSecond(DEFAULT_MESSAGES_PER_SECOND)
-                .period(DEFAULT_PERIOD)
-                .samplingProbability(0)
                 .build());
     }
 
@@ -251,15 +232,12 @@ public class FeedHamToRspamdTaskTest {
                 .hamMessageCount(10)
                 .reportedHamMessageCount(10)
                 .errorCount(0)
-                .messagesPerSecond(DEFAULT_MESSAGES_PER_SECOND)
-                .period(DEFAULT_PERIOD)
-                .samplingProbability(DEFAULT_SAMPLING_PROBABILITY)
                 .build());
     }
 
     @Test
     void taskWithVeryLowSamplingProbabilityShouldReportNotAllHamMessages() {
-        FeedHamToRspamdTask.RunningOptions runningOptions = new FeedHamToRspamdTask.RunningOptions(Optional.empty(),
+        RunningOptions runningOptions = new RunningOptions(Optional.empty(),
             DEFAULT_MESSAGES_PER_SECOND, 0.01);
         task = new FeedHamToRspamdTask(mailboxManager, usersRepository, messageIdManager, mapperFactory, client, runningOptions, clock);
 
@@ -278,7 +256,7 @@ public class FeedHamToRspamdTaskTest {
 
     @Test
     void taskWithVeryHighSamplingProbabilityShouldReportMoreThanZeroMessage() {
-        FeedHamToRspamdTask.RunningOptions runningOptions = new FeedHamToRspamdTask.RunningOptions(Optional.empty(),
+        RunningOptions runningOptions = new RunningOptions(Optional.empty(),
             DEFAULT_MESSAGES_PER_SECOND, 0.99);
         task = new FeedHamToRspamdTask(mailboxManager, usersRepository, messageIdManager, mapperFactory, client, runningOptions, clock);
 
@@ -297,7 +275,7 @@ public class FeedHamToRspamdTaskTest {
 
     @Test
     void taskWithAverageSamplingProbabilityShouldReportSomeMessages() {
-        FeedHamToRspamdTask.RunningOptions runningOptions = new FeedHamToRspamdTask.RunningOptions(Optional.empty(),
+        RunningOptions runningOptions = new RunningOptions(Optional.empty(),
             DEFAULT_MESSAGES_PER_SECOND, 0.5);
         task = new FeedHamToRspamdTask(mailboxManager, usersRepository, messageIdManager, mapperFactory, client, runningOptions, clock);
 
@@ -327,9 +305,6 @@ public class FeedHamToRspamdTaskTest {
                 .hamMessageCount(0)
                 .reportedHamMessageCount(0)
                 .errorCount(0)
-                .messagesPerSecond(DEFAULT_MESSAGES_PER_SECOND)
-                .period(DEFAULT_PERIOD)
-                .samplingProbability(DEFAULT_SAMPLING_PROBABILITY)
                 .build());
     }
 
@@ -346,9 +321,6 @@ public class FeedHamToRspamdTaskTest {
                 .hamMessageCount(2)
                 .reportedHamMessageCount(2)
                 .errorCount(0)
-                .messagesPerSecond(DEFAULT_MESSAGES_PER_SECOND)
-                .period(DEFAULT_PERIOD)
-                .samplingProbability(DEFAULT_SAMPLING_PROBABILITY)
                 .build());
     }
 
@@ -367,9 +339,6 @@ public class FeedHamToRspamdTaskTest {
                 .hamMessageCount(2)
                 .reportedHamMessageCount(2)
                 .errorCount(0)
-                .messagesPerSecond(DEFAULT_MESSAGES_PER_SECOND)
-                .period(DEFAULT_PERIOD)
-                .samplingProbability(DEFAULT_SAMPLING_PROBABILITY)
                 .build());
     }
 
diff --git a/third-party/rspamd/src/test/java/org/apache/james/rspamd/task/FeedSpamToRspamdTaskAdditionalInformationDTOTest.java b/third-party/rspamd/src/test/java/org/apache/james/rspamd/task/FeedSpamToRspamdTaskAdditionalInformationDTOTest.java
index c8c9455f7e..8471affa3a 100644
--- a/third-party/rspamd/src/test/java/org/apache/james/rspamd/task/FeedSpamToRspamdTaskAdditionalInformationDTOTest.java
+++ b/third-party/rspamd/src/test/java/org/apache/james/rspamd/task/FeedSpamToRspamdTaskAdditionalInformationDTOTest.java
@@ -19,9 +19,8 @@
 
 package org.apache.james.rspamd.task;
 
-import static org.apache.james.rspamd.task.FeedSpamToRspamdTask.RunningOptions.DEFAULT_MESSAGES_PER_SECOND;
-import static org.apache.james.rspamd.task.FeedSpamToRspamdTask.RunningOptions.DEFAULT_PERIOD;
-import static org.apache.james.rspamd.task.FeedSpamToRspamdTask.RunningOptions.DEFAULT_SAMPLING_PROBABILITY;
+import static org.apache.james.rspamd.task.RunningOptions.DEFAULT_MESSAGES_PER_SECOND;
+import static org.apache.james.rspamd.task.RunningOptions.DEFAULT_SAMPLING_PROBABILITY;
 
 import java.time.Instant;
 import java.util.Optional;
@@ -39,9 +38,7 @@ class FeedSpamToRspamdTaskAdditionalInformationDTOTest {
                 4,
                 2,
                 1,
-                DEFAULT_MESSAGES_PER_SECOND,
-                DEFAULT_PERIOD,
-                DEFAULT_SAMPLING_PROBABILITY))
+                RunningOptions.DEFAULT))
             .json(ClassLoaderUtils.getSystemResourceAsString("json/feedSpamEmptyPeriod.additionalInformation.json"))
             .verify();
     }
@@ -54,9 +51,10 @@ class FeedSpamToRspamdTaskAdditionalInformationDTOTest {
                 4,
                 2,
                 1,
-                DEFAULT_MESSAGES_PER_SECOND,
-                Optional.of(3600L),
-                DEFAULT_SAMPLING_PROBABILITY))
+                new RunningOptions(
+                    Optional.of(3600L),
+                    DEFAULT_MESSAGES_PER_SECOND,
+                    DEFAULT_SAMPLING_PROBABILITY)))
             .json(ClassLoaderUtils.getSystemResourceAsString("json/feedSpamNonEmptyPeriod.additionalInformation.json"))
             .verify();
     }
diff --git a/third-party/rspamd/src/test/java/org/apache/james/rspamd/task/FeedSpamToRspamdTaskTest.java b/third-party/rspamd/src/test/java/org/apache/james/rspamd/task/FeedSpamToRspamdTaskTest.java
index e2afec9b56..9f800d73bf 100644
--- a/third-party/rspamd/src/test/java/org/apache/james/rspamd/task/FeedSpamToRspamdTaskTest.java
+++ b/third-party/rspamd/src/test/java/org/apache/james/rspamd/task/FeedSpamToRspamdTaskTest.java
@@ -20,10 +20,9 @@
 package org.apache.james.rspamd.task;
 
 import static org.apache.james.rspamd.DockerRspamd.PASSWORD;
-import static org.apache.james.rspamd.task.FeedSpamToRspamdTask.RunningOptions.DEFAULT_MESSAGES_PER_SECOND;
-import static org.apache.james.rspamd.task.FeedSpamToRspamdTask.RunningOptions.DEFAULT_PERIOD;
-import static org.apache.james.rspamd.task.FeedSpamToRspamdTask.RunningOptions.DEFAULT_SAMPLING_PROBABILITY;
 import static org.apache.james.rspamd.task.FeedSpamToRspamdTask.SPAM_MAILBOX_NAME;
+import static org.apache.james.rspamd.task.RunningOptions.DEFAULT_MESSAGES_PER_SECOND;
+import static org.apache.james.rspamd.task.RunningOptions.DEFAULT_SAMPLING_PROBABILITY;
 import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.mock;
@@ -103,7 +102,7 @@ public class FeedSpamToRspamdTaskTest {
         client = new RspamdHttpClient(new RspamdClientConfiguration(rspamdExtension.getBaseUrl(), PASSWORD, Optional.empty()));
         messageIdManager = inMemoryIntegrationResources.getMessageIdManager();
         mapperFactory = mailboxManager.getMapperFactory();
-        task = new FeedSpamToRspamdTask(mailboxManager, usersRepository, messageIdManager, mapperFactory, client, FeedSpamToRspamdTask.RunningOptions.DEFAULT, clock);
+        task = new FeedSpamToRspamdTask(mailboxManager, usersRepository, messageIdManager, mapperFactory, client, RunningOptions.DEFAULT, clock);
     }
 
     @Test
@@ -116,9 +115,6 @@ public class FeedSpamToRspamdTaskTest {
                 .spamMessageCount(0)
                 .reportedSpamMessageCount(0)
                 .errorCount(0)
-                .messagesPerSecond(DEFAULT_MESSAGES_PER_SECOND)
-                .period(DEFAULT_PERIOD)
-                .samplingProbability(DEFAULT_SAMPLING_PROBABILITY)
                 .build());
     }
 
@@ -135,15 +131,12 @@ public class FeedSpamToRspamdTaskTest {
                 .spamMessageCount(2)
                 .reportedSpamMessageCount(2)
                 .errorCount(0)
-                .messagesPerSecond(DEFAULT_MESSAGES_PER_SECOND)
-                .period(DEFAULT_PERIOD)
-                .samplingProbability(DEFAULT_SAMPLING_PROBABILITY)
                 .build());
     }
 
     @Test
     void taskShouldReportSpamMessageInPeriod() throws MailboxException {
-        FeedSpamToRspamdTask.RunningOptions runningOptions = new FeedSpamToRspamdTask.RunningOptions(Optional.of(TWO_DAYS_IN_SECOND),
+        RunningOptions runningOptions = new RunningOptions(Optional.of(TWO_DAYS_IN_SECOND),
             DEFAULT_MESSAGES_PER_SECOND, DEFAULT_SAMPLING_PROBABILITY);
         task = new FeedSpamToRspamdTask(mailboxManager, usersRepository, messageIdManager, mapperFactory, client, runningOptions, clock);
 
@@ -157,15 +150,12 @@ public class FeedSpamToRspamdTaskTest {
                 .spamMessageCount(1)
                 .reportedSpamMessageCount(1)
                 .errorCount(0)
-                .messagesPerSecond(DEFAULT_MESSAGES_PER_SECOND)
-                .period(Optional.of(TWO_DAYS_IN_SECOND))
-                .samplingProbability(DEFAULT_SAMPLING_PROBABILITY)
                 .build());
     }
 
     @Test
     void taskShouldNotReportSpamMessageNotInPeriod() throws MailboxException {
-        FeedSpamToRspamdTask.RunningOptions runningOptions = new FeedSpamToRspamdTask.RunningOptions(Optional.of(TWO_DAYS_IN_SECOND),
+        RunningOptions runningOptions = new RunningOptions(Optional.of(TWO_DAYS_IN_SECOND),
             DEFAULT_MESSAGES_PER_SECOND, DEFAULT_SAMPLING_PROBABILITY);
         task = new FeedSpamToRspamdTask(mailboxManager, usersRepository, messageIdManager, mapperFactory, client, runningOptions, clock);
 
@@ -179,15 +169,12 @@ public class FeedSpamToRspamdTaskTest {
                 .spamMessageCount(1)
                 .reportedSpamMessageCount(0)
                 .errorCount(0)
-                .messagesPerSecond(DEFAULT_MESSAGES_PER_SECOND)
-                .period(Optional.of(TWO_DAYS_IN_SECOND))
-                .samplingProbability(DEFAULT_SAMPLING_PROBABILITY)
                 .build());
     }
 
     @Test
     void mixedInternalDateCase() throws MailboxException {
-        FeedSpamToRspamdTask.RunningOptions runningOptions = new FeedSpamToRspamdTask.RunningOptions(Optional.of(TWO_DAYS_IN_SECOND),
+        RunningOptions runningOptions = new RunningOptions(Optional.of(TWO_DAYS_IN_SECOND),
             DEFAULT_MESSAGES_PER_SECOND, DEFAULT_SAMPLING_PROBABILITY);
         task = new FeedSpamToRspamdTask(mailboxManager, usersRepository, messageIdManager, mapperFactory, client, runningOptions, clock);
 
@@ -202,15 +189,12 @@ public class FeedSpamToRspamdTaskTest {
                 .spamMessageCount(2)
                 .reportedSpamMessageCount(1)
                 .errorCount(0)
-                .messagesPerSecond(DEFAULT_MESSAGES_PER_SECOND)
-                .period(Optional.of(TWO_DAYS_IN_SECOND))
-                .samplingProbability(DEFAULT_SAMPLING_PROBABILITY)
                 .build());
     }
 
     @Test
     void taskWithSamplingProbabilityIsZeroShouldReportNonSpamMessage() {
-        FeedSpamToRspamdTask.RunningOptions runningOptions = new FeedSpamToRspamdTask.RunningOptions(Optional.empty(),
+        RunningOptions runningOptions = new RunningOptions(Optional.empty(),
             DEFAULT_MESSAGES_PER_SECOND, 0);
         task = new FeedSpamToRspamdTask(mailboxManager, usersRepository, messageIdManager, mapperFactory, client, runningOptions, clock);
 
@@ -225,9 +209,6 @@ public class FeedSpamToRspamdTaskTest {
                 .spamMessageCount(10)
                 .reportedSpamMessageCount(0)
                 .errorCount(0)
-                .messagesPerSecond(DEFAULT_MESSAGES_PER_SECOND)
-                .period(DEFAULT_PERIOD)
-                .samplingProbability(0)
                 .build());
     }
 
@@ -244,15 +225,12 @@ public class FeedSpamToRspamdTaskTest {
                 .spamMessageCount(10)
                 .reportedSpamMessageCount(10)
                 .errorCount(0)
-                .messagesPerSecond(DEFAULT_MESSAGES_PER_SECOND)
-                .period(DEFAULT_PERIOD)
-                .samplingProbability(DEFAULT_SAMPLING_PROBABILITY)
                 .build());
     }
 
     @Test
     void taskWithVeryLowSamplingProbabilityShouldReportNotAllSpamMessages() {
-        FeedSpamToRspamdTask.RunningOptions runningOptions = new FeedSpamToRspamdTask.RunningOptions(Optional.empty(),
+        RunningOptions runningOptions = new RunningOptions(Optional.empty(),
             DEFAULT_MESSAGES_PER_SECOND, 0.01);
         task = new FeedSpamToRspamdTask(mailboxManager, usersRepository, messageIdManager, mapperFactory, client, runningOptions, clock);
 
@@ -271,7 +249,7 @@ public class FeedSpamToRspamdTaskTest {
 
     @Test
     void taskWithVeryHighSamplingProbabilityShouldReportMoreThanZeroMessage() {
-        FeedSpamToRspamdTask.RunningOptions runningOptions = new FeedSpamToRspamdTask.RunningOptions(Optional.empty(),
+        RunningOptions runningOptions = new RunningOptions(Optional.empty(),
             DEFAULT_MESSAGES_PER_SECOND, 0.99);
         task = new FeedSpamToRspamdTask(mailboxManager, usersRepository, messageIdManager, mapperFactory, client, runningOptions, clock);
 
@@ -290,7 +268,7 @@ public class FeedSpamToRspamdTaskTest {
 
     @Test
     void taskWithAverageSamplingProbabilityShouldReportSomeMessages() {
-        FeedSpamToRspamdTask.RunningOptions runningOptions = new FeedSpamToRspamdTask.RunningOptions(Optional.empty(),
+        RunningOptions runningOptions = new RunningOptions(Optional.empty(),
             DEFAULT_MESSAGES_PER_SECOND, 0.5);
         task = new FeedSpamToRspamdTask(mailboxManager, usersRepository, messageIdManager, mapperFactory, client, runningOptions, clock);
 


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org