66
77import java .time .Duration ;
88import java .util .Collection ;
9+ import java .util .Map ;
910import java .util .Objects ;
11+ import java .util .Optional ;
1012import java .util .Set ;
1113import java .util .concurrent .ConcurrentHashMap ;
1214import java .util .concurrent .Executors ;
1517import java .util .concurrent .TimeUnit ;
1618import java .util .concurrent .atomic .AtomicBoolean ;
1719import java .util .concurrent .atomic .AtomicReference ;
20+ import java .util .stream .Collectors ;
1821
1922import org .slf4j .Logger ;
2023import org .slf4j .LoggerFactory ;
@@ -28,6 +31,7 @@ public class QueueService implements AutoCloseable {
2831 private final AtomicReference <ScheduledExecutorService > execServiceRef = new AtomicReference <>();
2932 private final AtomicBoolean paused = new AtomicBoolean (false );
3033 private final Set <String > dbListeningQueues = ConcurrentHashMap .newKeySet ();
34+ private volatile Map <String , Queue > dynamicQueueMap = Map .of ();
3135
3236 private final SystemDatabase systemDatabase ;
3337 private final DBOSExecutor dbosExecutor ;
@@ -80,6 +84,10 @@ public boolean isStopped() {
8084 return this .execServiceRef .get () == null ;
8185 }
8286
87+ public Optional <Queue > findDynamicQueue (String queueName ) {
88+ return Optional .ofNullable (dynamicQueueMap .get (queueName ));
89+ }
90+
8391 private boolean isListening (String queueName ) {
8492 return queueName .equals (Constants .DBOS_INTERNAL_QUEUE )
8593 || listenQueues .isEmpty ()
@@ -102,6 +110,8 @@ private void pollDynamicQueues() {
102110 if (execServiceRef .get () == null ) return ;
103111
104112 var dbQueues = systemDatabase .listQueues ();
113+ dynamicQueueMap =
114+ dbQueues .stream ().collect (Collectors .toUnmodifiableMap (Queue ::name , q -> q ));
105115 if (logger .isDebugEnabled ()) {
106116 logger .debug ("pollDynamicQueues found {} queues" , dbQueues .size ());
107117 for (var q : dbQueues ) {
0 commit comments