You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by ma...@apache.org on 2020/03/17 09:35:36 UTC

[james-project] 03/04: JAMES-3070 strong type MailQueueName

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

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

commit 850da1e5370066acb5691753a6ecd77f4eb7a457
Author: Matthieu Baechler <ma...@apache.org>
AuthorDate: Thu Feb 20 16:51:38 2020 +0100

    JAMES-3070 strong type MailQueueName
---
 .../mailets/MailReprocessingIntegrationTest.java   |   8 +-
 .../delivery/RemoteDeliveryConfiguration.java      |  11 +-
 .../delivery/RemoteDeliveryConfigurationTest.java  |   2 +-
 .../remote/delivery/RemoteDeliveryRunningTest.java |   5 +-
 .../remote/delivery/RemoteDeliveryTest.java        |   2 +-
 .../SetMessagesOutboxFlagUpdateTest.java           |   9 +-
 .../apache/james/webadmin/dto/MailQueueDTO.java    |   2 +-
 .../james/webadmin/routes/MailQueueRoutes.java     |  47 ++++++---
 .../james/webadmin/service/ClearMailQueueTask.java |  27 +++--
 ...ClearMailQueueTaskAdditionalInformationDTO.java |   3 +-
 .../webadmin/service/ClearMailQueueTaskDTO.java    |   5 +-
 .../service/DeleteMailsFromMailQueueTask.java      |  40 +++++---
 ...sFromMailQueueTaskAdditionalInformationDTO.java |   3 +-
 .../service/DeleteMailsFromMailQueueTaskDTO.java   |   5 +-
 .../james/webadmin/routes/MailQueueRoutesTest.java | 112 +++++++++++----------
 .../webadmin/service/ClearMailQueueTaskTest.java   |   9 +-
 .../service/DeleteMailsFromMailQueueTaskTest.java  |   8 +-
 .../webadmin/routes/MailRepositoriesRoutes.java    |  11 +-
 .../webadmin/service/ReprocessingAllMailsTask.java |  11 +-
 ...essingAllMailsTaskAdditionalInformationDTO.java |   3 +-
 .../service/ReprocessingAllMailsTaskDTO.java       |   5 +-
 .../webadmin/service/ReprocessingOneMailTask.java  |  11 +-
 ...cessingOneMailTaskAdditionalInformationDTO.java |   3 +-
 .../service/ReprocessingOneMailTaskDTO.java        |   5 +-
 .../webadmin/service/ReprocessingService.java      |   9 +-
 .../routes/MailRepositoriesRoutesTest.java         |  35 +++----
 .../service/ReprocessingAllMailsTaskTest.java      |   3 +-
 .../service/ReprocessingOneMailTaskTest.java       |   3 +-
 .../webadmin/service/ReprocessingServiceTest.java  |   3 +-
 .../queue/activemq/ActiveMQCacheableMailQueue.java |   9 +-
 .../queue/activemq/ActiveMQMailQueueFactory.java   |   3 +-
 .../queue/activemq/ActiveMQMailQueueBlobTest.java  |   3 +-
 .../queue/activemq/ActiveMQMailQueueTest.java      |   3 +-
 .../java/org/apache/james/queue/api/MailQueue.java |   2 +-
 .../apache/james/queue/api/MailQueueFactory.java   |   8 +-
 .../org/apache/james/queue/api/MailQueueName.java} |  48 ++++++---
 .../james/queue/api/MailQueueFactoryContract.java  |   4 +-
 .../apache/james/queue/api/MailQueueNameTest.java} |  90 ++++++++---------
 .../api/ManageableMailQueueFactoryContract.java    |   2 +-
 .../james/queue/file/FileCacheableMailQueue.java   |   9 +-
 .../james/queue/file/FileMailQueueFactory.java     |  11 +-
 .../queue/file/FileCacheableMailQueueTest.java     |   3 +-
 .../james/queue/jms/JMSCacheableMailQueue.java     |  31 +++---
 .../james/queue/jms/JMSMailQueueFactory.java       |   3 +-
 .../queue/library/AbstractMailQueueFactory.java    |  17 ++--
 .../apache/james/queue/jms/BrokerExtension.java    |   5 +-
 .../james/queue/jms/JMSCacheableMailQueueTest.java |   3 +-
 .../library/AbstractMailQueueFactoryTest.java      |  29 +++---
 .../james/queue/memory/MemoryMailQueueFactory.java |  15 +--
 .../queue/memory/MemoryCacheableMailQueueTest.java |   3 +-
 .../james/queue/rabbitmq/RabbitMQMailQueue.java    |   4 +-
 .../queue/rabbitmq/RabbitMQMailQueueFactory.java   |  13 +--
 .../RabbitMQMailQueueConfigurationChangeTest.java  |   3 +-
 .../queue/rabbitmq/RabbitMQMailQueueTest.java      |   6 +-
 54 files changed, 414 insertions(+), 313 deletions(-)

diff --git a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/MailReprocessingIntegrationTest.java b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/MailReprocessingIntegrationTest.java
index cc6fc22..f7ba937 100644
--- a/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/MailReprocessingIntegrationTest.java
+++ b/server/mailet/integration-testing/src/test/java/org/apache/james/transport/mailets/MailReprocessingIntegrationTest.java
@@ -123,7 +123,7 @@ public class MailReprocessingIntegrationTest {
         given()
             .spec(specification)
             .param("action", "reprocess")
-            .param("queue", MailQueueFactory.SPOOL)
+            .param("queue", MailQueueFactory.SPOOL.asString())
             .param("processor", TRANSPORT_PROCESSOR)
         .patch("/mailRepositories/" + REPOSITORY_B.getPath().urlEncoded() + "/mails");
 
@@ -151,7 +151,7 @@ public class MailReprocessingIntegrationTest {
         given()
             .spec(specification)
             .param("action", "reprocess")
-            .param("queue", MailQueueFactory.SPOOL)
+            .param("queue", MailQueueFactory.SPOOL.asString())
             .param("processor", TRANSPORT_PROCESSOR)
         .patch("/mailRepositories/" + REPOSITORY_B.getPath().urlEncoded() + "/mails");
 
@@ -162,7 +162,7 @@ public class MailReprocessingIntegrationTest {
         String taskId = given()
             .spec(specification)
             .param("action", "reprocess")
-            .param("queue", MailQueueFactory.SPOOL)
+            .param("queue", MailQueueFactory.SPOOL.asString())
         .patch("/mailRepositories/" + REPOSITORY_A.getPath().urlEncoded() + "/mails")
             .jsonPath()
             .get("taskId");
@@ -195,7 +195,7 @@ public class MailReprocessingIntegrationTest {
         given()
             .spec(specification)
             .param("action", "reprocess")
-            .param("queue", MailQueueFactory.SPOOL)
+            .param("queue", MailQueueFactory.SPOOL.asString())
             .param("processor", "unknown")
             .patch("/mailRepositories/" + REPOSITORY_B.getPath().urlEncoded() + "/mails");
 
diff --git a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/RemoteDeliveryConfiguration.java b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/RemoteDeliveryConfiguration.java
index fbe60fa..68ef607 100644
--- a/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/RemoteDeliveryConfiguration.java
+++ b/server/mailet/mailets/src/main/java/org/apache/james/transport/mailets/remote/delivery/RemoteDeliveryConfiguration.java
@@ -27,6 +27,7 @@ import java.util.Properties;
 
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.james.domainlist.api.DomainList;
+import org.apache.james.queue.api.MailQueueName;
 import org.apache.mailet.MailetConfig;
 import org.apache.mailet.base.MailetUtil;
 import org.slf4j.Logger;
@@ -62,7 +63,7 @@ public class RemoteDeliveryConfiguration {
     public static final String DELAY_TIME = "delayTime";
     public static final String DEBUG = "debug";
     public static final int DEFAULT_SMTP_TIMEOUT = 180000;
-    public static final String DEFAULT_OUTGOING_QUEUE_NAME = "outgoing";
+    public static final MailQueueName DEFAULT_OUTGOING_QUEUE_NAME = MailQueueName.of("outgoing");
     public static final int DEFAULT_CONNECTION_TIMEOUT = 60000;
     public static final int DEFAULT_DNS_RETRY_PROBLEM = 0;
     public static final int DEFAULT_MAX_RETRY = 5;
@@ -80,7 +81,7 @@ public class RemoteDeliveryConfiguration {
     private final int connectionTimeout;
     private final List<Duration> delayTimes;
     private final HeloNameProvider heloNameProvider;
-    private final String outGoingQueueName;
+    private final MailQueueName outGoingQueueName;
     private final String bindAddress;
     private final String bounceProcessor;
     private final Collection<String> gatewayServer;
@@ -94,7 +95,9 @@ public class RemoteDeliveryConfiguration {
         isSSLEnable = MailetUtil.getInitParameter(mailetConfig, SSL_ENABLE).orElse(false);
         usePriority = MailetUtil.getInitParameter(mailetConfig, USE_PRIORITY).orElse(false);
         sendPartial = MailetUtil.getInitParameter(mailetConfig, SENDPARTIAL).orElse(false);
-        outGoingQueueName = Optional.ofNullable(mailetConfig.getInitParameter(OUTGOING)).orElse(DEFAULT_OUTGOING_QUEUE_NAME);
+        outGoingQueueName = Optional.ofNullable(mailetConfig.getInitParameter(OUTGOING))
+            .map(MailQueueName::of)
+            .orElse(DEFAULT_OUTGOING_QUEUE_NAME);
         bounceProcessor = mailetConfig.getInitParameter(BOUNCE_PROCESSOR);
         bindAddress = mailetConfig.getInitParameter(BIND);
 
@@ -293,7 +296,7 @@ public class RemoteDeliveryConfiguration {
         return heloNameProvider;
     }
 
-    public String getOutGoingQueueName() {
+    public MailQueueName getOutGoingQueueName() {
         return outGoingQueueName;
     }
 
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/RemoteDeliveryConfigurationTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/RemoteDeliveryConfigurationTest.java
index cd70d4c..64e38e9 100644
--- a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/RemoteDeliveryConfigurationTest.java
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/RemoteDeliveryConfigurationTest.java
@@ -140,7 +140,7 @@ public class RemoteDeliveryConfigurationTest {
             .setProperty(RemoteDeliveryConfiguration.OUTGOING, value)
             .build();
 
-        assertThat(new RemoteDeliveryConfiguration(mailetConfig, mock(DomainList.class)).getOutGoingQueueName())
+        assertThat(new RemoteDeliveryConfiguration(mailetConfig, mock(DomainList.class)).getOutGoingQueueName().asString())
             .isEqualTo(value);
     }
 
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/RemoteDeliveryRunningTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/RemoteDeliveryRunningTest.java
index 596eb13..b059efa 100644
--- a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/RemoteDeliveryRunningTest.java
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/RemoteDeliveryRunningTest.java
@@ -31,6 +31,7 @@ import org.apache.james.domainlist.api.DomainList;
 import org.apache.james.metrics.api.MetricFactory;
 import org.apache.james.queue.api.MailQueue;
 import org.apache.james.queue.api.MailQueueFactory;
+import org.apache.james.queue.api.MailQueueName;
 import org.apache.james.transport.mailets.RemoteDelivery;
 import org.apache.mailet.base.test.FakeMailetConfig;
 import org.junit.After;
@@ -40,7 +41,7 @@ import org.junit.Test;
 import reactor.core.publisher.Flux;
 
 public class RemoteDeliveryRunningTest {
-    private static final String QUEUE_NAME = "queueName";
+    private static final MailQueueName QUEUE_NAME = MailQueueName.of("queueName");
 
     private RemoteDelivery remoteDelivery;
     private MailQueue mailQueue;
@@ -66,7 +67,7 @@ public class RemoteDeliveryRunningTest {
             return Flux.never();
         });
         remoteDelivery.init(FakeMailetConfig.builder()
-            .setProperty(RemoteDeliveryConfiguration.OUTGOING, QUEUE_NAME)
+            .setProperty(RemoteDeliveryConfiguration.OUTGOING, QUEUE_NAME.asString())
             .setProperty(RemoteDeliveryConfiguration.HELO_NAME, "Hello_name")
             .build());
 
diff --git a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/RemoteDeliveryTest.java b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/RemoteDeliveryTest.java
index 4c7a87e..1e62160 100644
--- a/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/RemoteDeliveryTest.java
+++ b/server/mailet/mailets/src/test/java/org/apache/james/transport/mailets/remote/delivery/RemoteDeliveryTest.java
@@ -100,7 +100,7 @@ public class RemoteDeliveryTest {
     @Before
     public void setUp() throws ConfigurationException {
         MailQueueFactory<ManageableMailQueue> queueFactory = new MemoryMailQueueFactory(new RawMailQueueItemDecoratorFactory());
-        mailQueue = queueFactory.createQueue(RemoteDeliveryConfiguration.OUTGOING);
+        mailQueue = queueFactory.createQueue(RemoteDeliveryConfiguration.DEFAULT_OUTGOING_QUEUE_NAME);
         DNSService dnsService = mock(DNSService.class);
         MemoryDomainList domainList = new MemoryDomainList(dnsService);
         domainList.configure(DomainListConfiguration.builder().defaultDomain(JAMES_APACHE_ORG_DOMAIN));
diff --git a/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/SetMessagesOutboxFlagUpdateTest.java b/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/SetMessagesOutboxFlagUpdateTest.java
index 00dcf07..0f82362 100644
--- a/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/SetMessagesOutboxFlagUpdateTest.java
+++ b/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/SetMessagesOutboxFlagUpdateTest.java
@@ -49,6 +49,7 @@ import org.apache.james.modules.MailboxProbeImpl;
 import org.apache.james.probe.DataProbe;
 import org.apache.james.queue.api.MailQueue;
 import org.apache.james.queue.api.MailQueueFactory;
+import org.apache.james.queue.api.MailQueueName;
 import org.apache.james.utils.DataProbeImpl;
 import org.apache.mailet.Mail;
 import org.junit.After;
@@ -72,19 +73,19 @@ public abstract class SetMessagesOutboxFlagUpdateTest {
 
     protected MailQueueFactory<MailQueue> noopMailQueueFactory = new MailQueueFactory<MailQueue>() {
         @Override
-        public Optional<MailQueue> getQueue(String name) {
+        public Optional<MailQueue> getQueue(MailQueueName name) {
             return Optional.of(createQueue(name));
         }
 
         @Override
-        public MailQueue createQueue(String name) {
+        public MailQueue createQueue(MailQueueName name) {
             return new MailQueue() {
                 @Override
                 public void close() throws IOException {
                 }
 
                 @Override
-                public String getName() {
+                public MailQueueName getName() {
                     return name;
                 }
 
@@ -105,7 +106,7 @@ public abstract class SetMessagesOutboxFlagUpdateTest {
         }
 
         @Override
-        public Set<String> listCreatedMailQueues() {
+        public Set<MailQueueName> listCreatedMailQueues() {
             throw new NotImplementedException("Minimalistic implementation. Please do not list queues");
         }
     };
diff --git a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/dto/MailQueueDTO.java b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/dto/MailQueueDTO.java
index 39198d0..c2301dc 100644
--- a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/dto/MailQueueDTO.java
+++ b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/dto/MailQueueDTO.java
@@ -33,7 +33,7 @@ public class MailQueueDTO {
 
     public static MailQueueDTO from(ManageableMailQueue mailQueue) throws MailQueueException {
         return builder()
-            .name(mailQueue.getName())
+            .name(mailQueue.getName().asString())
             .size(mailQueue.getSize())
             .build();
     }
diff --git a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/routes/MailQueueRoutes.java b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/routes/MailQueueRoutes.java
index 1764b6a..1bb138a 100644
--- a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/routes/MailQueueRoutes.java
+++ b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/routes/MailQueueRoutes.java
@@ -21,6 +21,7 @@ package org.apache.james.webadmin.routes;
 
 import static org.apache.james.webadmin.Constants.SEPARATOR;
 
+import java.io.Closeable;
 import java.io.IOException;
 import java.io.UncheckedIOException;
 import java.time.ZonedDateTime;
@@ -37,6 +38,7 @@ import org.apache.james.core.MailAddress;
 import org.apache.james.queue.api.MailQueue;
 import org.apache.james.queue.api.MailQueue.MailQueueException;
 import org.apache.james.queue.api.MailQueueFactory;
+import org.apache.james.queue.api.MailQueueName;
 import org.apache.james.queue.api.ManageableMailQueue;
 import org.apache.james.task.Task;
 import org.apache.james.task.TaskManager;
@@ -135,7 +137,10 @@ public class MailQueueRoutes implements Routes {
     })
     public void defineListQueues(Service service) {
         service.get(BASE_URL,
-            (request, response) -> mailQueueFactory.listCreatedMailQueues(),
+            (request, response) -> mailQueueFactory.listCreatedMailQueues()
+                .stream()
+                .map(MailQueueName::asString)
+                .collect(Guavate.toImmutableList()),
             jsonTransformer);
     }
 
@@ -160,7 +165,7 @@ public class MailQueueRoutes implements Routes {
     }
 
     private MailQueueDTO getMailQueue(Request request) {
-        String mailQueueName = request.params(MAIL_QUEUE_NAME);
+        MailQueueName mailQueueName = MailQueueName.of(request.params(MAIL_QUEUE_NAME));
         return mailQueueFactory.getQueue(mailQueueName).map(this::toDTO)
             .orElseThrow(
                 () -> ErrorResponder.builder()
@@ -219,7 +224,7 @@ public class MailQueueRoutes implements Routes {
     }
 
     private List<MailQueueItemDTO> listMails(Request request) {
-        String mailQueueName = request.params(MAIL_QUEUE_NAME);
+        MailQueueName mailQueueName = MailQueueName.of(request.params(MAIL_QUEUE_NAME));
         return mailQueueFactory.getQueue(mailQueueName)
                 .map(queue -> listMails(queue, isDelayed(request.queryParams(DELAYED_QUERY_PARAM)), ParametersExtractor.extractLimit(request)))
                 .orElseThrow(
@@ -303,7 +308,8 @@ public class MailQueueRoutes implements Routes {
     }
 
     private Task deleteMails(Request request) {
-        String mailQueueName = request.params(MAIL_QUEUE_NAME);
+        MailQueueName mailQueueName = MailQueueName.of(request.params(MAIL_QUEUE_NAME));
+        checkQueueExists(mailQueueName);
         return deleteMailsTask(mailQueueName,
                     sender(request.queryParams(SENDER_QUERY_PARAM)),
                     name(request.queryParams(NAME_QUERY_PARAM)),
@@ -385,7 +391,7 @@ public class MailQueueRoutes implements Routes {
     }
 
     private ManageableMailQueue assertMailQueueExists(Request request) {
-        String mailQueueName = request.params(MAIL_QUEUE_NAME);
+        MailQueueName mailQueueName = MailQueueName.of(request.params(MAIL_QUEUE_NAME));
         return mailQueueFactory.getQueue(mailQueueName)
             .orElseThrow(() -> ErrorResponder.builder()
                 .message("%s can not be found", mailQueueName)
@@ -415,13 +421,13 @@ public class MailQueueRoutes implements Routes {
         }
     }
 
-    private Task deleteMailsTask(String queueName, Optional<MailAddress> maybeSender, Optional<String> maybeName, Optional<MailAddress> maybeRecipient) {
+    private Task deleteMailsTask(MailQueueName queueName, Optional<MailAddress> maybeSender, Optional<String> maybeName, Optional<MailAddress> maybeRecipient) {
         int paramCount = Booleans.countTrue(maybeSender.isPresent(), maybeName.isPresent(), maybeRecipient.isPresent());
         switch (paramCount) {
             case 0:
-                return new ClearMailQueueTask(queueName, this::getQueueOrThrow);
+                return new ClearMailQueueTask(queueName, this::getQueue);
             case 1:
-                return new DeleteMailsFromMailQueueTask(queueName, this::getQueueOrThrow, maybeSender, maybeName, maybeRecipient);
+                return new DeleteMailsFromMailQueueTask(queueName, this::getQueue, maybeSender, maybeName, maybeRecipient);
             default:
                 throw ErrorResponder.builder()
                     .statusCode(HttpStatus.BAD_REQUEST_400)
@@ -432,14 +438,23 @@ public class MailQueueRoutes implements Routes {
         }
     }
 
-    private ManageableMailQueue getQueueOrThrow(String queueName) {
-        return mailQueueFactory.getQueue(queueName)
-            .orElseThrow(
-                () -> ErrorResponder.builder()
-                    .message("%s can not be found", queueName)
-                    .statusCode(HttpStatus.NOT_FOUND_404)
-                    .type(ErrorResponder.ErrorType.NOT_FOUND)
-                    .haltError());
+    private ManageableMailQueue getQueue(MailQueueName queueName) throws MailQueueException {
+        return mailQueueFactory.getQueue(queueName).orElseThrow(() -> new MailQueueException("unable to find queue " + queueName.asString()));
+    }
+
+    private ManageableMailQueue checkQueueExists(MailQueueName queueName) {
+        Optional<? extends ManageableMailQueue> queue = mailQueueFactory.getQueue(queueName);
+        try {
+            return queue
+                .orElseThrow(
+                    () -> ErrorResponder.builder()
+                        .message("%s can not be found", queueName)
+                        .statusCode(HttpStatus.NOT_FOUND_404)
+                        .type(ErrorResponder.ErrorType.NOT_FOUND)
+                        .haltError());
+        } finally {
+            queue.ifPresent(Throwing.consumer(Closeable::close));
+        }
     }
 
     private void assertDelayedParamIsTrue(Request request) {
diff --git a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/ClearMailQueueTask.java b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/ClearMailQueueTask.java
index ab9e25b..96a60be 100644
--- a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/ClearMailQueueTask.java
+++ b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/ClearMailQueueTask.java
@@ -25,10 +25,12 @@ import java.time.Instant;
 import java.util.Optional;
 
 import org.apache.james.queue.api.MailQueue;
+import org.apache.james.queue.api.MailQueueName;
 import org.apache.james.queue.api.ManageableMailQueue;
 import org.apache.james.task.Task;
 import org.apache.james.task.TaskExecutionDetails;
 import org.apache.james.task.TaskType;
+import org.apache.james.util.OptionalUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -38,12 +40,12 @@ public class ClearMailQueueTask implements Task {
 
     public static class AdditionalInformation implements TaskExecutionDetails.AdditionalInformation {
 
-        private final String mailQueueName;
+        private final MailQueueName mailQueueName;
         private final long initialCount;
         private final long remainingCount;
         private final Instant timestamp;
 
-        public AdditionalInformation(String mailQueueName, long initialCount, long remainingCount, Instant timestamp) {
+        public AdditionalInformation(MailQueueName mailQueueName, long initialCount, long remainingCount, Instant timestamp) {
             this.mailQueueName = mailQueueName;
             this.initialCount = initialCount;
             this.remainingCount = remainingCount;
@@ -51,7 +53,7 @@ public class ClearMailQueueTask implements Task {
         }
 
         public String getMailQueueName() {
-            return mailQueueName;
+            return mailQueueName.asString();
         }
 
         public long getInitialCount() {
@@ -78,22 +80,24 @@ public class ClearMailQueueTask implements Task {
 
     @FunctionalInterface
     public interface MailQueueFactory {
-        ManageableMailQueue create(String mailQueueName);
+        ManageableMailQueue create(MailQueueName mailQueueName) throws MailQueue.MailQueueException;
     }
 
     private static final Logger LOGGER = LoggerFactory.getLogger(ClearMailQueueTask.class);
     public static final TaskType TYPE = TaskType.of("clear-mail-queue");
 
-    private final String queueName;
+    private final MailQueueName queueName;
     private final ClearMailQueueTask.MailQueueFactory factory;
     private Optional<Long> initialCount;
     private Optional<ManageableMailQueue> queue;
+    private Optional<TaskExecutionDetails.AdditionalInformation> lastAdditionalInformation;
 
-    public ClearMailQueueTask(String queueName, ClearMailQueueTask.MailQueueFactory factory) {
+    public ClearMailQueueTask(MailQueueName queueName, ClearMailQueueTask.MailQueueFactory factory) {
         this.queueName = queueName;
         this.factory = factory;
         this.initialCount = Optional.empty();
         this.queue = Optional.empty();
+        this.lastAdditionalInformation = Optional.empty();
     }
 
     @Override
@@ -102,10 +106,12 @@ public class ClearMailQueueTask implements Task {
             this.initialCount = Optional.of(getRemainingSize(queue));
             this.queue = Optional.of(queue);
             queue.clear();
-            this.queue = Optional.empty();
+            this.lastAdditionalInformation = details();
         } catch (MailQueue.MailQueueException | IOException e) {
             LOGGER.error("Clear MailQueue got an exception", e);
             return Result.PARTIAL;
+        } finally {
+            this.queue = Optional.empty();
         }
 
         return Result.COMPLETED;
@@ -118,10 +124,13 @@ public class ClearMailQueueTask implements Task {
 
     @Override
     public Optional<TaskExecutionDetails.AdditionalInformation> details() {
-        return queue.map(q -> new AdditionalInformation(queueName, initialCount.get(), getRemainingSize(q), Clock.systemUTC().instant()));
+        return
+            OptionalUtils.orSuppliers(
+                () -> lastAdditionalInformation,
+                () -> queue.map(q -> new AdditionalInformation(queueName, initialCount.get(), getRemainingSize(q), Clock.systemUTC().instant())));
     }
 
-    String getQueueName() {
+    MailQueueName getQueueName() {
         return queueName;
     }
 
diff --git a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/ClearMailQueueTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/ClearMailQueueTaskAdditionalInformationDTO.java
index 94763a1..9cbc1e9 100644
--- a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/ClearMailQueueTaskAdditionalInformationDTO.java
+++ b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/ClearMailQueueTaskAdditionalInformationDTO.java
@@ -21,6 +21,7 @@ package org.apache.james.webadmin.service;
 import java.time.Instant;
 
 import org.apache.james.json.DTOModule;
+import org.apache.james.queue.api.MailQueueName;
 import org.apache.james.server.task.json.dto.AdditionalInformationDTO;
 import org.apache.james.server.task.json.dto.AdditionalInformationDTOModule;
 
@@ -32,7 +33,7 @@ public class ClearMailQueueTaskAdditionalInformationDTO implements AdditionalInf
         DTOModule.forDomainObject(ClearMailQueueTask.AdditionalInformation.class)
             .convertToDTO(ClearMailQueueTaskAdditionalInformationDTO.class)
             .toDomainObjectConverter(dto -> new ClearMailQueueTask.AdditionalInformation(
-                dto.mailQueueName,
+                MailQueueName.of(dto.mailQueueName),
                 dto.initialCount,
                 dto.remainingCount,
                 dto.timestamp
diff --git a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/ClearMailQueueTaskDTO.java b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/ClearMailQueueTaskDTO.java
index f4af298..295a0a0 100644
--- a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/ClearMailQueueTaskDTO.java
+++ b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/ClearMailQueueTaskDTO.java
@@ -20,6 +20,7 @@ package org.apache.james.webadmin.service;
 
 import org.apache.james.json.DTOModule;
 import org.apache.james.queue.api.MailQueueFactory;
+import org.apache.james.queue.api.MailQueueName;
 import org.apache.james.queue.api.ManageableMailQueue;
 import org.apache.james.server.task.json.dto.TaskDTO;
 import org.apache.james.server.task.json.dto.TaskDTOModule;
@@ -39,7 +40,7 @@ public class ClearMailQueueTaskDTO implements TaskDTO {
     }
 
     public static ClearMailQueueTaskDTO toDTO(ClearMailQueueTask domainObject, String typeName) {
-        return new ClearMailQueueTaskDTO(typeName, domainObject.getQueueName());
+        return new ClearMailQueueTaskDTO(typeName, domainObject.getQueueName().asString());
     }
 
     private final String type;
@@ -51,7 +52,7 @@ public class ClearMailQueueTaskDTO implements TaskDTO {
     }
 
     public ClearMailQueueTask fromDTO(MailQueueFactory<? extends ManageableMailQueue> mailQueueFactory) {
-        return new ClearMailQueueTask(queueName,
+        return new ClearMailQueueTask(MailQueueName.of(queueName),
             name -> mailQueueFactory
                 .getQueue(name)
                 .orElseThrow(() -> new ClearMailQueueTask.UnknownSerializedQueue(queueName)));
diff --git a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTask.java b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTask.java
index 0a1a184..a5abf75 100644
--- a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTask.java
+++ b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTask.java
@@ -20,17 +20,18 @@
 package org.apache.james.webadmin.service;
 
 import java.io.IOException;
-import java.io.UncheckedIOException;
 import java.time.Clock;
 import java.time.Instant;
 import java.util.Optional;
 
 import org.apache.james.core.MailAddress;
 import org.apache.james.queue.api.MailQueue;
+import org.apache.james.queue.api.MailQueueName;
 import org.apache.james.queue.api.ManageableMailQueue;
 import org.apache.james.task.Task;
 import org.apache.james.task.TaskExecutionDetails;
 import org.apache.james.task.TaskType;
+import org.apache.james.util.OptionalUtils;
 
 import com.github.fge.lambdas.Throwing;
 import com.google.common.base.Preconditions;
@@ -39,7 +40,7 @@ import com.google.common.primitives.Booleans;
 public class DeleteMailsFromMailQueueTask implements Task {
 
     public static class AdditionalInformation implements TaskExecutionDetails.AdditionalInformation {
-        private final String mailQueueName;
+        private final MailQueueName mailQueueName;
         private final long remainingCount;
         private final long initialCount;
 
@@ -48,7 +49,7 @@ public class DeleteMailsFromMailQueueTask implements Task {
         private final Optional<String> recipient;
         private final Instant timestamp;
 
-        public AdditionalInformation(String mailQueueName, long initialCount, long remainingCount,
+        public AdditionalInformation(MailQueueName mailQueueName, long initialCount, long remainingCount,
                                      Optional<MailAddress> maybeSender, Optional<String> maybeName,
                                      Optional<MailAddress> maybeRecipient, Instant timestamp) {
             this.mailQueueName = mailQueueName;
@@ -62,7 +63,7 @@ public class DeleteMailsFromMailQueueTask implements Task {
         }
 
         public String getMailQueueName() {
-            return mailQueueName;
+            return mailQueueName.asString();
         }
 
         public long getRemainingCount() {
@@ -99,7 +100,7 @@ public class DeleteMailsFromMailQueueTask implements Task {
 
     @FunctionalInterface
     public interface MailQueueFactory {
-        ManageableMailQueue create(String mailQueueName);
+        ManageableMailQueue create(MailQueueName mailQueueName) throws MailQueue.MailQueueException;
     }
 
     public static final TaskType TYPE = TaskType.of("delete-mails-from-mail-queue");
@@ -108,11 +109,12 @@ public class DeleteMailsFromMailQueueTask implements Task {
     private final Optional<String> maybeName;
     private final Optional<MailAddress> maybeRecipient;
     private final MailQueueFactory factory;
-    private final String queueName;
+    private final MailQueueName queueName;
     private Optional<Long> initialCount;
     private Optional<ManageableMailQueue> queue;
+    private Optional<TaskExecutionDetails.AdditionalInformation> lastAdditionalInformation;
 
-    public DeleteMailsFromMailQueueTask(String queueName, MailQueueFactory factory,
+    public DeleteMailsFromMailQueueTask(MailQueueName queueName, MailQueueFactory factory,
                                         Optional<MailAddress> maybeSender,
                                         Optional<String> maybeName, Optional<MailAddress> maybeRecipient) {
         this.factory = factory;
@@ -126,6 +128,7 @@ public class DeleteMailsFromMailQueueTask implements Task {
         this.maybeRecipient = maybeRecipient;
         this.initialCount = Optional.empty();
         this.queue = Optional.empty();
+        this.lastAdditionalInformation = Optional.empty();
 
     }
 
@@ -141,15 +144,18 @@ public class DeleteMailsFromMailQueueTask implements Task {
             maybeRecipient.ifPresent(Throwing.consumer(
                 (MailAddress recipient) -> queue.remove(ManageableMailQueue.Type.Recipient, recipient.asString())));
 
-            this.queue = Optional.empty();
+            this.lastAdditionalInformation = details();
 
             return Result.COMPLETED;
-        } catch (IOException e) {
-            throw new UncheckedIOException(e);
+        } catch (IOException | MailQueue.MailQueueException e) {
+            LOGGER.error("Delete mails from MailQueue got an exception", e);
+            return Result.PARTIAL;
+        } finally {
+            this.queue = Optional.empty();
         }
     }
 
-    public String getQueueName() {
+    public MailQueueName getQueueName() {
         return queueName;
     }
 
@@ -172,10 +178,14 @@ public class DeleteMailsFromMailQueueTask implements Task {
 
     @Override
     public Optional<TaskExecutionDetails.AdditionalInformation> details() {
-        return this.queue.map(queue -> new AdditionalInformation(queueName,
-            initialCount.get(),
-            getRemainingSize(queue), maybeSender,
-            maybeName, maybeRecipient, Clock.systemUTC().instant()));
+        return OptionalUtils.orSuppliers(
+            () -> this.lastAdditionalInformation,
+            () -> this.queue.map(queue ->
+                new AdditionalInformation(
+                    queueName,
+                    initialCount.get(),
+                    getRemainingSize(queue), maybeSender,
+                    maybeName, maybeRecipient, Clock.systemUTC().instant())));
     }
 
     public long getRemainingSize(ManageableMailQueue queue) {
diff --git a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTaskAdditionalInformationDTO.java
index f4c2928..a35c65f 100644
--- a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTaskAdditionalInformationDTO.java
+++ b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTaskAdditionalInformationDTO.java
@@ -5,6 +5,7 @@ import java.util.Optional;
 
 import org.apache.james.core.MailAddress;
 import org.apache.james.json.DTOModule;
+import org.apache.james.queue.api.MailQueueName;
 import org.apache.james.server.task.json.dto.AdditionalInformationDTO;
 import org.apache.james.server.task.json.dto.AdditionalInformationDTOModule;
 
@@ -36,7 +37,7 @@ public class DeleteMailsFromMailQueueTaskAdditionalInformationDTO implements Add
 
     private static DeleteMailsFromMailQueueTask.AdditionalInformation fromDTO(DeleteMailsFromMailQueueTaskAdditionalInformationDTO dto) {
         return new DeleteMailsFromMailQueueTask.AdditionalInformation(
-            dto.getQueue(),
+            MailQueueName.of(dto.getQueue()),
             dto.getInitialCount(),
             dto.getRemainingCount(),
             dto.sender.map(Throwing.<String, MailAddress>function(MailAddress::new).sneakyThrow()),
diff --git a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTaskDTO.java b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTaskDTO.java
index 12f3485..fc30ab9 100644
--- a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTaskDTO.java
+++ b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTaskDTO.java
@@ -5,6 +5,7 @@ import java.util.Optional;
 import org.apache.james.core.MailAddress;
 import org.apache.james.json.DTOModule;
 import org.apache.james.queue.api.MailQueueFactory;
+import org.apache.james.queue.api.MailQueueName;
 import org.apache.james.queue.api.ManageableMailQueue;
 import org.apache.james.server.task.json.dto.TaskDTO;
 import org.apache.james.server.task.json.dto.TaskDTOModule;
@@ -27,7 +28,7 @@ public class DeleteMailsFromMailQueueTaskDTO implements TaskDTO {
     public static DeleteMailsFromMailQueueTaskDTO toDTO(DeleteMailsFromMailQueueTask domainObject, String typeName) {
         return new DeleteMailsFromMailQueueTaskDTO(
             typeName,
-            domainObject.getQueueName(),
+            domainObject.getQueueName().asString(),
             domainObject.getMaybeSender().map(MailAddress::asString),
             domainObject.getMaybeName(),
             domainObject.getMaybeRecipient().map(MailAddress::asString)
@@ -54,7 +55,7 @@ public class DeleteMailsFromMailQueueTaskDTO implements TaskDTO {
 
     public DeleteMailsFromMailQueueTask fromDTO(MailQueueFactory<? extends ManageableMailQueue> mailQueueFactory) {
         return new DeleteMailsFromMailQueueTask(
-            queueName, name -> mailQueueFactory.getQueue(name).orElseThrow(() -> new DeleteMailsFromMailQueueTask.UnknownSerializedQueue(queueName)),
+            MailQueueName.of(queueName), name -> mailQueueFactory.getQueue(name).orElseThrow(() -> new DeleteMailsFromMailQueueTask.UnknownSerializedQueue(queueName)),
             sender.map(Throwing.<String, MailAddress>function(MailAddress::new).sneakyThrow()),
             name,
             recipient.map(Throwing.<String, MailAddress>function(MailAddress::new).sneakyThrow())
diff --git a/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/routes/MailQueueRoutesTest.java b/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/routes/MailQueueRoutesTest.java
index f40f1ac..6ba4b07 100644
--- a/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/routes/MailQueueRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/routes/MailQueueRoutesTest.java
@@ -38,6 +38,7 @@ import java.util.List;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.james.core.MailAddress;
+import org.apache.james.queue.api.MailQueueName;
 import org.apache.james.queue.api.Mails;
 import org.apache.james.queue.api.ManageableMailQueue;
 import org.apache.james.queue.api.RawMailQueueItemDecoratorFactory;
@@ -67,10 +68,10 @@ import io.restassured.specification.RequestSpecification;
 
 class MailQueueRoutesTest {
 
-    static final String FIRST_QUEUE = "first one";
-    static final String SECOND_QUEUE = "second one";
-    static final String THIRD_QUEUE = "third one";
-    static final String FOURTH_QUEUE = "fourth one";
+    static final MailQueueName FIRST_QUEUE = MailQueueName.of("first one");
+    static final MailQueueName SECOND_QUEUE = MailQueueName.of("second one");
+    static final MailQueueName THIRD_QUEUE = MailQueueName.of("third one");
+    static final MailQueueName FOURTH_QUEUE = MailQueueName.of("fourth one");
     static final String SENDER_1_JAMES_ORG = "sender1@james.org";
     static final String SENDER_2_JAMES_ORG = "sender2@james.org";
     static final String RECIPIENT_JAMES_ORG = "recipient@james.org";
@@ -129,7 +130,7 @@ class MailQueueRoutesTest {
                 given()
                     .param("limit", "-1")
                 .when()
-                    .get(FIRST_QUEUE + "/mails")
+                    .get(FIRST_QUEUE.asString() + "/mails")
                 .then()
                     .statusCode(HttpStatus.BAD_REQUEST_400);
             }
@@ -141,7 +142,7 @@ class MailQueueRoutesTest {
                 given()
                     .param("limit", "0")
                 .when()
-                    .get(FIRST_QUEUE + "/mails")
+                    .get(FIRST_QUEUE.asString() + "/mails")
                 .then()
                     .statusCode(HttpStatus.BAD_REQUEST_400);
             }
@@ -153,7 +154,7 @@ class MailQueueRoutesTest {
                 given()
                     .param("limit", "abc")
                 .when()
-                    .get(FIRST_QUEUE + "/mails")
+                    .get(FIRST_QUEUE.asString() + "/mails")
                 .then()
                     .statusCode(HttpStatus.BAD_REQUEST_400);
             }
@@ -191,7 +192,7 @@ class MailQueueRoutesTest {
                     .jsonPath()
                     .getList(".");
 
-                assertThat(actual).containsOnly(FIRST_QUEUE);
+                assertThat(actual).containsOnly(FIRST_QUEUE.asString());
             }
 
             @Test
@@ -211,7 +212,12 @@ class MailQueueRoutesTest {
                     .jsonPath()
                     .getList(".");
 
-                assertThat(actual).containsOnly(FIRST_QUEUE, SECOND_QUEUE, THIRD_QUEUE, FOURTH_QUEUE);
+                assertThat(actual)
+                    .containsOnly(
+                        FIRST_QUEUE.asString(),
+                        SECOND_QUEUE.asString(),
+                        THIRD_QUEUE.asString(),
+                        FOURTH_QUEUE.asString());
             }
 
             @Test
@@ -219,7 +225,7 @@ class MailQueueRoutesTest {
                 mailQueueFactory.createQueue(FIRST_QUEUE);
 
                 when()
-                    .get(FIRST_QUEUE + "/mails")
+                    .get(FIRST_QUEUE.asString() + "/mails")
                 .then()
                     .statusCode(HttpStatus.OK_200)
                     .contentType(ContentType.JSON)
@@ -233,7 +239,7 @@ class MailQueueRoutesTest {
                 queue.enQueue(Mails.defaultMail().name("name").build());
 
                 when()
-                    .get(FIRST_QUEUE + "/mails")
+                    .get(FIRST_QUEUE.asString() + "/mails")
                 .then()
                     .statusCode(HttpStatus.OK_200)
                     .contentType(ContentType.JSON)
@@ -252,7 +258,7 @@ class MailQueueRoutesTest {
                         .collect(Guavate.toImmutableList());
 
                 when()
-                    .get(FIRST_QUEUE + "/mails")
+                    .get(FIRST_QUEUE.asString() + "/mails")
                 .then()
                     .statusCode(HttpStatus.OK_200)
                     .contentType(ContentType.JSON)
@@ -271,7 +277,7 @@ class MailQueueRoutesTest {
                 given()
                     .param("delayed", "true")
                 .when()
-                    .get(FIRST_QUEUE + "/mails")
+                    .get(FIRST_QUEUE.asString() + "/mails")
                 .then()
                     .statusCode(HttpStatus.OK_200)
                     .contentType(ContentType.JSON)
@@ -287,7 +293,7 @@ class MailQueueRoutesTest {
                 given()
                     .param("delayed", "false")
                 .when()
-                    .get(FIRST_QUEUE + "/mails")
+                    .get(FIRST_QUEUE.asString() + "/mails")
                 .then()
                     .statusCode(HttpStatus.OK_200)
                     .contentType(ContentType.JSON)
@@ -303,7 +309,7 @@ class MailQueueRoutesTest {
                 given()
                     .param("delayed", "true")
                 .when()
-                    .get(FIRST_QUEUE + "/mails")
+                    .get(FIRST_QUEUE.asString() + "/mails")
                 .then()
                     .statusCode(HttpStatus.OK_200)
                     .contentType(ContentType.JSON)
@@ -321,7 +327,7 @@ class MailQueueRoutesTest {
                 given()
                     .param("limit", "1")
                 .when()
-                    .get(FIRST_QUEUE + "/mails")
+                    .get(FIRST_QUEUE.asString() + "/mails")
                 .then()
                     .statusCode(HttpStatus.OK_200)
                     .contentType(ContentType.JSON)
@@ -339,17 +345,17 @@ class MailQueueRoutesTest {
             queue.enQueue(Mails.defaultMail().name("name").build());
 
             when()
-                .get(FIRST_QUEUE)
+                .get(FIRST_QUEUE.asString())
             .then()
                 .statusCode(HttpStatus.OK_200)
-                .body("name", equalTo(FIRST_QUEUE))
+                .body("name", equalTo(FIRST_QUEUE.asString()))
                 .body("size", equalTo(1));
         }
 
         @Test
         void getMailQueueShouldReturnNotFoundWhenMailQueueDoesntExist() {
             when()
-                .get(FIRST_QUEUE)
+                .get(FIRST_QUEUE.asString())
             .then()
                 .statusCode(HttpStatus.NOT_FOUND_404);
         }
@@ -369,7 +375,7 @@ class MailQueueRoutesTest {
                     .queryParam("delayed", "true")
                     .body("{\"delayed\": \"false\"}")
                 .when()
-                    .patch(FIRST_QUEUE + "/mails")
+                    .patch(FIRST_QUEUE.asString() + "/mails")
                     .then()
                     .statusCode(HttpStatus.NO_CONTENT_204);
             }
@@ -392,7 +398,7 @@ class MailQueueRoutesTest {
                 given()
                     .body("{\"delayed\": \"false\"}")
                 .when()
-                    .patch(FIRST_QUEUE + "/mails")
+                    .patch(FIRST_QUEUE.asString() + "/mails")
                 .then()
                     .statusCode(HttpStatus.BAD_REQUEST_400);
             }
@@ -405,7 +411,7 @@ class MailQueueRoutesTest {
                     .queryParam("delayed", "false")
                     .body("{\"delayed\": \"false\"}")
                 .when()
-                    .patch(FIRST_QUEUE + "/mails")
+                    .patch(FIRST_QUEUE.asString() + "/mails")
                 .then()
                     .statusCode(HttpStatus.BAD_REQUEST_400);
             }
@@ -418,7 +424,7 @@ class MailQueueRoutesTest {
                     .queryParam("delayed", "wrong")
                     .body("{\"delayed\": \"false\"}")
                 .when()
-                    .patch(FIRST_QUEUE + "/mails")
+                    .patch(FIRST_QUEUE.asString() + "/mails")
                 .then()
                     .statusCode(HttpStatus.BAD_REQUEST_400);
             }
@@ -430,7 +436,7 @@ class MailQueueRoutesTest {
                 given()
                     .queryParam("delayed", "true")
                 .when()
-                    .patch(FIRST_QUEUE + "/mails")
+                    .patch(FIRST_QUEUE.asString() + "/mails")
                 .then()
                     .statusCode(HttpStatus.BAD_REQUEST_400);
             }
@@ -443,7 +449,7 @@ class MailQueueRoutesTest {
                     .queryParam("delayed", "true")
                     .body("{\"xx\": \"false\"}")
                 .when()
-                    .patch(FIRST_QUEUE + "/mails")
+                    .patch(FIRST_QUEUE.asString() + "/mails")
                 .then()
                     .statusCode(HttpStatus.BAD_REQUEST_400);
             }
@@ -459,7 +465,7 @@ class MailQueueRoutesTest {
                         "\"delayed\": \"false\"" +
                         "}")
                 .when()
-                    .patch(FIRST_QUEUE + "/mails")
+                    .patch(FIRST_QUEUE.asString() + "/mails")
                 .then()
                     .statusCode(HttpStatus.BAD_REQUEST_400);
             }
@@ -472,7 +478,7 @@ class MailQueueRoutesTest {
                     .queryParam("delayed", "true")
                     .body("{\"xx\":")
                 .when()
-                    .patch(FIRST_QUEUE + "/mails")
+                    .patch(FIRST_QUEUE.asString() + "/mails")
                 .then()
                     .statusCode(HttpStatus.BAD_REQUEST_400);
             }
@@ -485,7 +491,7 @@ class MailQueueRoutesTest {
                     .queryParam("delayed", "false")
                     .body("{\"delayed\": \"true\"}")
                 .when()
-                    .patch(FIRST_QUEUE + "/mails")
+                    .patch(FIRST_QUEUE.asString() + "/mails")
                 .then()
                     .statusCode(HttpStatus.BAD_REQUEST_400);
             }
@@ -498,7 +504,7 @@ class MailQueueRoutesTest {
                     .queryParam("delayed", "false")
                     .body("{\"delayed\": \"string\"}")
                 .when()
-                    .patch(FIRST_QUEUE + "/mails")
+                    .patch(FIRST_QUEUE.asString() + "/mails")
                 .then()
                     .statusCode(HttpStatus.BAD_REQUEST_400);
             }
@@ -518,7 +524,7 @@ class MailQueueRoutesTest {
                     .queryParam("delayed", "true")
                     .body("{\"delayed\": \"false\"}")
                 .when()
-                    .patch(FIRST_QUEUE + "/mails");
+                    .patch(FIRST_QUEUE.asString() + "/mails");
 
                 assertThat(queue.browse())
                     .toIterable()
@@ -541,7 +547,7 @@ class MailQueueRoutesTest {
             @Test
             void deleteMailsShouldReturnNotFoundWhenMailQueueDoesntExist() {
                 when()
-                    .delete(FIRST_QUEUE + "/mails")
+                    .delete(FIRST_QUEUE.asString() + "/mails")
                 .then()
                     .statusCode(HttpStatus.NOT_FOUND_404);
             }
@@ -553,7 +559,7 @@ class MailQueueRoutesTest {
                 given()
                     .param("sender", "123")
                 .when()
-                    .delete(FIRST_QUEUE + "/mails")
+                    .delete(FIRST_QUEUE.asString() + "/mails")
                 .then()
                     .statusCode(HttpStatus.BAD_REQUEST_400);
             }
@@ -565,7 +571,7 @@ class MailQueueRoutesTest {
                 given()
                     .param("recipient", "123")
                 .when()
-                    .delete(FIRST_QUEUE + "/mails")
+                    .delete(FIRST_QUEUE.asString() + "/mails")
                 .then()
                     .statusCode(HttpStatus.BAD_REQUEST_400);
             }
@@ -578,7 +584,7 @@ class MailQueueRoutesTest {
                     .param("name", "mailName")
                     .param("recipient", "recipient@james.org")
                 .when()
-                    .delete(FIRST_QUEUE + "/mails")
+                    .delete(FIRST_QUEUE.asString() + "/mails")
                  .then()
                     .statusCode(HttpStatus.BAD_REQUEST_400);
             }
@@ -590,7 +596,7 @@ class MailQueueRoutesTest {
                     .param("sender", "sender@james.org")
                     .param("name", "mailName")
                 .when()
-                    .delete(FIRST_QUEUE + "/mails")
+                    .delete(FIRST_QUEUE.asString() + "/mails")
                 .then()
                     .statusCode(HttpStatus.BAD_REQUEST_400);
             }
@@ -605,7 +611,7 @@ class MailQueueRoutesTest {
 
                 String taskId = with()
                     .param("sender", SENDER_1_JAMES_ORG)
-                .delete(FIRST_QUEUE + "/mails")
+                .delete(FIRST_QUEUE.asString() + "/mails")
                     .jsonPath()
                     .getString("taskId");
 
@@ -623,7 +629,7 @@ class MailQueueRoutesTest {
 
                 String taskId = with()
                     .param("name", "mailName")
-                .delete(FIRST_QUEUE + "/mails")
+                .delete(FIRST_QUEUE.asString() + "/mails")
                     .jsonPath()
                     .getString("taskId");
 
@@ -641,7 +647,7 @@ class MailQueueRoutesTest {
 
                 String taskId = with()
                     .param("recipient", RECIPIENT_JAMES_ORG)
-                .delete(FIRST_QUEUE + "/mails")
+                .delete(FIRST_QUEUE.asString() + "/mails")
                     .jsonPath()
                     .getString("taskId");
 
@@ -669,7 +675,7 @@ class MailQueueRoutesTest {
 
                 String taskId = with()
                     .param("sender", SENDER_1_JAMES_ORG)
-                .delete(FIRST_QUEUE + "/mails")
+                .delete(FIRST_QUEUE.asString() + "/mails")
                     .jsonPath()
                     .getString("taskId");
 
@@ -681,7 +687,7 @@ class MailQueueRoutesTest {
                     .body("status", is("completed"))
                     .body("taskId", is(notNullValue()))
                     .body("type", is(DeleteMailsFromMailQueueTask.TYPE.asString()))
-                    .body("additionalInformation.mailQueueName", is(FIRST_QUEUE))
+                    .body("additionalInformation.mailQueueName", is(FIRST_QUEUE.asString()))
                     .body("additionalInformation.initialCount", is(2))
                     .body("additionalInformation.remainingCount", is(1))
                     .body("additionalInformation.sender", is(SENDER_1_JAMES_ORG))
@@ -704,7 +710,7 @@ class MailQueueRoutesTest {
 
                 String taskId = with()
                     .param("name", FAKE_MAIL_NAME_1)
-                .delete(FIRST_QUEUE + "/mails")
+                .delete(FIRST_QUEUE.asString() + "/mails")
                     .jsonPath()
                     .getString("taskId");
 
@@ -716,7 +722,7 @@ class MailQueueRoutesTest {
                     .body("status", is("completed"))
                     .body("taskId", is(notNullValue()))
                     .body("type", is(DeleteMailsFromMailQueueTask.TYPE.asString()))
-                    .body("additionalInformation.mailQueueName", is(FIRST_QUEUE))
+                    .body("additionalInformation.mailQueueName", is(FIRST_QUEUE.asString()))
                     .body("additionalInformation.initialCount", is(2))
                     .body("additionalInformation.remainingCount", is(1))
                     .body("additionalInformation.name", is(FAKE_MAIL_NAME_1))
@@ -746,7 +752,7 @@ class MailQueueRoutesTest {
 
                 String taskId = with()
                     .param("recipient", RECIPIENT_JAMES_ORG)
-                .delete(FIRST_QUEUE + "/mails")
+                .delete(FIRST_QUEUE.asString() + "/mails")
                     .jsonPath()
                     .getString("taskId");
 
@@ -758,7 +764,7 @@ class MailQueueRoutesTest {
                     .body("status", is("completed"))
                     .body("taskId", is(notNullValue()))
                     .body("type", is(DeleteMailsFromMailQueueTask.TYPE.asString()))
-                    .body("additionalInformation.mailQueueName", is(FIRST_QUEUE))
+                    .body("additionalInformation.mailQueueName", is(FIRST_QUEUE.asString()))
                     .body("additionalInformation.initialCount", is(3))
                     .body("additionalInformation.remainingCount", is(1))
                     .body("additionalInformation.recipient", is(RECIPIENT_JAMES_ORG))
@@ -787,7 +793,7 @@ class MailQueueRoutesTest {
 
                 String taskId = with()
                     .param("sender", SENDER_1_JAMES_ORG)
-                .delete(FIRST_QUEUE + "/mails")
+                .delete(FIRST_QUEUE.asString() + "/mails")
                     .jsonPath()
                     .getString("taskId");
 
@@ -819,7 +825,7 @@ class MailQueueRoutesTest {
 
                 String taskId = with()
                     .param("name", FAKE_MAIL_NAME_1)
-                .delete(FIRST_QUEUE + "/mails")
+                .delete(FIRST_QUEUE.asString() + "/mails")
                     .jsonPath()
                     .getString("taskId");
 
@@ -858,7 +864,7 @@ class MailQueueRoutesTest {
 
                 String taskId = with()
                     .param("recipient", RECIPIENT_JAMES_ORG)
-                .delete(FIRST_QUEUE + "/mails")
+                .delete(FIRST_QUEUE.asString() + "/mails")
                     .jsonPath()
                     .getString("taskId");
 
@@ -890,7 +896,7 @@ class MailQueueRoutesTest {
 
                 String taskId = with()
                     .param("recipient", recipient)
-                .delete(FIRST_QUEUE + "/mails")
+                .delete(FIRST_QUEUE.asString() + "/mails")
                     .jsonPath()
                     .getString("taskId");
 
@@ -920,7 +926,7 @@ class MailQueueRoutesTest {
             mailQueueFactory.createQueue(FIRST_QUEUE);
 
             when()
-                .delete(SECOND_QUEUE + "/mails")
+                .delete(SECOND_QUEUE.asString() + "/mails")
             .then()
                 .statusCode(HttpStatus.NOT_FOUND_404);
         }
@@ -930,7 +936,7 @@ class MailQueueRoutesTest {
             mailQueueFactory.createQueue(FIRST_QUEUE);
 
             String taskId = with()
-                .delete(FIRST_QUEUE + "/mails")
+                .delete(FIRST_QUEUE.asString() + "/mails")
                 .jsonPath()
                 .getString("taskId");
 
@@ -959,7 +965,7 @@ class MailQueueRoutesTest {
                 .build());
 
             String taskId = with()
-                .delete(FIRST_QUEUE + "/mails")
+                .delete(FIRST_QUEUE.asString() + "/mails")
                 .jsonPath()
                 .getString("taskId");
 
@@ -971,7 +977,7 @@ class MailQueueRoutesTest {
                 .body("status", is("completed"))
                 .body("taskId", is(notNullValue()))
                 .body("type", is(ClearMailQueueTask.TYPE.asString()))
-                .body("additionalInformation.mailQueueName", is(FIRST_QUEUE))
+                .body("additionalInformation.mailQueueName", is(FIRST_QUEUE.asString()))
                 .body("additionalInformation.initialCount", is(3))
                 .body("additionalInformation.remainingCount", is(0))
                 .body("startedDate", is(notNullValue()))
@@ -996,7 +1002,7 @@ class MailQueueRoutesTest {
                 .build());
 
             String taskId = with()
-                .delete(FIRST_QUEUE + "/mails")
+                .delete(FIRST_QUEUE.asString() + "/mails")
                 .jsonPath()
                 .getString("taskId");
 
diff --git a/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/service/ClearMailQueueTaskTest.java b/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/service/ClearMailQueueTaskTest.java
index 94b4432..c78a4c4 100644
--- a/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/service/ClearMailQueueTaskTest.java
+++ b/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/service/ClearMailQueueTaskTest.java
@@ -19,7 +19,7 @@ package org.apache.james.webadmin.service;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
-import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
@@ -28,6 +28,7 @@ import java.util.Optional;
 
 import org.apache.james.JsonSerializationVerifier;
 import org.apache.james.queue.api.MailQueueFactory;
+import org.apache.james.queue.api.MailQueueName;
 import org.apache.james.queue.api.ManageableMailQueue;
 import org.apache.james.server.task.json.JsonTaskSerializer;
 import org.junit.jupiter.api.Test;
@@ -35,7 +36,7 @@ import org.junit.jupiter.api.Test;
 class ClearMailQueueTaskTest {
     private static final Instant TIMESTAMP = Instant.parse("2018-11-13T12:00:55Z");
     private static final String SERIALIZED = "{\"type\": \"clear-mail-queue\", \"queue\": \"anyQueue\"}";
-    private static final String QUEUE_NAME = "anyQueue";
+    private static final MailQueueName QUEUE_NAME = MailQueueName.of("anyQueue");
     private static final long INITIAL_COUNT = 0L;
     private static final long REMAINING_COUNT = 10L;
     private static final String SERIALIZED_TASK_ADDITIONAL_INFORMATION = "{\"type\": \"clear-mail-queue\", \"mailQueueName\":\"anyQueue\",\"initialCount\":0,\"remainingCount\":10, \"timestamp\":\"2018-11-13T12:00:55Z\"}";
@@ -45,7 +46,7 @@ class ClearMailQueueTaskTest {
         MailQueueFactory<ManageableMailQueue> mailQueueFactory = mock(MailQueueFactory.class);
         ManageableMailQueue mockedQueue = mock(ManageableMailQueue.class);
         when(mockedQueue.getName()).thenReturn(QUEUE_NAME);
-        when(mailQueueFactory.getQueue(anyString())).thenAnswer(arg -> Optional.of(mockedQueue));
+        when(mailQueueFactory.getQueue(any(MailQueueName.class))).thenAnswer(arg -> Optional.of(mockedQueue));
 
         ClearMailQueueTask.MailQueueFactory factory = queueName -> mailQueueFactory.getQueue(queueName).orElseThrow(RuntimeException::new);
         ClearMailQueueTask task = new ClearMailQueueTask(QUEUE_NAME, factory);
@@ -60,7 +61,7 @@ class ClearMailQueueTaskTest {
     @Test
     void taskShouldThrowWhenRunOnAnUnknownQueue() {
         MailQueueFactory<ManageableMailQueue> mailQueueFactory = mock(MailQueueFactory.class);
-        when(mailQueueFactory.getQueue(anyString())).thenReturn(Optional.empty());
+        when(mailQueueFactory.getQueue(any(MailQueueName.class))).thenReturn(Optional.empty());
         JsonTaskSerializer testee = JsonTaskSerializer.of(ClearMailQueueTaskDTO.module(mailQueueFactory));
 
         String serializedJson = "{\"type\": \"clear-mail-queue\", \"queue\": \"anyQueue\"}";
diff --git a/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTaskTest.java b/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTaskTest.java
index 6e44829..eb2b79c 100644
--- a/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTaskTest.java
+++ b/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/service/DeleteMailsFromMailQueueTaskTest.java
@@ -19,6 +19,7 @@ package org.apache.james.webadmin.service;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
@@ -31,6 +32,7 @@ import javax.mail.internet.AddressException;
 import org.apache.james.JsonSerializationVerifier;
 import org.apache.james.core.MailAddress;
 import org.apache.james.queue.api.MailQueueFactory;
+import org.apache.james.queue.api.MailQueueName;
 import org.apache.james.queue.api.ManageableMailQueue;
 import org.apache.james.server.task.json.JsonTaskAdditionalInformationSerializer;
 import org.apache.james.server.task.json.JsonTaskSerializer;
@@ -42,14 +44,14 @@ class DeleteMailsFromMailQueueTaskTest {
 
     private MailQueueFactory<ManageableMailQueue> mailQueueFactory;
     private ManageableMailQueue mockedQueue;
-    private final static String queueName = "anyQueue";
+    private final static MailQueueName queueName = MailQueueName.of("anyQueue");
 
     @BeforeEach
     void setUp() {
         mailQueueFactory = mock(MailQueueFactory.class);
         mockedQueue = mock(ManageableMailQueue.class);
         when(mockedQueue.getName()).thenReturn(queueName);
-        when(mailQueueFactory.getQueue(anyString())).thenAnswer(arg -> Optional.of(mockedQueue));
+        when(mailQueueFactory.getQueue(any(MailQueueName.class))).thenAnswer(arg -> Optional.of(mockedQueue));
     }
 
     @Test
@@ -75,7 +77,7 @@ class DeleteMailsFromMailQueueTaskTest {
     @Test
     void taskShouldThrowWhenRunOnAnUnknownQueue() {
         MailQueueFactory<ManageableMailQueue> mailQueueFactory = mock(MailQueueFactory.class);
-        when(mailQueueFactory.getQueue(anyString())).thenReturn(Optional.empty());
+        when(mailQueueFactory.getQueue(any(MailQueueName.class))).thenReturn(Optional.empty());
         JsonTaskSerializer testee = JsonTaskSerializer.of(DeleteMailsFromMailQueueTaskDTO.module(mailQueueFactory));
 
         String serializedJson = "{\"type\": \"delete-mails-from-mail-queue\", \"queue\": \"anyQueue\", \"sender\": \"a@b.c\"}";
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/routes/MailRepositoriesRoutes.java b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/routes/MailRepositoriesRoutes.java
index 6a070a8..85b3b6d 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/routes/MailRepositoriesRoutes.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/routes/MailRepositoriesRoutes.java
@@ -42,6 +42,7 @@ import org.apache.james.mailrepository.api.MailKey;
 import org.apache.james.mailrepository.api.MailRepositoryPath;
 import org.apache.james.mailrepository.api.MailRepositoryStore;
 import org.apache.james.queue.api.MailQueueFactory;
+import org.apache.james.queue.api.MailQueueName;
 import org.apache.james.task.Task;
 import org.apache.james.task.TaskManager;
 import org.apache.james.util.streams.Limit;
@@ -453,7 +454,7 @@ public class MailRepositoriesRoutes implements Routes {
     private Task reprocessAll(Request request) throws UnsupportedEncodingException, MailRepositoryStore.MailRepositoryStoreException {
         MailRepositoryPath path = decodedRepositoryPath(request);
         Optional<String> targetProcessor = parseTargetProcessor(request);
-        String targetQueue = parseTargetQueue(request);
+        MailQueueName targetQueue = parseTargetQueue(request);
 
         Long repositorySize = repositoryStoreService.size(path).orElse(0L);
         return new ReprocessingAllMailsTask(reprocessingService, repositorySize, path, targetQueue, targetProcessor);
@@ -505,7 +506,7 @@ public class MailRepositoriesRoutes implements Routes {
         MailKey key = new MailKey(request.params("key"));
 
         Optional<String> targetProcessor = parseTargetProcessor(request);
-        String targetQueue = parseTargetQueue(request);
+        MailQueueName targetQueue = parseTargetQueue(request);
 
         return new ReprocessingOneMailTask(reprocessingService, path, targetQueue, key, targetProcessor, Clock.systemUTC());
     }
@@ -525,8 +526,10 @@ public class MailRepositoriesRoutes implements Routes {
         return Optional.ofNullable(request.queryParams("processor"));
     }
 
-    private String parseTargetQueue(Request request) {
-        return Optional.ofNullable(request.queryParams("queue")).orElse(MailQueueFactory.SPOOL);
+    private MailQueueName parseTargetQueue(Request request) {
+        return Optional.ofNullable(request.queryParams("queue"))
+            .map(MailQueueName::of)
+            .orElse(MailQueueFactory.SPOOL);
     }
 
     private MailRepositoryPath decodedRepositoryPath(Request request) throws UnsupportedEncodingException {
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingAllMailsTask.java b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingAllMailsTask.java
index 1fa8d43..5d8ea39 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingAllMailsTask.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingAllMailsTask.java
@@ -29,6 +29,7 @@ import javax.mail.MessagingException;
 import org.apache.james.mailrepository.api.MailKey;
 import org.apache.james.mailrepository.api.MailRepositoryPath;
 import org.apache.james.mailrepository.api.MailRepositoryStore;
+import org.apache.james.queue.api.MailQueueName;
 import org.apache.james.task.Task;
 import org.apache.james.task.TaskExecutionDetails;
 import org.apache.james.task.TaskType;
@@ -45,9 +46,9 @@ public class ReprocessingAllMailsTask implements Task {
         private final long remainingCount;
         private final Instant timestamp;
 
-        public AdditionalInformation(MailRepositoryPath repositoryPath, String targetQueue, Optional<String> targetProcessor, long initialCount, long remainingCount, Instant timestamp) {
+        public AdditionalInformation(MailRepositoryPath repositoryPath, MailQueueName targetQueue, Optional<String> targetProcessor, long initialCount, long remainingCount, Instant timestamp) {
             this.repositoryPath = repositoryPath;
-            this.targetQueue = targetQueue;
+            this.targetQueue = targetQueue.asString();
             this.targetProcessor = targetProcessor;
             this.initialCount = initialCount;
             this.remainingCount = remainingCount;
@@ -96,13 +97,13 @@ public class ReprocessingAllMailsTask implements Task {
 
     private final ReprocessingService reprocessingService;
     private final MailRepositoryPath repositoryPath;
-    private final String targetQueue;
+    private final MailQueueName targetQueue;
     private final Optional<String> targetProcessor;
     private final long repositorySize;
     private final AtomicLong processedCount;
 
     public ReprocessingAllMailsTask(ReprocessingService reprocessingService, long repositorySize,
-                                    MailRepositoryPath repositoryPath, String targetQueue, Optional<String> targetProcessor) {
+                                    MailRepositoryPath repositoryPath, MailQueueName targetQueue, Optional<String> targetProcessor) {
         this.reprocessingService = reprocessingService;
         this.repositoryPath = repositoryPath;
         this.targetQueue = targetQueue;
@@ -138,7 +139,7 @@ public class ReprocessingAllMailsTask implements Task {
         return targetProcessor;
     }
 
-    String getTargetQueue() {
+    MailQueueName getTargetQueue() {
         return targetQueue;
     }
 
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingAllMailsTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingAllMailsTaskAdditionalInformationDTO.java
index 15b8cee..ee821a5 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingAllMailsTaskAdditionalInformationDTO.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingAllMailsTaskAdditionalInformationDTO.java
@@ -23,6 +23,7 @@ import java.util.Optional;
 
 import org.apache.james.json.DTOModule;
 import org.apache.james.mailrepository.api.MailRepositoryPath;
+import org.apache.james.queue.api.MailQueueName;
 import org.apache.james.server.task.json.dto.AdditionalInformationDTO;
 import org.apache.james.server.task.json.dto.AdditionalInformationDTOModule;
 
@@ -35,7 +36,7 @@ public class ReprocessingAllMailsTaskAdditionalInformationDTO implements Additio
             .convertToDTO(ReprocessingAllMailsTaskAdditionalInformationDTO.class)
             .toDomainObjectConverter(dto -> new ReprocessingAllMailsTask.AdditionalInformation(
                 MailRepositoryPath.from(dto.repositoryPath),
-                dto.targetQueue,
+                MailQueueName.of(dto.targetQueue),
                 dto.targetProcessor,
                 dto.initialCount,
                 dto.remainingCount,
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingAllMailsTaskDTO.java b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingAllMailsTaskDTO.java
index bc04212..d81f2a8 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingAllMailsTaskDTO.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingAllMailsTaskDTO.java
@@ -22,6 +22,7 @@ import java.util.Optional;
 
 import org.apache.james.json.DTOModule;
 import org.apache.james.mailrepository.api.MailRepositoryPath;
+import org.apache.james.queue.api.MailQueueName;
 import org.apache.james.server.task.json.dto.TaskDTO;
 import org.apache.james.server.task.json.dto.TaskDTOModule;
 
@@ -45,7 +46,7 @@ public class ReprocessingAllMailsTaskDTO implements TaskDTO {
                 typeName,
                 domainObject.getRepositorySize(),
                 domainObject.getRepositoryPath().urlEncoded(),
-                domainObject.getTargetQueue(),
+                domainObject.getTargetQueue().asString(),
                 domainObject.getTargetProcessor()
             );
         } catch (Exception e) {
@@ -77,7 +78,7 @@ public class ReprocessingAllMailsTaskDTO implements TaskDTO {
                 reprocessingService,
                 repositorySize,
                 MailRepositoryPath.fromEncoded(repositoryPath),
-                targetQueue,
+                MailQueueName.of(targetQueue),
                 targetProcessor
             );
         } catch (Exception e) {
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingOneMailTask.java b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingOneMailTask.java
index 0225abb..2777ce2 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingOneMailTask.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingOneMailTask.java
@@ -28,6 +28,7 @@ import javax.mail.MessagingException;
 import org.apache.james.mailrepository.api.MailKey;
 import org.apache.james.mailrepository.api.MailRepositoryPath;
 import org.apache.james.mailrepository.api.MailRepositoryStore;
+import org.apache.james.queue.api.MailQueueName;
 import org.apache.james.task.Task;
 import org.apache.james.task.TaskExecutionDetails;
 import org.apache.james.task.TaskType;
@@ -43,9 +44,9 @@ public class ReprocessingOneMailTask implements Task {
         private final Optional<String> targetProcessor;
         private final Instant timestamp;
 
-        public AdditionalInformation(MailRepositoryPath repositoryPath, String targetQueue, MailKey mailKey, Optional<String> targetProcessor, Instant timestamp) {
+        public AdditionalInformation(MailRepositoryPath repositoryPath, MailQueueName targetQueue, MailKey mailKey, Optional<String> targetProcessor, Instant timestamp) {
             this.repositoryPath = repositoryPath;
-            this.targetQueue = targetQueue;
+            this.targetQueue = targetQueue.asString();
             this.mailKey = mailKey;
             this.targetProcessor = targetProcessor;
             this.timestamp = timestamp;
@@ -89,14 +90,14 @@ public class ReprocessingOneMailTask implements Task {
 
     private final ReprocessingService reprocessingService;
     private final MailRepositoryPath repositoryPath;
-    private final String targetQueue;
+    private final MailQueueName targetQueue;
     private final MailKey mailKey;
     private final Optional<String> targetProcessor;
     private final AdditionalInformation additionalInformation;
 
     public ReprocessingOneMailTask(ReprocessingService reprocessingService,
                                    MailRepositoryPath repositoryPath,
-                                   String targetQueue,
+                                   MailQueueName targetQueue,
                                    MailKey mailKey,
                                    Optional<String> targetProcessor,
                                    Clock clock) {
@@ -128,7 +129,7 @@ public class ReprocessingOneMailTask implements Task {
         return repositoryPath;
     }
 
-    String getTargetQueue() {
+    MailQueueName getTargetQueue() {
         return targetQueue;
     }
 
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingOneMailTaskAdditionalInformationDTO.java b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingOneMailTaskAdditionalInformationDTO.java
index 528caf5..89dd1d8 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingOneMailTaskAdditionalInformationDTO.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingOneMailTaskAdditionalInformationDTO.java
@@ -24,6 +24,7 @@ import java.util.Optional;
 import org.apache.james.json.DTOModule;
 import org.apache.james.mailrepository.api.MailKey;
 import org.apache.james.mailrepository.api.MailRepositoryPath;
+import org.apache.james.queue.api.MailQueueName;
 import org.apache.james.server.task.json.dto.AdditionalInformationDTO;
 import org.apache.james.server.task.json.dto.AdditionalInformationDTOModule;
 
@@ -36,7 +37,7 @@ public class ReprocessingOneMailTaskAdditionalInformationDTO implements Addition
             .convertToDTO(ReprocessingOneMailTaskAdditionalInformationDTO.class)
             .toDomainObjectConverter(dto -> new ReprocessingOneMailTask.AdditionalInformation(
                 MailRepositoryPath.from(dto.repositoryPath),
-                dto.targetQueue,
+                MailQueueName.of(dto.targetQueue),
                 new MailKey(dto.mailKey),
                 dto.targetProcessor,
                 dto.timestamp
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingOneMailTaskDTO.java b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingOneMailTaskDTO.java
index 462e598..ea09c18 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingOneMailTaskDTO.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingOneMailTaskDTO.java
@@ -24,6 +24,7 @@ import java.util.Optional;
 import org.apache.james.json.DTOModule;
 import org.apache.james.mailrepository.api.MailKey;
 import org.apache.james.mailrepository.api.MailRepositoryPath;
+import org.apache.james.queue.api.MailQueueName;
 import org.apache.james.server.task.json.dto.TaskDTO;
 import org.apache.james.server.task.json.dto.TaskDTOModule;
 
@@ -46,7 +47,7 @@ public class ReprocessingOneMailTaskDTO implements TaskDTO {
             return new ReprocessingOneMailTaskDTO(
                 typeName,
                 domainObject.getRepositoryPath().urlEncoded(),
-                domainObject.getTargetQueue(),
+                domainObject.getTargetQueue().asString(),
                 domainObject.getMailKey().asString(),
                 domainObject.getTargetProcessor()
             );
@@ -77,7 +78,7 @@ public class ReprocessingOneMailTaskDTO implements TaskDTO {
         return new ReprocessingOneMailTask(
             reprocessingService,
             getMailRepositoryPath(),
-            targetQueue,
+            MailQueueName.of(targetQueue),
             new MailKey(mailKey),
             targetProcessor,
             clock
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingService.java b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingService.java
index 6171b00..b93ec2c 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingService.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/main/java/org/apache/james/webadmin/service/ReprocessingService.java
@@ -34,6 +34,7 @@ import org.apache.james.mailrepository.api.MailRepositoryPath;
 import org.apache.james.mailrepository.api.MailRepositoryStore;
 import org.apache.james.queue.api.MailQueue;
 import org.apache.james.queue.api.MailQueueFactory;
+import org.apache.james.queue.api.MailQueueName;
 import org.apache.james.util.OptionalUtils;
 import org.apache.james.util.streams.Iterators;
 import org.apache.mailet.Mail;
@@ -91,7 +92,7 @@ public class ReprocessingService {
         this.mailRepositoryStoreService = mailRepositoryStoreService;
     }
 
-    public void reprocessAll(MailRepositoryPath path, Optional<String> targetProcessor, String targetQueue, Consumer<MailKey> keyListener) throws MailRepositoryStore.MailRepositoryStoreException, MessagingException {
+    public void reprocessAll(MailRepositoryPath path, Optional<String> targetProcessor, MailQueueName targetQueue, Consumer<MailKey> keyListener) throws MailRepositoryStore.MailRepositoryStoreException, MessagingException {
         try (Reprocessor reprocessor = new Reprocessor(getMailQueue(targetQueue), targetProcessor)) {
             mailRepositoryStoreService
                 .getRepositories(path)
@@ -104,7 +105,7 @@ public class ReprocessingService {
         }
     }
 
-    public void reprocess(MailRepositoryPath path, MailKey key, Optional<String> targetProcessor, String targetQueue) throws MailRepositoryStore.MailRepositoryStoreException, MessagingException {
+    public void reprocess(MailRepositoryPath path, MailKey key, Optional<String> targetProcessor, MailQueueName targetQueue) throws MailRepositoryStore.MailRepositoryStoreException, MessagingException {
         try (Reprocessor reprocessor = new Reprocessor(getMailQueue(targetQueue), targetProcessor)) {
             Pair<MailRepository, Mail> mailPair = mailRepositoryStoreService
                 .getRepositories(path)
@@ -118,8 +119,8 @@ public class ReprocessingService {
         }
     }
 
-    private MailQueue getMailQueue(String targetQueue) {
+    private MailQueue getMailQueue(MailQueueName targetQueue) {
         return mailQueueFactory.getQueue(targetQueue)
-            .orElseThrow(() -> new RuntimeException("Can not find queue " + targetQueue));
+            .orElseThrow(() -> new RuntimeException("Can not find queue " + targetQueue.asString()));
     }
 }
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/routes/MailRepositoriesRoutesTest.java b/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/routes/MailRepositoriesRoutesTest.java
index eb6998a..613c506 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/routes/MailRepositoriesRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/routes/MailRepositoriesRoutesTest.java
@@ -60,6 +60,7 @@ import org.apache.james.mailrepository.memory.MemoryMailRepositoryStore;
 import org.apache.james.mailrepository.memory.MemoryMailRepositoryUrlStore;
 import org.apache.james.mailrepository.memory.TestingMailRepositoryLoader;
 import org.apache.james.queue.api.MailQueueFactory;
+import org.apache.james.queue.api.MailQueueName;
 import org.apache.james.queue.api.ManageableMailQueue;
 import org.apache.james.queue.api.RawMailQueueItemDecoratorFactory;
 import org.apache.james.queue.memory.MemoryMailQueueFactory;
@@ -99,7 +100,7 @@ public class MailRepositoriesRoutesTest {
     private static final MailRepositoryPath PATH_MY_REPO = MailRepositoryPath.from("myRepo");
     private static final String PATH_ESCAPED_MY_REPO = "myRepo";
     private static final String MY_REPO_MAILS = "myRepo/mails";
-    private static final String CUSTOM_QUEUE = "customQueue";
+    private static final MailQueueName CUSTOM_QUEUE = MailQueueName.of("customQueue");
     private static final String NAME_1 = "name1";
     private static final String NAME_2 = "name2";
     private WebAdminServer webAdminServer;
@@ -1119,7 +1120,7 @@ public class MailRepositoriesRoutesTest {
             .body("additionalInformation.initialCount", is(2))
             .body("additionalInformation.remainingCount", is(0))
             .body("additionalInformation.targetProcessor", isEmptyOrNullString())
-            .body("additionalInformation.targetQueue", is(MailQueueFactory.SPOOL))
+            .body("additionalInformation.targetQueue", is(MailQueueFactory.SPOOL.asString()))
             .body("startedDate", is(notNullValue()))
             .body("submitDate", is(notNullValue()))
             .body("completedDate", is(notNullValue()));
@@ -1140,7 +1141,7 @@ public class MailRepositoriesRoutesTest {
         String transport = "transport";
         String taskId = with()
             .param("action", "reprocess")
-            .param("queue", CUSTOM_QUEUE)
+            .param("queue", CUSTOM_QUEUE.asString())
             .param("processor", transport)
             .patch(PATH_ESCAPED_MY_REPO + "/mails")
             .jsonPath()
@@ -1158,7 +1159,7 @@ public class MailRepositoriesRoutesTest {
             .body("additionalInformation.initialCount", is(2))
             .body("additionalInformation.remainingCount", is(0))
             .body("additionalInformation.targetProcessor", is(transport))
-            .body("additionalInformation.targetQueue", is(CUSTOM_QUEUE))
+            .body("additionalInformation.targetQueue", is(CUSTOM_QUEUE.asString()))
             .body("startedDate", is(notNullValue()))
             .body("submitDate", is(notNullValue()))
             .body("completedDate", is(notNullValue()));
@@ -1180,7 +1181,7 @@ public class MailRepositoriesRoutesTest {
         String transport = "transport";
         String taskId = with()
             .param("action", "reprocess")
-            .param("queue", CUSTOM_QUEUE)
+            .param("queue", CUSTOM_QUEUE.asString())
             .param("processor", transport)
             .patch(PATH_ESCAPED_MY_REPO + "/mails")
             .jsonPath()
@@ -1209,7 +1210,7 @@ public class MailRepositoriesRoutesTest {
         String transport = "transport";
         String taskId = with()
             .param("action", "reprocess")
-            .param("queue", CUSTOM_QUEUE)
+            .param("queue", CUSTOM_QUEUE.asString())
             .param("processor", transport)
             .patch(PATH_ESCAPED_MY_REPO + "/mails")
             .jsonPath()
@@ -1240,7 +1241,7 @@ public class MailRepositoriesRoutesTest {
         String transport = "transport";
         String taskId = with()
             .param("action", "reprocess")
-            .param("queue", CUSTOM_QUEUE)
+            .param("queue", CUSTOM_QUEUE.asString())
             .param("processor", transport)
             .patch(PATH_ESCAPED_MY_REPO + "/mails")
             .jsonPath()
@@ -1387,7 +1388,7 @@ public class MailRepositoriesRoutesTest {
 
         String taskId = with()
             .param("action", "reprocess")
-            .param("queue", CUSTOM_QUEUE)
+            .param("queue", CUSTOM_QUEUE.asString())
             .patch(PATH_ESCAPED_MY_REPO + "/mails")
             .jsonPath()
             .get("taskId");
@@ -1485,7 +1486,7 @@ public class MailRepositoriesRoutesTest {
             .body("additionalInformation.repositoryPath", is(PATH_MY_REPO.asString()))
             .body("additionalInformation.mailKey", is(NAME_1))
             .body("additionalInformation.targetProcessor", isEmptyOrNullString())
-            .body("additionalInformation.targetQueue", is(MailQueueFactory.SPOOL))
+            .body("additionalInformation.targetQueue", is(MailQueueFactory.SPOOL.asString()))
             .body("startedDate", is(notNullValue()))
             .body("submitDate", is(notNullValue()))
             .body("completedDate", is(notNullValue()));
@@ -1506,7 +1507,7 @@ public class MailRepositoriesRoutesTest {
         String transport = "transport";
         String taskId = with()
             .param("action", "reprocess")
-            .param("queue", CUSTOM_QUEUE)
+            .param("queue", CUSTOM_QUEUE.asString())
             .param("processor", transport)
             .patch(PATH_ESCAPED_MY_REPO + "/mails/" + NAME_1)
             .jsonPath()
@@ -1523,7 +1524,7 @@ public class MailRepositoriesRoutesTest {
             .body("additionalInformation.repositoryPath", is(PATH_MY_REPO.asString()))
             .body("additionalInformation.mailKey", is(NAME_1))
             .body("additionalInformation.targetProcessor", is(transport))
-            .body("additionalInformation.targetQueue", is(CUSTOM_QUEUE))
+            .body("additionalInformation.targetQueue", is(CUSTOM_QUEUE.asString()))
             .body("startedDate", is(notNullValue()))
             .body("submitDate", is(notNullValue()))
             .body("completedDate", is(notNullValue()));
@@ -1545,7 +1546,7 @@ public class MailRepositoriesRoutesTest {
         String transport = "transport";
         String taskId = with()
             .param("action", "reprocess")
-            .param("queue", CUSTOM_QUEUE)
+            .param("queue", CUSTOM_QUEUE.asString())
             .param("processor", transport)
             .patch(PATH_ESCAPED_MY_REPO + "/mails/" + NAME_1)
             .jsonPath()
@@ -1574,7 +1575,7 @@ public class MailRepositoriesRoutesTest {
         String transport = "transport";
         String taskId = with()
             .param("action", "reprocess")
-            .param("queue", CUSTOM_QUEUE)
+            .param("queue", CUSTOM_QUEUE.asString())
             .param("processor", transport)
             .patch(PATH_ESCAPED_MY_REPO + "/mails/" + NAME_1)
             .jsonPath()
@@ -1692,7 +1693,7 @@ public class MailRepositoriesRoutesTest {
 
         String taskId = with()
             .param("action", "reprocess")
-            .param("queue", CUSTOM_QUEUE)
+            .param("queue", CUSTOM_QUEUE.asString())
             .patch(PATH_ESCAPED_MY_REPO + "/mails/" + NAME_1)
             .jsonPath()
             .get("taskId");
@@ -1720,7 +1721,7 @@ public class MailRepositoriesRoutesTest {
 
         String taskId = with()
             .param("action", "reprocess")
-            .param("queue", CUSTOM_QUEUE)
+            .param("queue", CUSTOM_QUEUE.asString())
             .patch(PATH_ESCAPED_MY_REPO + "/mails/" + "unknown")
             .jsonPath()
             .get("taskId");
@@ -1746,7 +1747,7 @@ public class MailRepositoriesRoutesTest {
 
         String taskId = with()
             .param("action", "reprocess")
-            .param("queue", CUSTOM_QUEUE)
+            .param("queue", CUSTOM_QUEUE.asString())
             .patch(PATH_ESCAPED_MY_REPO + "/mails/" + "unknown")
             .jsonPath()
             .get("taskId");
@@ -1771,7 +1772,7 @@ public class MailRepositoriesRoutesTest {
 
         String taskId = with()
             .param("action", "reprocess")
-            .param("queue", CUSTOM_QUEUE)
+            .param("queue", CUSTOM_QUEUE.asString())
             .patch(PATH_ESCAPED_MY_REPO + "/mails/" + "unknown")
             .jsonPath()
             .get("taskId");
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ReprocessingAllMailsTaskTest.java b/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ReprocessingAllMailsTaskTest.java
index df0fe9e..7ad6a8b 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ReprocessingAllMailsTaskTest.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ReprocessingAllMailsTaskTest.java
@@ -27,6 +27,7 @@ import java.util.Optional;
 
 import org.apache.james.JsonSerializationVerifier;
 import org.apache.james.mailrepository.api.MailRepositoryPath;
+import org.apache.james.queue.api.MailQueueName;
 import org.apache.james.server.task.json.JsonTaskSerializer;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.params.ParameterizedTest;
@@ -37,7 +38,7 @@ class ReprocessingAllMailsTaskTest {
     private static final ReprocessingService REPROCESSING_SERVICE = mock(ReprocessingService.class);
     private static final long REPOSITORY_SIZE = 5L;
     private static final MailRepositoryPath REPOSITORY_PATH = MailRepositoryPath.from("a");
-    private static final String TARGET_QUEUE = "queue";
+    private static final MailQueueName TARGET_QUEUE = MailQueueName.of("queue");
     private static final Optional<String> SOME_TARGET_PROCESSOR = Optional.of("targetProcessor");
     private static final long REMAINING_COUNT = 3L;
     private static final String SERIALIZED_TASK_WITH_TARGET_PROCESSOR = "{\"type\":\"reprocessing-all\",\"repositorySize\":5,\"repositoryPath\":\"a\",\"targetQueue\":\"queue\",\"targetProcessor\":\"targetProcessor\"}";
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ReprocessingOneMailTaskTest.java b/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ReprocessingOneMailTaskTest.java
index 5927ee0..b61ed7e 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ReprocessingOneMailTaskTest.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ReprocessingOneMailTaskTest.java
@@ -31,6 +31,7 @@ import java.util.Optional;
 import org.apache.james.JsonSerializationVerifier;
 import org.apache.james.mailrepository.api.MailKey;
 import org.apache.james.mailrepository.api.MailRepositoryPath;
+import org.apache.james.queue.api.MailQueueName;
 import org.apache.james.server.task.json.JsonTaskSerializer;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.params.ParameterizedTest;
@@ -43,7 +44,7 @@ class ReprocessingOneMailTaskTest {
     private static final String SERIALIZED_TASK_1 = "{\"type\":\"reprocessing-one\",\"repositoryPath\":\"a\",\"targetQueue\":\"queue\",\"mailKey\": \"myMail\",\"targetProcessor\":\"targetProcessor\"}";
     private static final String SERIALIZED_TASK_1_ADDITIONAL_INFORMATION = "{\"type\":\"reprocessing-one\", \"repositoryPath\":\"a\",\"targetQueue\":\"queue\",\"mailKey\": \"myMail\",\"targetProcessor\":\"targetProcessor\", \"timestamp\":\"2018-11-13T12:00:55Z\"}";
     private static final MailRepositoryPath REPOSITORY_PATH = MailRepositoryPath.from("a");
-    private static final String TARGET_QUEUE = "queue";
+    private static final MailQueueName TARGET_QUEUE = MailQueueName.of("queue");
     private static final MailKey MAIL_KEY = new MailKey("myMail");
     private static final Optional<String> TARGET_PROCESSOR = Optional.of("targetProcessor");
 
diff --git a/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ReprocessingServiceTest.java b/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ReprocessingServiceTest.java
index 4c6dca1..994c7aa 100644
--- a/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ReprocessingServiceTest.java
+++ b/server/protocols/webadmin/webadmin-mailrepository/src/test/java/org/apache/james/webadmin/service/ReprocessingServiceTest.java
@@ -37,6 +37,7 @@ import org.apache.james.mailrepository.memory.MemoryMailRepositoryStore;
 import org.apache.james.mailrepository.memory.MemoryMailRepositoryUrlStore;
 import org.apache.james.mailrepository.memory.TestingMailRepositoryLoader;
 import org.apache.james.queue.api.MailQueueFactory;
+import org.apache.james.queue.api.MailQueueName;
 import org.apache.james.queue.api.ManageableMailQueue;
 import org.apache.james.queue.api.RawMailQueueItemDecoratorFactory;
 import org.apache.james.queue.memory.MemoryMailQueueFactory;
@@ -57,7 +58,7 @@ public class ReprocessingServiceTest {
     private static final MailKey KEY_1 = new MailKey(NAME_1);
     private static final MailKey KEY_2 = new MailKey(NAME_2);
     private static final MailKey KEY_3 = new MailKey(NAME_3);
-    private static final String SPOOL = "spool";
+    private static final MailQueueName SPOOL = MailQueueName.of("spool");
     private static final Consumer<MailKey> NOOP_CONSUMER = key -> { };
     private static final Optional<String> NO_TARGET_PROCESSOR = Optional.empty();
 
diff --git a/server/queue/queue-activemq/src/main/java/org/apache/james/queue/activemq/ActiveMQCacheableMailQueue.java b/server/queue/queue-activemq/src/main/java/org/apache/james/queue/activemq/ActiveMQCacheableMailQueue.java
index 145acd5..e798251 100644
--- a/server/queue/queue-activemq/src/main/java/org/apache/james/queue/activemq/ActiveMQCacheableMailQueue.java
+++ b/server/queue/queue-activemq/src/main/java/org/apache/james/queue/activemq/ActiveMQCacheableMailQueue.java
@@ -44,6 +44,7 @@ import org.apache.james.metrics.api.GaugeRegistry;
 import org.apache.james.metrics.api.MetricFactory;
 import org.apache.james.queue.api.MailQueue;
 import org.apache.james.queue.api.MailQueueItemDecoratorFactory;
+import org.apache.james.queue.api.MailQueueName;
 import org.apache.james.queue.jms.JMSCacheableMailQueue;
 import org.apache.james.server.core.MailImpl;
 import org.apache.james.server.core.MimeMessageCopyOnWriteProxy;
@@ -98,7 +99,7 @@ public class ActiveMQCacheableMailQueue extends JMSCacheableMailQueue implements
      * Construct a {@link ActiveMQCacheableMailQueue} which only use {@link BlobMessage}
      * 
      */
-    public ActiveMQCacheableMailQueue(ConnectionFactory connectionFactory, MailQueueItemDecoratorFactory mailQueueItemDecoratorFactory, String queuename, MetricFactory metricFactory,
+    public ActiveMQCacheableMailQueue(ConnectionFactory connectionFactory, MailQueueItemDecoratorFactory mailQueueItemDecoratorFactory, MailQueueName queuename, MetricFactory metricFactory,
                                       GaugeRegistry gaugeRegistry) {
         this(connectionFactory, mailQueueItemDecoratorFactory, queuename, true, metricFactory, gaugeRegistry);
     }
@@ -110,7 +111,7 @@ public class ActiveMQCacheableMailQueue extends JMSCacheableMailQueue implements
      * @param queuename
      * @param useBlob
      */
-    public ActiveMQCacheableMailQueue(ConnectionFactory connectionFactory, MailQueueItemDecoratorFactory mailQueueItemDecoratorFactory, String queuename, boolean useBlob, MetricFactory metricFactory,
+    public ActiveMQCacheableMailQueue(ConnectionFactory connectionFactory, MailQueueItemDecoratorFactory mailQueueItemDecoratorFactory, MailQueueName queuename, boolean useBlob, MetricFactory metricFactory,
                                       GaugeRegistry gaugeRegistry) {
         super(connectionFactory, mailQueueItemDecoratorFactory, queuename, metricFactory, gaugeRegistry);
         this.useBlob = useBlob;
@@ -124,7 +125,7 @@ public class ActiveMQCacheableMailQueue extends JMSCacheableMailQueue implements
             try {
                 // store URL and queueName for later usage
                 builder.addAttribute(new Attribute(JAMES_BLOB_URL, AttributeValue.of(blobMessage.getURL())));
-                builder.addAttribute(new Attribute(JAMES_QUEUE_NAME, AttributeValue.of(queueName)));
+                builder.addAttribute(new Attribute(JAMES_QUEUE_NAME, AttributeValue.of(queueName.asString())));
             } catch (MalformedURLException e) {
                 // Ignore on error
                 LOGGER.debug("Unable to get url from blobmessage for mail");
@@ -280,7 +281,7 @@ public class ActiveMQCacheableMailQueue extends JMSCacheableMailQueue implements
             replyTo = session.createTemporaryQueue();
             consumer = session.createConsumer(replyTo);
 
-            Queue myQueue = session.createQueue(queueName);
+            Queue myQueue = session.createQueue(queueName.asString());
             producer = session.createProducer(null);
 
             String queueName = "ActiveMQ.Statistics.Destination." + myQueue.getQueueName();
diff --git a/server/queue/queue-activemq/src/main/java/org/apache/james/queue/activemq/ActiveMQMailQueueFactory.java b/server/queue/queue-activemq/src/main/java/org/apache/james/queue/activemq/ActiveMQMailQueueFactory.java
index 5b61ca5..dcfe273 100644
--- a/server/queue/queue-activemq/src/main/java/org/apache/james/queue/activemq/ActiveMQMailQueueFactory.java
+++ b/server/queue/queue-activemq/src/main/java/org/apache/james/queue/activemq/ActiveMQMailQueueFactory.java
@@ -25,6 +25,7 @@ import org.apache.james.metrics.api.GaugeRegistry;
 import org.apache.james.metrics.api.MetricFactory;
 import org.apache.james.queue.api.MailQueueFactory;
 import org.apache.james.queue.api.MailQueueItemDecoratorFactory;
+import org.apache.james.queue.api.MailQueueName;
 import org.apache.james.queue.api.ManageableMailQueue;
 import org.apache.james.queue.jms.JMSMailQueueFactory;
 
@@ -51,7 +52,7 @@ public class ActiveMQMailQueueFactory extends JMSMailQueueFactory {
     }
 
     @Override
-    protected ManageableMailQueue createCacheableMailQueue(String name) {
+    protected ManageableMailQueue createCacheableMailQueue(MailQueueName name) {
         return new ActiveMQCacheableMailQueue(connectionFactory, mailQueueItemDecoratorFactory, name, useBlob, metricFactory, gaugeRegistry);
     }
 }
diff --git a/server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueBlobTest.java b/server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueBlobTest.java
index da22eb7..1a68b89 100644
--- a/server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueBlobTest.java
+++ b/server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueBlobTest.java
@@ -38,6 +38,7 @@ import org.apache.james.queue.api.DelayedPriorityMailQueueContract;
 import org.apache.james.queue.api.MailQueue;
 import org.apache.james.queue.api.MailQueueMetricContract;
 import org.apache.james.queue.api.MailQueueMetricExtension;
+import org.apache.james.queue.api.MailQueueName;
 import org.apache.james.queue.api.ManageableMailQueue;
 import org.apache.james.queue.api.PriorityManageableMailQueueContract;
 import org.apache.james.queue.api.RawMailQueueItemDecoratorFactory;
@@ -77,7 +78,7 @@ public class ActiveMQMailQueueBlobTest implements DelayedManageableMailQueueCont
         RawMailQueueItemDecoratorFactory mailQueueItemDecoratorFactory = new RawMailQueueItemDecoratorFactory();
         MetricFactory metricFactory = metricTestSystem.getMetricFactory();
         GaugeRegistry gaugeRegistry = metricTestSystem.getSpyGaugeRegistry();
-        String queueName = BrokerExtension.generateRandomQueueName(broker);
+        MailQueueName queueName = BrokerExtension.generateRandomQueueName(broker);
         mailQueue = new ActiveMQCacheableMailQueue(connectionFactory, mailQueueItemDecoratorFactory, queueName, USE_BLOB, metricFactory, gaugeRegistry);
     }
 
diff --git a/server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueTest.java b/server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueTest.java
index e7a08dd..b90c1a1 100644
--- a/server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueTest.java
+++ b/server/queue/queue-activemq/src/test/java/org/apache/james/queue/activemq/ActiveMQMailQueueTest.java
@@ -28,6 +28,7 @@ import org.apache.james.queue.api.DelayedPriorityMailQueueContract;
 import org.apache.james.queue.api.MailQueue;
 import org.apache.james.queue.api.MailQueueMetricContract;
 import org.apache.james.queue.api.MailQueueMetricExtension;
+import org.apache.james.queue.api.MailQueueName;
 import org.apache.james.queue.api.ManageableMailQueue;
 import org.apache.james.queue.api.PriorityManageableMailQueueContract;
 import org.apache.james.queue.api.RawMailQueueItemDecoratorFactory;
@@ -57,7 +58,7 @@ public class ActiveMQMailQueueTest implements DelayedManageableMailQueueContract
         RawMailQueueItemDecoratorFactory mailQueueItemDecoratorFactory = new RawMailQueueItemDecoratorFactory();
         MetricFactory metricFactory = metricTestSystem.getMetricFactory();
         GaugeRegistry gaugeRegistry = metricTestSystem.getSpyGaugeRegistry();
-        String queueName = BrokerExtension.generateRandomQueueName(broker);
+        MailQueueName queueName = BrokerExtension.generateRandomQueueName(broker);
         mailQueue = new ActiveMQCacheableMailQueue(connectionFactory, mailQueueItemDecoratorFactory, queueName, !USE_BLOB, metricFactory, gaugeRegistry);
     }
 
diff --git a/server/queue/queue-api/src/main/java/org/apache/james/queue/api/MailQueue.java b/server/queue/queue-api/src/main/java/org/apache/james/queue/api/MailQueue.java
index d4e9c3a..38b8c3f 100644
--- a/server/queue/queue-api/src/main/java/org/apache/james/queue/api/MailQueue.java
+++ b/server/queue/queue-api/src/main/java/org/apache/james/queue/api/MailQueue.java
@@ -71,7 +71,7 @@ public interface MailQueue extends Closeable {
      */
     int NO_DELAY = -1;
 
-    String getName();
+    MailQueueName getName();
 
     /**
      * Enqueue the Mail to the queue. The given delay and unit are used to
diff --git a/server/queue/queue-api/src/main/java/org/apache/james/queue/api/MailQueueFactory.java b/server/queue/queue-api/src/main/java/org/apache/james/queue/api/MailQueueFactory.java
index 09850b3..3f0a5dc 100644
--- a/server/queue/queue-api/src/main/java/org/apache/james/queue/api/MailQueueFactory.java
+++ b/server/queue/queue-api/src/main/java/org/apache/james/queue/api/MailQueueFactory.java
@@ -30,7 +30,7 @@ public interface MailQueueFactory<T extends MailQueue> {
     /**
      * {@link MailQueue} which is used for spooling the messages
      */
-    String SPOOL = "spool";
+    MailQueueName SPOOL = MailQueueName.of("spool");
 
     /**
      * Return the {@link MailQueue} for the name.
@@ -38,9 +38,9 @@ public interface MailQueueFactory<T extends MailQueue> {
      * @param name
      * @return queue
      */
-    Optional<T> getQueue(String name);
+    Optional<T> getQueue(MailQueueName name);
 
-    T createQueue(String name);
+    T createQueue(MailQueueName name);
 
-    Set<String> listCreatedMailQueues();
+    Set<MailQueueName> listCreatedMailQueues();
 }
diff --git a/server/queue/queue-api/src/test/java/org/apache/james/queue/api/ManageableMailQueueFactoryContract.java b/server/queue/queue-api/src/main/java/org/apache/james/queue/api/MailQueueName.java
similarity index 55%
copy from server/queue/queue-api/src/test/java/org/apache/james/queue/api/ManageableMailQueueFactoryContract.java
copy to server/queue/queue-api/src/main/java/org/apache/james/queue/api/MailQueueName.java
index 439e7d0..8ad937c 100644
--- a/server/queue/queue-api/src/test/java/org/apache/james/queue/api/ManageableMailQueueFactoryContract.java
+++ b/server/queue/queue-api/src/main/java/org/apache/james/queue/api/MailQueueName.java
@@ -19,27 +19,47 @@
 
 package org.apache.james.queue.api;
 
-import static org.assertj.core.api.Assertions.assertThat;
+import java.util.Objects;
 
-import javax.mail.MessagingException;
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Preconditions;
 
-import org.junit.jupiter.api.Test;
+public final class MailQueueName {
 
-public interface ManageableMailQueueFactoryContract {
+    public static MailQueueName of(String value) {
+        Preconditions.checkNotNull(value);
+        Preconditions.checkArgument(!value.isEmpty());
+        return new MailQueueName(value);
+    }
 
-    String NAME_1 = "name1";
+    private final String value;
 
-    MailQueueFactory<ManageableMailQueue> getMailQueueFactory();
+    private MailQueueName(String value) {
+        this.value = value;
+    }
 
-    @Test
-    default void createMailQueueShouldNotConflictIfAlreadyExists() throws MessagingException {
-        MailQueueFactory<ManageableMailQueue> mailQueueFactory = getMailQueueFactory();
-        MailQueue firstCreation = mailQueueFactory.createQueue(NAME_1);
+    public String asString() {
+        return value;
+    }
 
-        firstCreation.enQueue(Mails.defaultMail().name("name").build());
+    @Override
+    public boolean equals(Object o) {
+        if (o instanceof MailQueueName) {
+            MailQueueName that = (MailQueueName) o;
+            return Objects.equals(value, that.value);
+        }
+        return false;
+    }
 
-        ManageableMailQueue secondCreation = mailQueueFactory.createQueue(NAME_1);
-        assertThat(secondCreation.getSize()).isEqualTo(1);
+    @Override
+    public int hashCode() {
+        return Objects.hash(value);
     }
 
-}
\ No newline at end of file
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+            .add("value", value)
+            .toString();
+    }
+}
diff --git a/server/queue/queue-api/src/test/java/org/apache/james/queue/api/MailQueueFactoryContract.java b/server/queue/queue-api/src/test/java/org/apache/james/queue/api/MailQueueFactoryContract.java
index 20d99a6..34801b3 100644
--- a/server/queue/queue-api/src/test/java/org/apache/james/queue/api/MailQueueFactoryContract.java
+++ b/server/queue/queue-api/src/test/java/org/apache/james/queue/api/MailQueueFactoryContract.java
@@ -25,8 +25,8 @@ import org.junit.jupiter.api.Test;
 
 public interface MailQueueFactoryContract<T extends MailQueue> {
 
-    String NAME_1 = "name1";
-    String NAME_2 = "name2";
+    MailQueueName NAME_1 = MailQueueName.of("name1");
+    MailQueueName NAME_2 = MailQueueName.of("name2");
 
     MailQueueFactory<T> getMailQueueFactory();
 
diff --git a/server/queue/queue-api/src/main/java/org/apache/james/queue/api/MailQueueFactory.java b/server/queue/queue-api/src/test/java/org/apache/james/queue/api/MailQueueNameTest.java
similarity index 67%
copy from server/queue/queue-api/src/main/java/org/apache/james/queue/api/MailQueueFactory.java
copy to server/queue/queue-api/src/test/java/org/apache/james/queue/api/MailQueueNameTest.java
index 09850b3..1ed2714 100644
--- a/server/queue/queue-api/src/main/java/org/apache/james/queue/api/MailQueueFactory.java
+++ b/server/queue/queue-api/src/test/java/org/apache/james/queue/api/MailQueueNameTest.java
@@ -1,46 +1,44 @@
-/****************************************************************
- * 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.queue.api;
-
-import java.util.Optional;
-import java.util.Set;
-
-/**
- * Factory for {@link MailQueue}
- */
-public interface MailQueueFactory<T extends MailQueue> {
-
-    /**
-     * {@link MailQueue} which is used for spooling the messages
-     */
-    String SPOOL = "spool";
-
-    /**
-     * Return the {@link MailQueue} for the name.
-     * 
-     * @param name
-     * @return queue
-     */
-    Optional<T> getQueue(String name);
-
-    T createQueue(String name);
-
-    Set<String> listCreatedMailQueues();
-}
+/****************************************************************
+ * 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.queue.api;
+
+import org.assertj.core.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import nl.jqno.equalsverifier.EqualsVerifier;
+
+class MailQueueNameTest {
+
+    @Test
+    void shouldMatchBeanContract() {
+        EqualsVerifier.forClass(MailQueueName.class).verify();
+    }
+
+    @Test
+    void shouldNotAllowNullName() {
+        Assertions.assertThatThrownBy(() -> MailQueueName.of(null)).isInstanceOf(NullPointerException.class);
+    }
+
+    @Test
+    void shouldNotAllowEmptyName() {
+        Assertions.assertThatThrownBy(() -> MailQueueName.of("")).isInstanceOf(IllegalArgumentException.class);
+    }
+
+}
\ No newline at end of file
diff --git a/server/queue/queue-api/src/test/java/org/apache/james/queue/api/ManageableMailQueueFactoryContract.java b/server/queue/queue-api/src/test/java/org/apache/james/queue/api/ManageableMailQueueFactoryContract.java
index 439e7d0..5ae065f 100644
--- a/server/queue/queue-api/src/test/java/org/apache/james/queue/api/ManageableMailQueueFactoryContract.java
+++ b/server/queue/queue-api/src/test/java/org/apache/james/queue/api/ManageableMailQueueFactoryContract.java
@@ -27,7 +27,7 @@ import org.junit.jupiter.api.Test;
 
 public interface ManageableMailQueueFactoryContract {
 
-    String NAME_1 = "name1";
+    MailQueueName NAME_1 = MailQueueName.of("name1");
 
     MailQueueFactory<ManageableMailQueue> getMailQueueFactory();
 
diff --git a/server/queue/queue-file/src/main/java/org/apache/james/queue/file/FileCacheableMailQueue.java b/server/queue/queue-file/src/main/java/org/apache/james/queue/file/FileCacheableMailQueue.java
index 6142be8..041e13d 100644
--- a/server/queue/queue-file/src/main/java/org/apache/james/queue/file/FileCacheableMailQueue.java
+++ b/server/queue/queue-file/src/main/java/org/apache/james/queue/file/FileCacheableMailQueue.java
@@ -51,6 +51,7 @@ import org.apache.commons.io.FileUtils;
 import org.apache.james.lifecycle.api.Disposable;
 import org.apache.james.lifecycle.api.LifecycleUtil;
 import org.apache.james.queue.api.MailQueueItemDecoratorFactory;
+import org.apache.james.queue.api.MailQueueName;
 import org.apache.james.queue.api.ManageableMailQueue;
 import org.apache.james.server.core.MimeMessageCopyOnWriteProxy;
 import org.apache.james.server.core.MimeMessageSource;
@@ -95,14 +96,14 @@ public class FileCacheableMailQueue implements ManageableMailQueue {
     private static final AttributeName NEXT_DELIVERY = AttributeName.of("FileQueueNextDelivery");
     private static final int SPLITCOUNT = 10;
     private static final SecureRandom RANDOM = new SecureRandom();
-    private final String queueName;
+    private final MailQueueName queueName;
     private final Flux<MailQueueItem> flux;
 
-    public FileCacheableMailQueue(MailQueueItemDecoratorFactory mailQueueItemDecoratorFactory, File parentDir, String queuename, boolean sync) throws IOException {
+    public FileCacheableMailQueue(MailQueueItemDecoratorFactory mailQueueItemDecoratorFactory, File parentDir, MailQueueName queuename, boolean sync) throws IOException {
         this.mailQueueItemDecoratorFactory = mailQueueItemDecoratorFactory;
         this.sync = sync;
         this.queueName = queuename;
-        this.queueDir = new File(parentDir, queueName);
+        this.queueDir = new File(parentDir, queueName.asString());
         this.queueDirName = queueDir.getAbsolutePath();
         init();
         this.flux = Mono.defer(this::deQueueOneItem)
@@ -116,7 +117,7 @@ public class FileCacheableMailQueue implements ManageableMailQueue {
     }
 
     @Override
-    public String getName() {
+    public MailQueueName getName() {
         return queueName;
     }
 
diff --git a/server/queue/queue-file/src/main/java/org/apache/james/queue/file/FileMailQueueFactory.java b/server/queue/queue-file/src/main/java/org/apache/james/queue/file/FileMailQueueFactory.java
index 663272a..0587620 100644
--- a/server/queue/queue-file/src/main/java/org/apache/james/queue/file/FileMailQueueFactory.java
+++ b/server/queue/queue-file/src/main/java/org/apache/james/queue/file/FileMailQueueFactory.java
@@ -30,6 +30,7 @@ import org.apache.james.filesystem.api.FileSystem;
 import org.apache.james.queue.api.MailQueue;
 import org.apache.james.queue.api.MailQueueFactory;
 import org.apache.james.queue.api.MailQueueItemDecoratorFactory;
+import org.apache.james.queue.api.MailQueueName;
 import org.apache.james.queue.api.ManageableMailQueue;
 
 import com.github.steveash.guavate.Guavate;
@@ -43,7 +44,7 @@ import com.github.steveash.guavate.Guavate;
 @Deprecated
 public class FileMailQueueFactory implements MailQueueFactory<ManageableMailQueue> {
 
-    private final Map<String, ManageableMailQueue> queues = new ConcurrentHashMap<>();
+    private final Map<MailQueueName, ManageableMailQueue> queues = new ConcurrentHashMap<>();
     private MailQueueItemDecoratorFactory mailQueueActionItemDecoratorFactory;
     private FileSystem fs;
     private boolean sync = true;
@@ -55,7 +56,7 @@ public class FileMailQueueFactory implements MailQueueFactory<ManageableMailQueu
     }
 
     @Override
-    public Set<String> listCreatedMailQueues() {
+    public Set<MailQueueName> listCreatedMailQueues() {
         return queues.values()
             .stream()
             .map(MailQueue::getName)
@@ -75,17 +76,17 @@ public class FileMailQueueFactory implements MailQueueFactory<ManageableMailQueu
     }
 
     @Override
-    public Optional<ManageableMailQueue> getQueue(String name) {
+    public Optional<ManageableMailQueue> getQueue(MailQueueName name) {
         return Optional.ofNullable(queues.get(name));
     }
 
     @Override
-    public ManageableMailQueue createQueue(String name) {
+    public ManageableMailQueue createQueue(MailQueueName name) {
         return queues.computeIfAbsent(name, mailQueueName -> {
             try {
                 return new FileCacheableMailQueue(mailQueueActionItemDecoratorFactory, fs.getFile("file://var/store/queue"), mailQueueName, sync);
             } catch (IOException e) {
-                throw new RuntimeException("Unable to access queue " + mailQueueName, e);
+                throw new RuntimeException("Unable to access queue " + mailQueueName.asString(), e);
             }
         });
     }
diff --git a/server/queue/queue-file/src/test/java/org/apache/james/queue/file/FileCacheableMailQueueTest.java b/server/queue/queue-file/src/test/java/org/apache/james/queue/file/FileCacheableMailQueueTest.java
index 2b479e9..8fe07cc 100644
--- a/server/queue/queue-file/src/test/java/org/apache/james/queue/file/FileCacheableMailQueueTest.java
+++ b/server/queue/queue-file/src/test/java/org/apache/james/queue/file/FileCacheableMailQueueTest.java
@@ -21,6 +21,7 @@ package org.apache.james.queue.file;
 
 import org.apache.james.queue.api.DelayedManageableMailQueueContract;
 import org.apache.james.queue.api.MailQueue;
+import org.apache.james.queue.api.MailQueueName;
 import org.apache.james.queue.api.ManageableMailQueue;
 import org.apache.james.queue.api.RawMailQueueItemDecoratorFactory;
 import org.junit.jupiter.api.AfterEach;
@@ -43,7 +44,7 @@ public class FileCacheableMailQueueTest implements DelayedManageableMailQueueCon
     @BeforeEach
     public void setUp() throws Exception {
         temporaryFolder.create();
-        mailQueue = new FileCacheableMailQueue(new RawMailQueueItemDecoratorFactory(), temporaryFolder.newFolder(), "test", SYNC);
+        mailQueue = new FileCacheableMailQueue(new RawMailQueueItemDecoratorFactory(), temporaryFolder.newFolder(), MailQueueName.of("test"), SYNC);
     }
 
     @AfterEach
diff --git a/server/queue/queue-jms/src/main/java/org/apache/james/queue/jms/JMSCacheableMailQueue.java b/server/queue/queue-jms/src/main/java/org/apache/james/queue/jms/JMSCacheableMailQueue.java
index 5171cae..5c3bb17 100644
--- a/server/queue/queue-jms/src/main/java/org/apache/james/queue/jms/JMSCacheableMailQueue.java
+++ b/server/queue/queue-jms/src/main/java/org/apache/james/queue/jms/JMSCacheableMailQueue.java
@@ -65,6 +65,7 @@ import org.apache.james.metrics.api.TimeMetric;
 import org.apache.james.queue.api.MailPrioritySupport;
 import org.apache.james.queue.api.MailQueue;
 import org.apache.james.queue.api.MailQueueItemDecoratorFactory;
+import org.apache.james.queue.api.MailQueueName;
 import org.apache.james.queue.api.ManageableMailQueue;
 import org.apache.james.server.core.MailImpl;
 import org.apache.james.server.core.MimeMessageCopyOnWriteProxy;
@@ -157,7 +158,7 @@ public class JMSCacheableMailQueue implements ManageableMailQueue, JMSSupport, M
 
     public static final String FORCE_DELIVERY = "FORCE_DELIVERY";
 
-    protected final String queueName;
+    protected final MailQueueName queueName;
     protected final Connection connection;
     protected final MailQueueItemDecoratorFactory mailQueueItemDecoratorFactory;
     protected final Metric enqueuedMailsMetric;
@@ -173,7 +174,7 @@ public class JMSCacheableMailQueue implements ManageableMailQueue, JMSSupport, M
     private final Splitter splitter;
 
     public JMSCacheableMailQueue(ConnectionFactory connectionFactory, MailQueueItemDecoratorFactory mailQueueItemDecoratorFactory,
-                                 String queueName, MetricFactory metricFactory,
+                                 MailQueueName queueName, MetricFactory metricFactory,
                                  GaugeRegistry gaugeRegistry) {
         try {
             connection = connectionFactory.createConnection();
@@ -184,11 +185,11 @@ public class JMSCacheableMailQueue implements ManageableMailQueue, JMSSupport, M
         this.mailQueueItemDecoratorFactory = mailQueueItemDecoratorFactory;
         this.queueName = queueName;
         this.metricFactory = metricFactory;
-        this.enqueuedMailsMetric = metricFactory.generate(ENQUEUED_METRIC_NAME_PREFIX + queueName);
-        this.dequeuedMailsMetric = metricFactory.generate(DEQUEUED_METRIC_NAME_PREFIX + queueName);
+        this.enqueuedMailsMetric = metricFactory.generate(ENQUEUED_METRIC_NAME_PREFIX + queueName.asString());
+        this.dequeuedMailsMetric = metricFactory.generate(DEQUEUED_METRIC_NAME_PREFIX + queueName.asString());
 
         this.gaugeRegistry = gaugeRegistry;
-        this.gaugeRegistry.register(QUEUE_SIZE_METRIC_NAME_PREFIX + queueName, queueSizeGauge());
+        this.gaugeRegistry.register(QUEUE_SIZE_METRIC_NAME_PREFIX + queueName.asString(), queueSizeGauge());
 
         this.joiner = Joiner.on(JAMES_MAIL_SEPARATOR).skipNulls();
         this.splitter = Splitter.on(JAMES_MAIL_SEPARATOR)
@@ -196,7 +197,7 @@ public class JMSCacheableMailQueue implements ManageableMailQueue, JMSSupport, M
                 .trimResults();
         try {
             session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
-            queue = session.createQueue(queueName);
+            queue = session.createQueue(queueName.asString());
             producer = session.createProducer(queue);
         } catch (JMSException e) {
             throw new RuntimeException(e);
@@ -213,7 +214,7 @@ public class JMSCacheableMailQueue implements ManageableMailQueue, JMSSupport, M
     }
 
     @Override
-    public String getName() {
+    public MailQueueName getName() {
         return queueName;
     }
 
@@ -239,7 +240,7 @@ public class JMSCacheableMailQueue implements ManageableMailQueue, JMSSupport, M
         MessageConsumer consumer = null;
         try {
             session = connection.createSession(true, Session.SESSION_TRANSACTED);
-            Queue queue = session.createQueue(queueName);
+            Queue queue = session.createQueue(queueName.asString());
             consumer = session.createConsumer(queue, getMessageSelector());
 
             Message message = consumer.receive(10000);
@@ -264,7 +265,7 @@ public class JMSCacheableMailQueue implements ManageableMailQueue, JMSSupport, M
 
     @Override
     public void enQueue(Mail mail, Duration delay) throws MailQueueException {
-        TimeMetric timeMetric = metricFactory.timer(ENQUEUED_TIMER_METRIC_NAME_PREFIX + queueName);
+        TimeMetric timeMetric = metricFactory.timer(ENQUEUED_TIMER_METRIC_NAME_PREFIX + queueName.asString());
 
         long nextDeliveryTimestamp = computeNextDeliveryTimestamp(delay);
 
@@ -465,7 +466,7 @@ public class JMSCacheableMailQueue implements ManageableMailQueue, JMSSupport, M
 
     @Override
     public String toString() {
-        return "MailQueue:" + queueName;
+        return "MailQueue:" + queueName.asString();
     }
 
     /**
@@ -495,7 +496,7 @@ public class JMSCacheableMailQueue implements ManageableMailQueue, JMSSupport, M
             return Iterators.size(new EnumerationIterator(enumeration));
         } catch (Exception e) {
             LOGGER.error("Unable to get size of queue {}", queueName, e);
-            throw new MailQueueException("Unable to get size of queue " + queueName, e);
+            throw new MailQueueException("Unable to get size of queue " + queueName.asString(), e);
         }
     }
 
@@ -504,7 +505,7 @@ public class JMSCacheableMailQueue implements ManageableMailQueue, JMSSupport, M
         boolean first = true;
         long count = 0;
         try (Session session = connection.createSession(true, Session.SESSION_TRANSACTED)) {
-            Queue queue = session.createQueue(queueName);
+            Queue queue = session.createQueue(queueName.asString());
             try (MessageConsumer consumer = session.createConsumer(queue)) {
                 try (MessageProducer producer = session.createProducer(queue)) {
 
@@ -531,7 +532,7 @@ public class JMSCacheableMailQueue implements ManageableMailQueue, JMSSupport, M
             }
         } catch (Exception e) {
             LOGGER.error("Unable to flush mail", e);
-            throw new MailQueueException("Unable to get size of queue " + queueName, e);
+            throw new MailQueueException("Unable to get size of queue " + queueName.asString(), e);
         }
     }
 
@@ -560,7 +561,7 @@ public class JMSCacheableMailQueue implements ManageableMailQueue, JMSSupport, M
 
         try {
             try (Session session = connection.createSession(true, Session.SESSION_TRANSACTED)) {
-                Queue queue = session.createQueue(queueName);
+                Queue queue = session.createQueue(queueName.asString());
                 try (MessageConsumer consumer = session.createConsumer(queue, selector)) {
                     Message message = null;
                     while (first || message != null) {
@@ -675,7 +676,7 @@ public class JMSCacheableMailQueue implements ManageableMailQueue, JMSSupport, M
             closeBrowser(browser);
 
             LOGGER.error("Unable to browse queue {}", queueName, e);
-            throw new MailQueueException("Unable to browse queue " + queueName, e);
+            throw new MailQueueException("Unable to browse queue " + queueName.asString(), e);
         }
     }
 
diff --git a/server/queue/queue-jms/src/main/java/org/apache/james/queue/jms/JMSMailQueueFactory.java b/server/queue/queue-jms/src/main/java/org/apache/james/queue/jms/JMSMailQueueFactory.java
index 701e0b3..dd2e12e 100644
--- a/server/queue/queue-jms/src/main/java/org/apache/james/queue/jms/JMSMailQueueFactory.java
+++ b/server/queue/queue-jms/src/main/java/org/apache/james/queue/jms/JMSMailQueueFactory.java
@@ -25,6 +25,7 @@ import org.apache.james.metrics.api.GaugeRegistry;
 import org.apache.james.metrics.api.MetricFactory;
 import org.apache.james.queue.api.MailQueueFactory;
 import org.apache.james.queue.api.MailQueueItemDecoratorFactory;
+import org.apache.james.queue.api.MailQueueName;
 import org.apache.james.queue.api.ManageableMailQueue;
 import org.apache.james.queue.library.AbstractMailQueueFactory;
 
@@ -48,7 +49,7 @@ public class JMSMailQueueFactory extends AbstractMailQueueFactory<ManageableMail
     }
 
     @Override
-    protected ManageableMailQueue createCacheableMailQueue(String name) {
+    protected ManageableMailQueue createCacheableMailQueue(MailQueueName name) {
         return new JMSCacheableMailQueue(connectionFactory, mailQueueItemDecoratorFactory, name, metricFactory, gaugeRegistry);
     }
 
diff --git a/server/queue/queue-jms/src/main/java/org/apache/james/queue/library/AbstractMailQueueFactory.java b/server/queue/queue-jms/src/main/java/org/apache/james/queue/library/AbstractMailQueueFactory.java
index 7d41b75..5fa22ef 100644
--- a/server/queue/queue-jms/src/main/java/org/apache/james/queue/library/AbstractMailQueueFactory.java
+++ b/server/queue/queue-jms/src/main/java/org/apache/james/queue/library/AbstractMailQueueFactory.java
@@ -35,6 +35,7 @@ import org.apache.james.lifecycle.api.LifecycleUtil;
 import org.apache.james.queue.api.MailQueue;
 import org.apache.james.queue.api.MailQueueFactory;
 import org.apache.james.queue.api.MailQueueManagementMBean;
+import org.apache.james.queue.api.MailQueueName;
 import org.apache.james.queue.api.ManageableMailQueue;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -51,7 +52,7 @@ public abstract class AbstractMailQueueFactory<T extends MailQueue> implements M
 
     public static final String MBEAN_NAME_QUEUE_PREFIX = "org.apache.james:type=component,name=queue,queue=";
 
-    protected final Map<String, T> queues = new HashMap<>();
+    protected final Map<MailQueueName, T> queues = new HashMap<>();
     private boolean useJMX = true;
     private MBeanServer mbeanServer;
     private final List<String> mbeans = new ArrayList<>();
@@ -71,7 +72,7 @@ public abstract class AbstractMailQueueFactory<T extends MailQueue> implements M
     }
 
     @Override
-    public Set<String> listCreatedMailQueues() {
+    public Set<MailQueueName> listCreatedMailQueues() {
         return queues.values()
             .stream()
             .map(MailQueue::getName)
@@ -95,16 +96,16 @@ public abstract class AbstractMailQueueFactory<T extends MailQueue> implements M
     }
 
     @Override
-    public final synchronized Optional<T> getQueue(String name) {
+    public final synchronized Optional<T> getQueue(MailQueueName name) {
         return Optional.ofNullable(queues.get(name));
     }
 
     @Override
-    public synchronized T createQueue(String name) {
+    public synchronized T createQueue(MailQueueName name) {
         return getQueue(name).orElseGet(() -> createAndRegisterQueue(name));
     }
 
-    private T createAndRegisterQueue(String name) {
+    private T createAndRegisterQueue(MailQueueName name) {
         T queue = createCacheableMailQueue(name);
         if (useJMX) {
             registerMBean(name, queue);
@@ -117,11 +118,11 @@ public abstract class AbstractMailQueueFactory<T extends MailQueue> implements M
      * Create a {@link MailQueue} for the given name that happens to do nothing on close()
      * to be able to cache the instance
      */
-    protected abstract T createCacheableMailQueue(String name);
+    protected abstract T createCacheableMailQueue(MailQueueName name);
 
-    protected synchronized void registerMBean(String queuename, MailQueue queue) {
+    protected synchronized void registerMBean(MailQueueName queuename, MailQueue queue) {
 
-        String mbeanName = MBEAN_NAME_QUEUE_PREFIX + queuename;
+        String mbeanName = MBEAN_NAME_QUEUE_PREFIX + queuename.asString();
         try {
             MailQueueManagementMBean mbean = null;
             if (queue instanceof ManageableMailQueue) {
diff --git a/server/queue/queue-jms/src/test/java/org/apache/james/queue/jms/BrokerExtension.java b/server/queue/queue-jms/src/test/java/org/apache/james/queue/jms/BrokerExtension.java
index 99a6868..f1740a2 100644
--- a/server/queue/queue-jms/src/test/java/org/apache/james/queue/jms/BrokerExtension.java
+++ b/server/queue/queue-jms/src/test/java/org/apache/james/queue/jms/BrokerExtension.java
@@ -25,6 +25,7 @@ import org.apache.activemq.broker.region.policy.PolicyEntry;
 import org.apache.activemq.broker.region.policy.PolicyMap;
 import org.apache.activemq.plugin.StatisticsBrokerPlugin;
 import org.apache.commons.text.RandomStringGenerator;
+import org.apache.james.queue.api.MailQueueName;
 import org.junit.jupiter.api.extension.AfterAllCallback;
 import org.junit.jupiter.api.extension.BeforeAllCallback;
 import org.junit.jupiter.api.extension.ExtensionContext;
@@ -38,10 +39,10 @@ public class BrokerExtension  implements ParameterResolver, BeforeAllCallback, A
 
     public static final String STATISTICS = "Statistics";
 
-    public static String generateRandomQueueName(BrokerService broker) {
+    public static MailQueueName generateRandomQueueName(BrokerService broker) {
         String queueName = new RandomStringGenerator.Builder().withinRange('a', 'z').build().generate(10);
         BrokerExtension.enablePrioritySupport(broker, queueName);
-        return queueName;
+        return MailQueueName.of(queueName);
     }
 
     private static void enablePrioritySupport(BrokerService aBroker, String queueName) {
diff --git a/server/queue/queue-jms/src/test/java/org/apache/james/queue/jms/JMSCacheableMailQueueTest.java b/server/queue/queue-jms/src/test/java/org/apache/james/queue/jms/JMSCacheableMailQueueTest.java
index 061218a..fb0e189 100644
--- a/server/queue/queue-jms/src/test/java/org/apache/james/queue/jms/JMSCacheableMailQueueTest.java
+++ b/server/queue/queue-jms/src/test/java/org/apache/james/queue/jms/JMSCacheableMailQueueTest.java
@@ -29,6 +29,7 @@ import org.apache.james.queue.api.DelayedPriorityMailQueueContract;
 import org.apache.james.queue.api.MailQueue;
 import org.apache.james.queue.api.MailQueueMetricContract;
 import org.apache.james.queue.api.MailQueueMetricExtension;
+import org.apache.james.queue.api.MailQueueName;
 import org.apache.james.queue.api.ManageableMailQueue;
 import org.apache.james.queue.api.PriorityManageableMailQueueContract;
 import org.apache.james.queue.api.RawMailQueueItemDecoratorFactory;
@@ -53,7 +54,7 @@ public class JMSCacheableMailQueueTest implements DelayedManageableMailQueueCont
         RawMailQueueItemDecoratorFactory mailQueueItemDecoratorFactory = new RawMailQueueItemDecoratorFactory();
         MetricFactory metricFactory = metricTestSystem.getMetricFactory();
         GaugeRegistry gaugeRegistry = metricTestSystem.getSpyGaugeRegistry();
-        String queueName = BrokerExtension.generateRandomQueueName(broker);
+        MailQueueName queueName = BrokerExtension.generateRandomQueueName(broker);
         mailQueue = new JMSCacheableMailQueue(connectionFactory, mailQueueItemDecoratorFactory, queueName, metricFactory, gaugeRegistry);
     }
 
diff --git a/server/queue/queue-jms/src/test/java/org/apache/james/queue/library/AbstractMailQueueFactoryTest.java b/server/queue/queue-jms/src/test/java/org/apache/james/queue/library/AbstractMailQueueFactoryTest.java
index 2f25606..ff6f8fc 100644
--- a/server/queue/queue-jms/src/test/java/org/apache/james/queue/library/AbstractMailQueueFactoryTest.java
+++ b/server/queue/queue-jms/src/test/java/org/apache/james/queue/library/AbstractMailQueueFactoryTest.java
@@ -29,14 +29,15 @@ import javax.management.InstanceNotFoundException;
 import javax.management.MBeanServer;
 import javax.management.ObjectName;
 
+import org.apache.james.queue.api.MailQueueName;
 import org.apache.james.queue.api.ManageableMailQueue;
 import org.junit.Before;
 import org.junit.Test;
 
 public class AbstractMailQueueFactoryTest {
-    private static final String QUEUE_1 = "queue1";
-    private static final String QUEUE_2 = "queue2";
-    private static final String QUEUE_3 = "queue3";
+    private static final MailQueueName QUEUE_1 = MailQueueName.of("queue1");
+    private static final MailQueueName QUEUE_2 = MailQueueName.of("queue2");
+    private static final MailQueueName QUEUE_3 = MailQueueName.of("queue3");
 
     private AbstractMailQueueFactory<?> abstractMailQueueFactory;
     private MBeanServer mBeanServer;
@@ -46,7 +47,7 @@ public class AbstractMailQueueFactoryTest {
         mBeanServer = mock(MBeanServer.class);
         abstractMailQueueFactory = new AbstractMailQueueFactory<ManageableMailQueue>() {
             @Override
-            protected ManageableMailQueue createCacheableMailQueue(String name) {
+            protected ManageableMailQueue createCacheableMailQueue(MailQueueName name) {
                 return mock(ManageableMailQueue.class);
             }
         };
@@ -56,7 +57,7 @@ public class AbstractMailQueueFactoryTest {
     @Test
     public void destroyShouldRegisterManageableQueues() throws Exception {
         abstractMailQueueFactory.createQueue(QUEUE_1);
-        verify(mBeanServer).registerMBean(any(MailQueueManagement.class), eq(new ObjectName(AbstractMailQueueFactory.MBEAN_NAME_QUEUE_PREFIX + QUEUE_1)));
+        verify(mBeanServer).registerMBean(any(MailQueueManagement.class), eq(new ObjectName(AbstractMailQueueFactory.MBEAN_NAME_QUEUE_PREFIX + QUEUE_1.asString())));
     }
 
     @Test
@@ -65,16 +66,16 @@ public class AbstractMailQueueFactoryTest {
         abstractMailQueueFactory.createQueue(QUEUE_2);
         abstractMailQueueFactory.createQueue(QUEUE_3);
         abstractMailQueueFactory.destroy();
-        verify(mBeanServer).unregisterMBean(eq(new ObjectName(AbstractMailQueueFactory.MBEAN_NAME_QUEUE_PREFIX + QUEUE_1)));
-        verify(mBeanServer).unregisterMBean(eq(new ObjectName(AbstractMailQueueFactory.MBEAN_NAME_QUEUE_PREFIX + QUEUE_2)));
-        verify(mBeanServer).unregisterMBean(eq(new ObjectName(AbstractMailQueueFactory.MBEAN_NAME_QUEUE_PREFIX + QUEUE_3)));
+        verify(mBeanServer).unregisterMBean(eq(new ObjectName(AbstractMailQueueFactory.MBEAN_NAME_QUEUE_PREFIX + QUEUE_1.asString())));
+        verify(mBeanServer).unregisterMBean(eq(new ObjectName(AbstractMailQueueFactory.MBEAN_NAME_QUEUE_PREFIX + QUEUE_2.asString())));
+        verify(mBeanServer).unregisterMBean(eq(new ObjectName(AbstractMailQueueFactory.MBEAN_NAME_QUEUE_PREFIX + QUEUE_3.asString())));
     }
 
     @Test
     public void unregisterMBeanShouldWork() throws Exception {
         abstractMailQueueFactory.createQueue(QUEUE_1);
-        abstractMailQueueFactory.unregisterMBean(AbstractMailQueueFactory.MBEAN_NAME_QUEUE_PREFIX + QUEUE_1);
-        verify(mBeanServer).unregisterMBean(eq(new ObjectName(AbstractMailQueueFactory.MBEAN_NAME_QUEUE_PREFIX + QUEUE_1)));
+        abstractMailQueueFactory.unregisterMBean(AbstractMailQueueFactory.MBEAN_NAME_QUEUE_PREFIX + QUEUE_1.asString());
+        verify(mBeanServer).unregisterMBean(eq(new ObjectName(AbstractMailQueueFactory.MBEAN_NAME_QUEUE_PREFIX + QUEUE_1.asString())));
     }
 
     @Test
@@ -85,11 +86,11 @@ public class AbstractMailQueueFactoryTest {
         doThrow(InstanceNotFoundException.class)
             .doNothing()
             .when(mBeanServer)
-            .unregisterMBean(new ObjectName(AbstractMailQueueFactory.MBEAN_NAME_QUEUE_PREFIX + QUEUE_1));
+            .unregisterMBean(new ObjectName(AbstractMailQueueFactory.MBEAN_NAME_QUEUE_PREFIX + QUEUE_1.asString()));
         abstractMailQueueFactory.destroy();
-        verify(mBeanServer).unregisterMBean(eq(new ObjectName(AbstractMailQueueFactory.MBEAN_NAME_QUEUE_PREFIX + QUEUE_1)));
-        verify(mBeanServer).unregisterMBean(eq(new ObjectName(AbstractMailQueueFactory.MBEAN_NAME_QUEUE_PREFIX + QUEUE_2)));
-        verify(mBeanServer).unregisterMBean(eq(new ObjectName(AbstractMailQueueFactory.MBEAN_NAME_QUEUE_PREFIX + QUEUE_3)));
+        verify(mBeanServer).unregisterMBean(eq(new ObjectName(AbstractMailQueueFactory.MBEAN_NAME_QUEUE_PREFIX + QUEUE_1.asString())));
+        verify(mBeanServer).unregisterMBean(eq(new ObjectName(AbstractMailQueueFactory.MBEAN_NAME_QUEUE_PREFIX + QUEUE_2.asString())));
+        verify(mBeanServer).unregisterMBean(eq(new ObjectName(AbstractMailQueueFactory.MBEAN_NAME_QUEUE_PREFIX + QUEUE_3.asString())));
     }
 
 }
diff --git a/server/queue/queue-memory/src/main/java/org/apache/james/queue/memory/MemoryMailQueueFactory.java b/server/queue/queue-memory/src/main/java/org/apache/james/queue/memory/MemoryMailQueueFactory.java
index 6c3d8f3..fa949e8 100644
--- a/server/queue/queue-memory/src/main/java/org/apache/james/queue/memory/MemoryMailQueueFactory.java
+++ b/server/queue/queue-memory/src/main/java/org/apache/james/queue/memory/MemoryMailQueueFactory.java
@@ -42,6 +42,7 @@ import org.apache.james.core.MailAddress;
 import org.apache.james.queue.api.MailQueue;
 import org.apache.james.queue.api.MailQueueFactory;
 import org.apache.james.queue.api.MailQueueItemDecoratorFactory;
+import org.apache.james.queue.api.MailQueueName;
 import org.apache.james.queue.api.ManageableMailQueue;
 import org.apache.james.server.core.MailImpl;
 import org.apache.mailet.Mail;
@@ -59,7 +60,7 @@ import reactor.core.scheduler.Schedulers;
 
 public class MemoryMailQueueFactory implements MailQueueFactory<ManageableMailQueue> {
 
-    private final ConcurrentHashMap<String, MemoryCacheableMailQueue> mailQueues;
+    private final ConcurrentHashMap<MailQueueName, MemoryCacheableMailQueue> mailQueues;
     private final MailQueueItemDecoratorFactory mailQueueItemDecoratorFactory;
 
     @Inject
@@ -69,7 +70,7 @@ public class MemoryMailQueueFactory implements MailQueueFactory<ManageableMailQu
     }
 
     @Override
-    public Set<String> listCreatedMailQueues() {
+    public Set<MailQueueName> listCreatedMailQueues() {
         return mailQueues.values()
             .stream()
             .map(MemoryCacheableMailQueue::getName)
@@ -77,22 +78,22 @@ public class MemoryMailQueueFactory implements MailQueueFactory<ManageableMailQu
     }
 
     @Override
-    public Optional<ManageableMailQueue> getQueue(String name) {
+    public Optional<ManageableMailQueue> getQueue(MailQueueName name) {
         return Optional.ofNullable(mailQueues.get(name));
     }
 
     @Override
-    public MemoryCacheableMailQueue createQueue(String name) {
+    public MemoryCacheableMailQueue createQueue(MailQueueName name) {
         return mailQueues.computeIfAbsent(name, mailQueueName -> new MemoryCacheableMailQueue(mailQueueName, mailQueueItemDecoratorFactory));
     }
 
     public static class MemoryCacheableMailQueue implements ManageableMailQueue {
         private final DelayQueue<MemoryMailQueueItem> mailItems;
         private final LinkedBlockingDeque<MemoryMailQueueItem> inProcessingMailItems;
-        private final String name;
+        private final MailQueueName name;
         private final Flux<MailQueueItem> flux;
 
-        public MemoryCacheableMailQueue(String name, MailQueueItemDecoratorFactory mailQueueItemDecoratorFactory) {
+        public MemoryCacheableMailQueue(MailQueueName name, MailQueueItemDecoratorFactory mailQueueItemDecoratorFactory) {
             this.mailItems = new DelayQueue<>();
             this.inProcessingMailItems = new LinkedBlockingDeque<>();
             this.name = name;
@@ -110,7 +111,7 @@ public class MemoryMailQueueFactory implements MailQueueFactory<ManageableMailQu
         }
 
         @Override
-        public String getName() {
+        public MailQueueName getName() {
             return name;
         }
 
diff --git a/server/queue/queue-memory/src/test/java/org/apache/james/queue/memory/MemoryCacheableMailQueueTest.java b/server/queue/queue-memory/src/test/java/org/apache/james/queue/memory/MemoryCacheableMailQueueTest.java
index 5868995..f8b4566 100644
--- a/server/queue/queue-memory/src/test/java/org/apache/james/queue/memory/MemoryCacheableMailQueueTest.java
+++ b/server/queue/queue-memory/src/test/java/org/apache/james/queue/memory/MemoryCacheableMailQueueTest.java
@@ -24,6 +24,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 import org.apache.james.queue.api.DelayedManageableMailQueueContract;
 import org.apache.james.queue.api.MailQueue;
+import org.apache.james.queue.api.MailQueueName;
 import org.apache.james.queue.api.ManageableMailQueue;
 import org.apache.james.queue.api.RawMailQueueItemDecoratorFactory;
 import org.junit.jupiter.api.BeforeEach;
@@ -35,7 +36,7 @@ public class MemoryCacheableMailQueueTest implements DelayedManageableMailQueueC
 
     @BeforeEach
     public void setUp() {
-        mailQueue = new MemoryMailQueueFactory.MemoryCacheableMailQueue("test", new RawMailQueueItemDecoratorFactory());
+        mailQueue = new MemoryMailQueueFactory.MemoryCacheableMailQueue(MailQueueName.of("test"), new RawMailQueueItemDecoratorFactory());
     }
 
     @Override
diff --git a/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueue.java b/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueue.java
index b09fe30..822fc5a 100644
--- a/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueue.java
+++ b/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueue.java
@@ -63,8 +63,8 @@ public class RabbitMQMailQueue implements ManageableMailQueue {
     }
 
     @Override
-    public String getName() {
-        return name.asString();
+    public org.apache.james.queue.api.MailQueueName getName() {
+        return org.apache.james.queue.api.MailQueueName.of(name.asString());
     }
 
     @Override
diff --git a/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueFactory.java b/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueFactory.java
index cc328c0..3805e74 100644
--- a/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueFactory.java
+++ b/server/queue/queue-rabbitmq/src/main/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueFactory.java
@@ -113,7 +113,7 @@ public class RabbitMQMailQueueFactory implements MailQueueFactory<RabbitMQMailQu
 
         private void registerGaugeFor(RabbitMQMailQueue rabbitMQMailQueue) {
             if (configuration.isSizeMetricsEnabled()) {
-                this.gaugeRegistry.register(QUEUE_SIZE_METRIC_NAME_PREFIX + rabbitMQMailQueue.getName(), rabbitMQMailQueue::getSize);
+                this.gaugeRegistry.register(QUEUE_SIZE_METRIC_NAME_PREFIX + rabbitMQMailQueue.getName().asString(), rabbitMQMailQueue::getSize);
             }
         }
     }
@@ -133,21 +133,22 @@ public class RabbitMQMailQueueFactory implements MailQueueFactory<RabbitMQMailQu
     }
 
     @Override
-    public Optional<RabbitMQMailQueue> getQueue(String name) {
-        return getQueueFromRabbitServer(MailQueueName.fromString(name));
+    public Optional<RabbitMQMailQueue> getQueue(org.apache.james.queue.api.MailQueueName name) {
+        return getQueueFromRabbitServer(MailQueueName.fromString(name.asString()));
     }
 
     @Override
-    public RabbitMQMailQueue createQueue(String name) {
-        MailQueueName mailQueueName = MailQueueName.fromString(name);
+    public RabbitMQMailQueue createQueue(org.apache.james.queue.api.MailQueueName name) {
+        MailQueueName mailQueueName = MailQueueName.fromString(name.asString());
         return getQueueFromRabbitServer(mailQueueName)
             .orElseGet(() -> createQueueIntoRabbitServer(mailQueueName));
     }
 
     @Override
-    public Set<String> listCreatedMailQueues() {
+    public Set<org.apache.james.queue.api.MailQueueName> listCreatedMailQueues() {
         return mqManagementApi.listCreatedMailQueueNames()
             .map(MailQueueName::asString)
+            .map(org.apache.james.queue.api.MailQueueName::of)
             .collect(ImmutableSet.toImmutableSet());
     }
 
diff --git a/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueConfigurationChangeTest.java b/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueConfigurationChangeTest.java
index 35792e7..f79622e 100644
--- a/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueConfigurationChangeTest.java
+++ b/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueConfigurationChangeTest.java
@@ -44,6 +44,7 @@ import org.apache.james.eventsourcing.eventstore.cassandra.CassandraEventStoreMo
 import org.apache.james.metrics.api.NoopGaugeRegistry;
 import org.apache.james.metrics.tests.RecordingMetricFactory;
 import org.apache.james.queue.api.MailQueue;
+import org.apache.james.queue.api.MailQueueName;
 import org.apache.james.queue.api.ManageableMailQueue;
 import org.apache.james.queue.api.RawMailQueueItemDecoratorFactory;
 import org.apache.james.queue.rabbitmq.view.RabbitMQMailQueueConfiguration;
@@ -71,7 +72,7 @@ class RabbitMQMailQueueConfigurationChangeTest {
         .updateBrowseStartPace(UPDATE_BROWSE_START_PACE)
         .sliceWindow(ONE_HOUR_SLICE_WINDOW)
         .build();
-    private static final String SPOOL = "spool";
+    private static final MailQueueName SPOOL = MailQueueName.of("spool");
     private static final Instant IN_SLICE_1 = Instant.parse("2007-12-03T10:15:30.00Z");
     private static final Instant IN_SLICE_2 = IN_SLICE_1.plus(1, HOURS);
     private static final Instant IN_SLICE_3 = IN_SLICE_1.plus(2, HOURS);
diff --git a/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueTest.java b/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueTest.java
index 57783d2..1b7e610 100644
--- a/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueTest.java
+++ b/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueTest.java
@@ -79,7 +79,7 @@ class RabbitMQMailQueueTest {
     private static final int THREE_BUCKET_COUNT = 3;
     private static final int UPDATE_BROWSE_START_PACE = 2;
     private static final Duration ONE_HOUR_SLICE_WINDOW = Duration.ofHours(1);
-    private static final String SPOOL = "spool";
+    private static final org.apache.james.queue.api.MailQueueName SPOOL = org.apache.james.queue.api.MailQueueName.of("spool");
     private static final Instant IN_SLICE_1 = Instant.parse("2007-12-03T10:15:30.00Z");
     private static final Instant IN_SLICE_2 = IN_SLICE_1.plus(1, HOURS);
     private static final Instant IN_SLICE_3 = IN_SLICE_1.plus(2, HOURS);
@@ -198,10 +198,10 @@ class RabbitMQMailQueueTest {
 
         @Test
         void mailQueueShouldBeInitializedWhenCreating(CassandraCluster cassandra) {
-            String name = "myQueue";
+            org.apache.james.queue.api.MailQueueName name = org.apache.james.queue.api.MailQueueName.of("myQueue");
             mailQueueFactory.createQueue(name);
 
-            boolean initialized = CassandraMailQueueViewTestFactory.isInitialized(cassandra.getConf(), MailQueueName.fromString(name));
+            boolean initialized = CassandraMailQueueViewTestFactory.isInitialized(cassandra.getConf(), MailQueueName.fromString(name.asString()));
             assertThat(initialized).isTrue();
         }
 


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