Skip to content

Commit 9aacb23

Browse files
committed
Default NATS prefixes: streams "rqueue-js-", subjects "rqueue.js."
Old defaults were "rqueue-" / "rqueue." which made it hard to tell JetStream message streams apart from KV-backed buckets (also stored as streams under "KV_rqueue-…") and from any other Rqueue-shaped resource sharing the JetStream account. Inserting "-js-" / ".js." into the defaults is purely operational — it costs nothing at runtime and makes `nats stream ls` output self-documenting: rqueue-js-orders <- queue stream rqueue-js-orders-high <- priority sub-queue rqueue-js-orders-dlq <- DLQ KV_rqueue-jobs <- KV bucket (unchanged) KV_rqueue-locks <- KV bucket (unchanged) KV bucket names keep the plain "rqueue-" prefix because their operator-facing name is the bucket name (`nats kv ls`), not the underlying stream — and the bucket-vs-stream distinction is already visible from the `KV_` prefix that JetStream itself adds. Both defaults are still overridable via `rqueue.nats.naming.streamPrefix` / `subjectPrefix` for users with their own naming convention. Tests that hard-coded the old subject ("rqueue.orders") or stream ("rqueue-failing-dlq", "rqueue-custom-consumer") names in JetStreamMessageBrokerUnitTest, NatsRetryAndDlqE2EIT, and NatsConsumerNameOverrideE2EIT are updated to the new defaults. README's "Streams per queue" table is updated to match. Assisted-By: Claude Code
1 parent 66042d2 commit 9aacb23

7 files changed

Lines changed: 25 additions & 20 deletions

File tree

README.md

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -284,17 +284,21 @@ Each registered queue produces **one main stream**, **one DLQ stream** (when
284284
sub-queue** the queue declares. Only the main queue has a DLQ — priority sub-queues fan out to
285285
their own streams but share the parent queue's DLQ wiring through `RqueueExecutor`.
286286

287-
| Queue shape | Stream count | Names (with default prefixes) |
288-
|-------------------------------|--------------|-------------------------------------------------------------------------|
289-
| Plain queue, DLQ on (default) | 2 | `rqueue-<queue>`, `rqueue-<queue>-dlq` |
290-
| Plain queue, DLQ off | 1 | `rqueue-<queue>` |
291-
| Queue with N priorities, DLQ on | N + 2 | `rqueue-<queue>`, `rqueue-<queue>-<p1>``rqueue-<queue>-<pN>`, `rqueue-<queue>-dlq` |
287+
| Queue shape | Stream count | Names (with default prefixes) |
288+
|-------------------------------|--------------|------------------------------------------------------------------------------------------------|
289+
| Plain queue, DLQ on (default) | 2 | `rqueue-js-<queue>`, `rqueue-js-<queue>-dlq` |
290+
| Plain queue, DLQ off | 1 | `rqueue-js-<queue>` |
291+
| Queue with N priorities, DLQ on | N + 2 | `rqueue-js-<queue>`, `rqueue-js-<queue>-<p1>``rqueue-js-<queue>-<pN>`, `rqueue-js-<queue>-dlq` |
292292

293293
The naming scheme is `<streamPrefix><queueName>[-<priority>][<dlqStreamSuffix>]`, configurable via
294-
`rqueue.nats.naming.streamPrefix` (default `rqueue-`) and `rqueue.nats.naming.dlqSuffix` (default
295-
`-dlq`). Subjects follow the same shape with `.` separators: `<subjectPrefix><queueName>[.<priority>][<dlqSubjectSuffix>]`.
296-
Stream defaults (replicas, storage, retention, duplicate window, max msgs/bytes) come from
297-
`rqueue.nats.stream.*`.
294+
`rqueue.nats.naming.streamPrefix` (default `rqueue-js-`) and `rqueue.nats.naming.dlqSuffix`
295+
(default `-dlq`). The `-js-` segment makes Rqueue's message streams easy to distinguish at a
296+
glance from the JetStream-backed KV buckets below (which keep the plain `rqueue-` prefix because
297+
that's the operator-facing bucket name, not a stream name) and from anything else sharing the
298+
JetStream account. Subjects follow the same shape with `.` separators:
299+
`<subjectPrefix><queueName>[.<priority>][<dlqSubjectSuffix>]` (default subject prefix
300+
`rqueue.js.`). Stream defaults (replicas, storage, retention, duplicate window, max msgs/bytes)
301+
come from `rqueue.nats.stream.*`.
298302

299303
### KV buckets (one set, shared across all queues)
300304

rqueue-nats/src/main/java/com/github/sonus21/rqueue/nats/RqueueNatsConfig.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@
2626
@Accessors(chain = true)
2727
public class RqueueNatsConfig {
2828

29-
private String streamPrefix = "rqueue-";
30-
private String subjectPrefix = "rqueue.";
29+
private String streamPrefix = "rqueue-js-";
30+
private String subjectPrefix = "rqueue.js.";
3131
private String dlqStreamSuffix = "-dlq";
3232
private String dlqSubjectSuffix = ".dlq";
3333

rqueue-nats/src/main/java/com/github/sonus21/rqueue/nats/internal/NatsProvisioner.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ public void ensureConsumer(
145145
}
146146
}
147147

148-
/** Ensure a DLQ stream exists capturing dead-letter subjects (e.g. "rqueue.*.dlq"). */
148+
/** Ensure a DLQ stream exists capturing dead-letter subjects (e.g. "rqueue.js.*.dlq"). */
149149
public void ensureDlqStream(String dlqStreamName, List<String> dlqSubjects) {
150150
if (!config.isAutoCreateDlqStream()) {
151151
return;

rqueue-nats/src/test/java/com/github/sonus21/rqueue/nats/JetStreamMessageBrokerUnitTest.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
import com.github.sonus21.rqueue.core.RqueueMessage;
2424
import com.github.sonus21.rqueue.listener.QueueDetail;
25+
import com.github.sonus21.rqueue.nats.js.JetStreamMessageBroker;
2526
import io.nats.client.Connection;
2627
import io.nats.client.Dispatcher;
2728
import io.nats.client.JetStream;
@@ -75,7 +76,7 @@ void enqueue_publishesToPrefixedSubject() throws Exception {
7576
.thenReturn(mock(PublishAck.class));
7677
f.broker.enqueue(
7778
queueNamed("orders"), RqueueMessage.builder().id("m1").message("hi").build());
78-
verify(f.js, times(1)).publish(eq("rqueue.orders"), any(Headers.class), any(byte[].class));
79+
verify(f.js, times(1)).publish(eq("rqueue.js.orders"), any(Headers.class), any(byte[].class));
7980
}
8081

8182
@Test
@@ -87,7 +88,7 @@ void enqueueWithPriority_appendsPrioritySuffixToSubject() throws Exception {
8788
queueNamed("orders"),
8889
"high",
8990
RqueueMessage.builder().id("m1").message("hi").build());
90-
verify(f.js, times(1)).publish(eq("rqueue.orders.high"), any(Headers.class), any(byte[].class));
91+
verify(f.js, times(1)).publish(eq("rqueue.js.orders.high"), any(Headers.class), any(byte[].class));
9192
}
9293

9394
@Test
@@ -97,7 +98,7 @@ void enqueueWithEmptyPriority_fallsBackToUnsuffixedSubject() throws Exception {
9798
.thenReturn(mock(PublishAck.class));
9899
f.broker.enqueue(
99100
queueNamed("orders"), "", RqueueMessage.builder().id("m1").message("hi").build());
100-
verify(f.js, times(1)).publish(eq("rqueue.orders"), any(Headers.class), any(byte[].class));
101+
verify(f.js, times(1)).publish(eq("rqueue.js.orders"), any(Headers.class), any(byte[].class));
101102
}
102103

103104
@Test
@@ -168,7 +169,7 @@ void enqueueReactive_completesWhenPublishFutureCompletes() {
168169
StepVerifier.create(f.broker.enqueueReactive(
169170
queueNamed("orders"), RqueueMessage.builder().id("m1").message("hi").build()))
170171
.verifyComplete();
171-
verify(f.js, times(1)).publishAsync(eq("rqueue.orders"), any(Headers.class), any(byte[].class));
172+
verify(f.js, times(1)).publishAsync(eq("rqueue.js.orders"), any(Headers.class), any(byte[].class));
172173
}
173174

174175
@Test

rqueue-spring-boot-starter/src/main/java/com/github/sonus21/rqueue/spring/boot/RqueueNatsProperties.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,8 @@ public static class Consumer {
8686
@Getter
8787
@Setter
8888
public static class Naming {
89-
private String streamPrefix = "rqueue-";
90-
private String subjectPrefix = "rqueue.";
89+
private String streamPrefix = "rqueue-js-";
90+
private String subjectPrefix = "rqueue.js.";
9191
private String dlqSuffix = "-dlq";
9292
}
9393
}

rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/integration/NatsConsumerNameOverrideE2EIT.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ void overriddenConsumerNameIsRegisteredOnTheStream() throws Exception {
6060
enqueuer.enqueue("custom-consumer", "hello");
6161
assertThat(listener.latch.await(20, TimeUnit.SECONDS)).isTrue();
6262

63-
ConsumerInfo info = jsm.getConsumerInfo("rqueue-custom-consumer", "my-custom-consumer");
63+
ConsumerInfo info = jsm.getConsumerInfo("rqueue-js-custom-consumer", "my-custom-consumer");
6464
assertThat(info).isNotNull();
6565
assertThat(info.getName()).isEqualTo("my-custom-consumer");
6666
}

rqueue-spring-boot-starter/src/test/java/com/github/sonus21/rqueue/spring/boot/integration/NatsRetryAndDlqE2EIT.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ void exhaustedMessageLandsOnDlqStream() {
6868
Awaitility.await().atMost(Duration.ofSeconds(60)).until(() -> listener.attempts.get() >= 2);
6969

7070
Awaitility.await().atMost(Duration.ofSeconds(30)).untilAsserted(() -> {
71-
StreamInfo dlq = jsm.getStreamInfo("rqueue-failing-dlq");
71+
StreamInfo dlq = jsm.getStreamInfo("rqueue-js-failing-dlq");
7272
assertThat(dlq.getStreamState().getMsgCount()).isGreaterThanOrEqualTo(1);
7373
});
7474
}

0 commit comments

Comments
 (0)