}
@Test
public void testRequestVariableLifecycle2() throws Exception {
// simulate request lifecycle
HystrixRequestContext requestContext = HystrixRequestContext.initializeContext();
final TestCollapserTimer timer = new TestCollapserTimer();
final ConcurrentLinkedQueue<Future<String>> responses = new ConcurrentLinkedQueue<Future<String>>();
ConcurrentLinkedQueue<Thread> threads = new ConcurrentLinkedQueue<Thread>();
// kick off work (simulating a single request with multiple threads)
for (int t = 0; t < 5; t++) {
Thread th = new Thread(new HystrixContextRunnable(HystrixPlugins.getInstance().getConcurrencyStrategy(), new Runnable() {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
responses.add(new TestRequestCollapser(timer, counter, 1).queue());
}
}
}));
threads.add(th);
th.start();
}
for (Thread th : threads) {
// wait for each thread to finish
th.join();
}
// we expect 5 threads * 100 responses each
assertEquals(500, responses.size());
for (Future<String> f : responses) {
// they should not be done yet because the counter hasn't incremented
assertFalse(f.isDone());
}
timer.incrementTime(5);
Future<String> response2 = new TestRequestCollapser(timer, counter, 2).queue();
timer.incrementTime(8);
// should execute here
Future<String> response3 = new TestRequestCollapser(timer, counter, 3).queue();
timer.incrementTime(6);
Future<String> response4 = new TestRequestCollapser(timer, counter, 4).queue();
timer.incrementTime(8);
// should execute here
Future<String> response5 = new TestRequestCollapser(timer, counter, 5).queue();
timer.incrementTime(10);
// should execute here
// wait for all tasks to complete
for (Future<String> f : responses) {
assertEquals("1", f.get());
}
assertEquals("2", response2.get());
assertEquals("3", response3.get());
assertEquals("4", response4.get());
assertEquals("5", response5.get());
// each task should have been executed 3 times
for (TestCollapserTimer.ATask t : timer.tasks) {
assertEquals(3, t.task.count.get());
}
// simulate request lifecycle
requestContext.shutdown();
HystrixRequestVariableHolder<RequestCollapser<?, ?, ?>> rv = RequestCollapserFactory.getRequestVariable(new TestRequestCollapser(timer, counter, 1).getCollapserKey().name());
assertNotNull(rv);
// they should have all been removed as part of ThreadContext.remove()