2 changed files with 59 additions and 13 deletions
@ -0,0 +1,51 @@ |
|||
package org.thingsboard.server.service.queue; |
|||
|
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.junit.Assert; |
|||
import org.junit.Test; |
|||
import org.junit.runner.RunWith; |
|||
import org.mockito.Mockito; |
|||
import org.mockito.runners.MockitoJUnitRunner; |
|||
import org.thingsboard.server.gen.transport.TransportProtos; |
|||
import org.thingsboard.server.queue.common.TbProtoQueueMsg; |
|||
import org.thingsboard.server.service.queue.processing.TbRuleEngineSubmitStrategy; |
|||
|
|||
import java.util.UUID; |
|||
import java.util.concurrent.ConcurrentHashMap; |
|||
import java.util.concurrent.ConcurrentMap; |
|||
import java.util.concurrent.ExecutorService; |
|||
import java.util.concurrent.Executors; |
|||
import java.util.concurrent.TimeUnit; |
|||
|
|||
import static org.mockito.Mockito.mock; |
|||
import static org.mockito.Mockito.when; |
|||
|
|||
@Slf4j |
|||
@RunWith(MockitoJUnitRunner.class) |
|||
public class ProcessingAttemptContextTest { |
|||
|
|||
@Test |
|||
public void testHighConcurrencyCase() throws InterruptedException { |
|||
TbRuleEngineSubmitStrategy strategyMock = mock(TbRuleEngineSubmitStrategy.class); |
|||
int msgCount = 1000; |
|||
int parallelCount = 5; |
|||
ExecutorService executorService = Executors.newFixedThreadPool(parallelCount); |
|||
try { |
|||
ConcurrentMap<UUID, TbProtoQueueMsg<TransportProtos.ToRuleEngineMsg>> messages = new ConcurrentHashMap<>(); |
|||
for (int i = 0; i < msgCount; i++) { |
|||
messages.put(UUID.randomUUID(), new TbProtoQueueMsg<>(UUID.randomUUID(), null)); |
|||
} |
|||
when(strategyMock.getPendingMap()).thenReturn(messages); |
|||
ProcessingAttemptContext context = new ProcessingAttemptContext(strategyMock); |
|||
for (UUID uuid : messages.keySet()) { |
|||
for (int i = 0; i < parallelCount; i++) { |
|||
executorService.submit(() -> context.onSuccess(uuid)); |
|||
} |
|||
} |
|||
Assert.assertTrue(context.await(10, TimeUnit.SECONDS)); |
|||
Mockito.verify(strategyMock, Mockito.times(msgCount)).onSuccess(Mockito.any(UUID.class)); |
|||
} finally { |
|||
executorService.shutdownNow(); |
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue