5252import org .mockito .MockedStatic ;
5353import org .mockito .Mockito ;
5454import org .mockito .MockitoAnnotations ;
55+ import org .springframework .data .redis .ClusterRedirectException ;
56+ import org .springframework .data .redis .RedisConnectionFailureException ;
57+ import org .springframework .data .redis .RedisSystemException ;
58+ import org .springframework .data .redis .TooManyClusterRedirectionsException ;
5559import org .springframework .data .redis .connection .DefaultMessage ;
5660import org .springframework .data .redis .connection .MessageListener ;
61+ import org .springframework .data .redis .connection .RedisInvalidSubscriptionException ;
5762import org .springframework .data .redis .core .RedisCallback ;
5863import org .springframework .data .redis .core .RedisTemplate ;
5964import org .springframework .data .redis .listener .ChannelTopic ;
6267@ SuppressWarnings ("unchecked" )
6368class ScheduledQueueMessageSchedulerTest extends TestBase {
6469
65- @ InjectMocks private final TestMessageScheduler messageScheduler = new TestMessageScheduler ();
70+ @ InjectMocks
71+ private final TestMessageScheduler messageScheduler = new TestMessageScheduler ();
6672 private final String slowQueue = "slow-queue" ;
6773 private final String fastQueue = "fast-queue" ;
6874 private final QueueDetail slowQueueDetail = TestUtils .createQueueDetail (slowQueue );
6975 private final QueueDetail fastQueueDetail = TestUtils .createQueueDetail (fastQueue );
70- @ Mock private RqueueSchedulerConfig rqueueSchedulerConfig ;
71- @ Mock private RqueueConfig rqueueConfig ;
72- @ Mock private RedisTemplate <String , Long > redisTemplate ;
73- @ Mock private RqueueRedisListenerContainerFactory rqueueRedisListenerContainerFactory ;
76+ @ Mock
77+ private RqueueSchedulerConfig rqueueSchedulerConfig ;
78+ @ Mock
79+ private RqueueConfig rqueueConfig ;
80+ @ Mock
81+ private RedisTemplate <String , Long > redisTemplate ;
82+ @ Mock
83+ private RqueueRedisListenerContainerFactory rqueueRedisListenerContainerFactory ;
7484
7585 @ BeforeEach
7686 public void init () {
@@ -230,10 +240,10 @@ void startSubmitsTaskAndThatGetsExecuted() throws Exception {
230240 doReturn (1000L ).when (rqueueSchedulerConfig ).getScheduledMessageTimeIntervalInMilli ();
231241 AtomicInteger counter = new AtomicInteger (0 );
232242 doAnswer (
233- invocation -> {
234- counter .incrementAndGet ();
235- return null ;
236- })
243+ invocation -> {
244+ counter .incrementAndGet ();
245+ return null ;
246+ })
237247 .when (redisTemplate )
238248 .execute (any (RedisCallback .class ));
239249 messageScheduler .onApplicationEvent (new RqueueBootstrapEvent ("Test" , true ));
@@ -251,10 +261,10 @@ void onCompletionOfExistingTaskNewTaskShouldBeSubmitted() throws Exception {
251261 doReturn (1000L ).when (rqueueSchedulerConfig ).getScheduledMessageTimeIntervalInMilli ();
252262 AtomicInteger counter = new AtomicInteger (0 );
253263 doAnswer (
254- invocation -> {
255- counter .incrementAndGet ();
256- return null ;
257- })
264+ invocation -> {
265+ counter .incrementAndGet ();
266+ return null ;
267+ })
258268 .when (redisTemplate )
259269 .execute (any (RedisCallback .class ));
260270 TestTaskScheduler scheduler = new TestTaskScheduler ();
@@ -269,6 +279,68 @@ void onCompletionOfExistingTaskNewTaskShouldBeSubmitted() throws Exception {
269279 }
270280 }
271281
282+ @ Test
283+ void taskShouldBeScheduledOnFailure () throws Exception {
284+ try (MockedStatic <ThreadUtils > threadUtils = Mockito .mockStatic (ThreadUtils .class )) {
285+ doReturn (1 ).when (rqueueSchedulerConfig ).getScheduledMessageThreadPoolSize ();
286+ doReturn (true ).when (rqueueSchedulerConfig ).isAutoStart ();
287+ doReturn (true ).when (rqueueSchedulerConfig ).isEnabled ();
288+ doReturn (true ).when (rqueueSchedulerConfig ).isRedisEnabled ();
289+ doReturn (10000L ).when (rqueueSchedulerConfig ).getMaxMessageMoverDelay ();
290+ AtomicInteger counter = new AtomicInteger (0 );
291+ doAnswer (
292+ invocation -> {
293+ counter .incrementAndGet ();
294+ throw new RedisSystemException ("Something is not correct" , new NullPointerException ("oops!" ));
295+ })
296+ .when (redisTemplate )
297+ .execute (any (RedisCallback .class ));
298+ TestTaskScheduler scheduler = new TestTaskScheduler ();
299+ threadUtils
300+ .when (() -> ThreadUtils .createTaskScheduler (1 , "scheduledQueueMsgScheduler-" , 60 ))
301+ .thenReturn (scheduler );
302+ messageScheduler .onApplicationEvent (new RqueueBootstrapEvent ("Test" , true ));
303+ waitFor (() -> counter .get () >= 1 , "scripts are getting executed" );
304+ sleep (10 );
305+ messageScheduler .destroy ();
306+ assertTrue (scheduler .submittedTasks () >= 2 );
307+ }
308+ }
309+
310+ @ Test
311+ void continuousTaskFailTask () throws Exception {
312+ try (MockedStatic <ThreadUtils > threadUtils = Mockito .mockStatic (ThreadUtils .class )) {
313+ doReturn (1 ).when (rqueueSchedulerConfig ).getScheduledMessageThreadPoolSize ();
314+ doReturn (true ).when (rqueueSchedulerConfig ).isAutoStart ();
315+ doReturn (true ).when (rqueueSchedulerConfig ).isEnabled ();
316+ doReturn (true ).when (rqueueSchedulerConfig ).isRedisEnabled ();
317+ doReturn (100L ).when (rqueueSchedulerConfig ).getMaxMessageMoverDelay ();
318+ AtomicInteger counter = new AtomicInteger (0 );
319+ doAnswer (
320+ invocation -> {
321+ int count = counter .incrementAndGet ();
322+ if (count % 3 == 0 ){
323+ throw new RedisSystemException ("Something is not correct" , new NullPointerException ("oops!" ));
324+ }
325+ if (count % 3 == 1 ){
326+ throw new RedisConnectionFailureException ("Unknown host" );
327+ }
328+ throw new ClusterRedirectException (3 , "localhost" , 9004 , new TooManyClusterRedirectionsException ("too many redirects" ) );
329+ })
330+ .when (redisTemplate )
331+ .execute (any (RedisCallback .class ));
332+ TestTaskScheduler scheduler = new TestTaskScheduler ();
333+ threadUtils
334+ .when (() -> ThreadUtils .createTaskScheduler (1 , "scheduledQueueMsgScheduler-" , 60 ))
335+ .thenReturn (scheduler );
336+ messageScheduler .onApplicationEvent (new RqueueBootstrapEvent ("Test" , true ));
337+ waitFor (() -> counter .get () >= 10 , "scripts are getting executed" );
338+ sleep (10 );
339+ messageScheduler .destroy ();
340+ assertTrue (scheduler .submittedTasks () >= 11 );
341+ }
342+ }
343+
272344 @ Test
273345 void onMessageListenerTest () throws Exception {
274346 doReturn (true ).when (rqueueSchedulerConfig ).isEnabled ();
0 commit comments