Search in sources :

Example 81 with Subscription

use of rx.Subscription in project Hystrix by Netflix.

the class HystrixCollapserTest method testUnsubscribeFromSomeDuplicateArgsDoesNotRemoveFromBatch.

@Test
public void testUnsubscribeFromSomeDuplicateArgsDoesNotRemoveFromBatch() throws Exception {
    final int NUM = 10;
    List<Observable<Integer>> observables = new ArrayList<Observable<Integer>>();
    for (int i = 0; i < NUM; i++) {
        MyCollapser c = new MyCollapser("5", true);
        observables.add(c.toObservable());
    }
    List<TestSubscriber<Integer>> subscribers = new ArrayList<TestSubscriber<Integer>>();
    List<Subscription> subscriptions = new ArrayList<Subscription>();
    for (final Observable<Integer> o : observables) {
        final TestSubscriber<Integer> sub = new TestSubscriber<Integer>();
        subscribers.add(sub);
        Subscription s = o.subscribe(sub);
        subscriptions.add(s);
    }
    //unsubscribe from all but 1
    for (int i = 0; i < NUM - 1; i++) {
        Subscription s = subscriptions.get(i);
        s.unsubscribe();
    }
    Thread.sleep(100);
    //all subscribers with an active subscription should receive the same value
    for (TestSubscriber<Integer> sub : subscribers) {
        if (!sub.isUnsubscribed()) {
            sub.awaitTerminalEvent(1000, TimeUnit.MILLISECONDS);
            System.out.println("Subscriber received : " + sub.getOnNextEvents());
            sub.assertNoErrors();
            sub.assertValues(5);
        } else {
            System.out.println("Subscriber is unsubscribed");
        }
    }
}
Also used : AtomicInteger(java.util.concurrent.atomic.AtomicInteger) ArrayList(java.util.ArrayList) TestSubscriber(rx.observers.TestSubscriber) Subscription(rx.Subscription) Observable(rx.Observable) Test(org.junit.Test)

Example 82 with Subscription

use of rx.Subscription in project Hystrix by Netflix.

the class HystrixCollapserTest method testEarlyUnsubscribeExecutedViaToObservable.

@Test
public void testEarlyUnsubscribeExecutedViaToObservable() throws Exception {
    TestCollapserTimer timer = new TestCollapserTimer();
    HystrixCollapser<List<String>, String, String> collapser1 = new TestRequestCollapser(timer, 1);
    Observable<String> response1 = collapser1.toObservable();
    HystrixCollapser<List<String>, String, String> collapser2 = new TestRequestCollapser(timer, 2);
    Observable<String> response2 = collapser2.toObservable();
    final CountDownLatch latch1 = new CountDownLatch(1);
    final CountDownLatch latch2 = new CountDownLatch(1);
    final AtomicReference<String> value1 = new AtomicReference<String>(null);
    final AtomicReference<String> value2 = new AtomicReference<String>(null);
    Subscription s1 = response1.doOnUnsubscribe(new Action0() {

        @Override
        public void call() {
            System.out.println(System.currentTimeMillis() + " : s1 Unsubscribed!");
            latch1.countDown();
        }
    }).subscribe(new Subscriber<String>() {

        @Override
        public void onCompleted() {
            System.out.println(System.currentTimeMillis() + " : s1 OnCompleted");
            latch1.countDown();
        }

        @Override
        public void onError(Throwable e) {
            System.out.println(System.currentTimeMillis() + " : s1 OnError : " + e);
            latch1.countDown();
        }

        @Override
        public void onNext(String s) {
            System.out.println(System.currentTimeMillis() + " : s1 OnNext : " + s);
            value1.set(s);
        }
    });
    Subscription s2 = response2.doOnUnsubscribe(new Action0() {

        @Override
        public void call() {
            System.out.println(System.currentTimeMillis() + " : s2 Unsubscribed!");
            latch2.countDown();
        }
    }).subscribe(new Subscriber<String>() {

        @Override
        public void onCompleted() {
            System.out.println(System.currentTimeMillis() + " : s2 OnCompleted");
            latch2.countDown();
        }

        @Override
        public void onError(Throwable e) {
            System.out.println(System.currentTimeMillis() + " : s2 OnError : " + e);
            latch2.countDown();
        }

        @Override
        public void onNext(String s) {
            System.out.println(System.currentTimeMillis() + " : s2 OnNext : " + s);
            value2.set(s);
        }
    });
    s1.unsubscribe();
    // let time pass that equals the default delay/period
    timer.incrementTime(10);
    assertTrue(latch1.await(1000, TimeUnit.MILLISECONDS));
    assertTrue(latch2.await(1000, TimeUnit.MILLISECONDS));
    assertNull(value1.get());
    assertEquals("2", value2.get());
    System.out.println("ReqLog : " + HystrixRequestLog.getCurrentRequest().getExecutedCommandsAsString());
    assertEquals(1, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size());
    HystrixCollapserMetrics metrics = collapser1.getMetrics();
    assertSame(metrics, collapser2.getMetrics());
    HystrixInvokableInfo<?> command = HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().iterator().next();
    //1 should have been removed from batch
    assertEquals(1, command.getNumberCollapsed());
}
Also used : Action0(rx.functions.Action0) AtomicReference(java.util.concurrent.atomic.AtomicReference) CountDownLatch(java.util.concurrent.CountDownLatch) ArrayList(java.util.ArrayList) List(java.util.List) Subscription(rx.Subscription) Test(org.junit.Test)

Example 83 with Subscription

use of rx.Subscription in project Hystrix by Netflix.

the class HystrixCollapserTest method testEarlyUnsubscribeExecutedViaObserve.

@Test
public void testEarlyUnsubscribeExecutedViaObserve() throws Exception {
    TestCollapserTimer timer = new TestCollapserTimer();
    HystrixCollapser<List<String>, String, String> collapser1 = new TestRequestCollapser(timer, 1);
    Observable<String> response1 = collapser1.observe();
    HystrixCollapser<List<String>, String, String> collapser2 = new TestRequestCollapser(timer, 2);
    Observable<String> response2 = collapser2.observe();
    final CountDownLatch latch1 = new CountDownLatch(1);
    final CountDownLatch latch2 = new CountDownLatch(1);
    final AtomicReference<String> value1 = new AtomicReference<String>(null);
    final AtomicReference<String> value2 = new AtomicReference<String>(null);
    Subscription s1 = response1.doOnUnsubscribe(new Action0() {

        @Override
        public void call() {
            System.out.println(System.currentTimeMillis() + " : s1 Unsubscribed!");
            latch1.countDown();
        }
    }).subscribe(new Subscriber<String>() {

        @Override
        public void onCompleted() {
            System.out.println(System.currentTimeMillis() + " : s1 OnCompleted");
            latch1.countDown();
        }

        @Override
        public void onError(Throwable e) {
            System.out.println(System.currentTimeMillis() + " : s1 OnError : " + e);
            latch1.countDown();
        }

        @Override
        public void onNext(String s) {
            System.out.println(System.currentTimeMillis() + " : s1 OnNext : " + s);
            value1.set(s);
        }
    });
    Subscription s2 = response2.doOnUnsubscribe(new Action0() {

        @Override
        public void call() {
            System.out.println(System.currentTimeMillis() + " : s2 Unsubscribed!");
            latch2.countDown();
        }
    }).subscribe(new Subscriber<String>() {

        @Override
        public void onCompleted() {
            System.out.println(System.currentTimeMillis() + " : s2 OnCompleted");
            latch2.countDown();
        }

        @Override
        public void onError(Throwable e) {
            System.out.println(System.currentTimeMillis() + " : s2 OnError : " + e);
            latch2.countDown();
        }

        @Override
        public void onNext(String s) {
            System.out.println(System.currentTimeMillis() + " : s2 OnNext : " + s);
            value2.set(s);
        }
    });
    s1.unsubscribe();
    // let time pass that equals the default delay/period
    timer.incrementTime(10);
    assertTrue(latch1.await(1000, TimeUnit.MILLISECONDS));
    assertTrue(latch2.await(1000, TimeUnit.MILLISECONDS));
    assertNull(value1.get());
    assertEquals("2", value2.get());
    System.out.println("ReqLog : " + HystrixRequestLog.getCurrentRequest().getExecutedCommandsAsString());
    assertEquals(1, HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().size());
    HystrixCollapserMetrics metrics = collapser1.getMetrics();
    assertSame(metrics, collapser2.getMetrics());
    HystrixInvokableInfo<?> command = HystrixRequestLog.getCurrentRequest().getAllExecutedCommands().iterator().next();
    //1 should have been removed from batch
    assertEquals(1, command.getNumberCollapsed());
}
Also used : Action0(rx.functions.Action0) AtomicReference(java.util.concurrent.atomic.AtomicReference) CountDownLatch(java.util.concurrent.CountDownLatch) ArrayList(java.util.ArrayList) List(java.util.List) Subscription(rx.Subscription) Test(org.junit.Test)

Example 84 with Subscription

use of rx.Subscription in project Hystrix by Netflix.

the class HystrixCommandTest method testRequestThenCacheHitAndCacheHitUnsubscribed.

@Test
public void testRequestThenCacheHitAndCacheHitUnsubscribed() {
    AsyncCacheableCommand original = new AsyncCacheableCommand("foo");
    AsyncCacheableCommand fromCache = new AsyncCacheableCommand("foo");
    final AtomicReference<Boolean> originalValue = new AtomicReference<Boolean>(null);
    final AtomicReference<Boolean> fromCacheValue = new AtomicReference<Boolean>(null);
    final CountDownLatch originalLatch = new CountDownLatch(1);
    final CountDownLatch fromCacheLatch = new CountDownLatch(1);
    Observable<Boolean> originalObservable = original.toObservable();
    Observable<Boolean> fromCacheObservable = fromCache.toObservable();
    Subscription originalSubscription = originalObservable.doOnUnsubscribe(new Action0() {

        @Override
        public void call() {
            System.out.println(System.currentTimeMillis() + " : " + Thread.currentThread().getName() + " Test.Original Unsubscribe");
            originalLatch.countDown();
        }
    }).subscribe(new Subscriber<Boolean>() {

        @Override
        public void onCompleted() {
            System.out.println(System.currentTimeMillis() + " : " + Thread.currentThread().getName() + " Test.Original OnCompleted");
            originalLatch.countDown();
        }

        @Override
        public void onError(Throwable e) {
            System.out.println(System.currentTimeMillis() + " : " + Thread.currentThread().getName() + " Test.Original OnError : " + e);
            originalLatch.countDown();
        }

        @Override
        public void onNext(Boolean b) {
            System.out.println(System.currentTimeMillis() + " : " + Thread.currentThread().getName() + " Test.Original OnNext : " + b);
            originalValue.set(b);
        }
    });
    Subscription fromCacheSubscription = fromCacheObservable.doOnUnsubscribe(new Action0() {

        @Override
        public void call() {
            System.out.println(System.currentTimeMillis() + " : " + Thread.currentThread().getName() + " FromCache Unsubscribe");
            fromCacheLatch.countDown();
        }
    }).subscribe(new Subscriber<Boolean>() {

        @Override
        public void onCompleted() {
            System.out.println(System.currentTimeMillis() + " : " + Thread.currentThread().getName() + " FromCache OnCompleted");
            fromCacheLatch.countDown();
        }

        @Override
        public void onError(Throwable e) {
            System.out.println(System.currentTimeMillis() + " : " + Thread.currentThread().getName() + " FromCache OnError : " + e);
            fromCacheLatch.countDown();
        }

        @Override
        public void onNext(Boolean b) {
            System.out.println(System.currentTimeMillis() + " : " + Thread.currentThread().getName() + " FromCache OnNext : " + b);
            fromCacheValue.set(b);
        }
    });
    try {
        fromCacheSubscription.unsubscribe();
        assertTrue(fromCacheLatch.await(600, TimeUnit.MILLISECONDS));
        assertTrue(originalLatch.await(600, TimeUnit.MILLISECONDS));
        assertEquals("Number of execution semaphores in use (original)", 0, original.getExecutionSemaphore().getNumberOfPermitsUsed());
        assertEquals("Number of fallback semaphores in use (original)", 0, original.getFallbackSemaphore().getNumberOfPermitsUsed());
        assertTrue(original.isExecutionComplete());
        assertTrue(original.isExecutedInThread());
        assertEquals(null, original.getFailedExecutionException());
        assertNull(original.getExecutionException());
        assertTrue(original.getExecutionTimeInMilliseconds() > -1);
        assertTrue(original.isSuccessfulExecution());
        assertCommandExecutionEvents(original, HystrixEventType.SUCCESS);
        assertTrue(originalValue.get());
        assertEquals(0, original.metrics.getCurrentConcurrentExecutionCount());
        assertEquals("Number of execution semaphores in use (fromCache)", 0, fromCache.getExecutionSemaphore().getNumberOfPermitsUsed());
        assertEquals("Number of fallback semaphores in use (fromCache)", 0, fromCache.getFallbackSemaphore().getNumberOfPermitsUsed());
        assertFalse(fromCache.isExecutionComplete());
        assertFalse(fromCache.isExecutedInThread());
        assertEquals(null, fromCache.getFailedExecutionException());
        assertNull(fromCache.getExecutionException());
        assertCommandExecutionEvents(fromCache, HystrixEventType.RESPONSE_FROM_CACHE, HystrixEventType.CANCELLED);
        assertTrue(fromCache.getExecutionTimeInMilliseconds() == -1);
        assertFalse(fromCache.isSuccessfulExecution());
        assertEquals(0, fromCache.metrics.getCurrentConcurrentExecutionCount());
        //underlying work
        assertFalse(original.isCancelled());
        System.out.println("ReqLog : " + HystrixRequestLog.getCurrentRequest().getExecutedCommandsAsString());
        assertSaneHystrixRequestLog(2);
    } catch (InterruptedException ex) {
        ex.printStackTrace();
    }
}
Also used : Action0(rx.functions.Action0) AtomicReference(java.util.concurrent.atomic.AtomicReference) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) CountDownLatch(java.util.concurrent.CountDownLatch) Subscription(rx.Subscription) Test(org.junit.Test)

Example 85 with Subscription

use of rx.Subscription in project Hystrix by Netflix.

the class HystrixCommandTest method testEarlyUnsubscribeDuringExecutionViaToObservable.

@Test
public void testEarlyUnsubscribeDuringExecutionViaToObservable() {
    class AsyncCommand extends HystrixCommand<Boolean> {

        public AsyncCommand() {
            super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("ASYNC")));
        }

        @Override
        protected Boolean run() {
            try {
                Thread.sleep(500);
                return true;
            } catch (InterruptedException ex) {
                throw new RuntimeException(ex);
            }
        }
    }
    HystrixCommand<Boolean> cmd = new AsyncCommand();
    final CountDownLatch latch = new CountDownLatch(1);
    Observable<Boolean> o = cmd.toObservable();
    Subscription s = o.doOnUnsubscribe(new Action0() {

        @Override
        public void call() {
            System.out.println("OnUnsubscribe");
            latch.countDown();
        }
    }).subscribe(new Subscriber<Boolean>() {

        @Override
        public void onCompleted() {
            System.out.println("OnCompleted");
        }

        @Override
        public void onError(Throwable e) {
            System.out.println("OnError : " + e);
        }

        @Override
        public void onNext(Boolean b) {
            System.out.println("OnNext : " + b);
        }
    });
    try {
        Thread.sleep(10);
        s.unsubscribe();
        assertTrue(latch.await(200, TimeUnit.MILLISECONDS));
        System.out.println("ReqLog : " + HystrixRequestLog.getCurrentRequest().getExecutedCommandsAsString());
        assertEquals("Number of execution semaphores in use", 0, cmd.getExecutionSemaphore().getNumberOfPermitsUsed());
        assertEquals("Number of fallback semaphores in use", 0, cmd.getFallbackSemaphore().getNumberOfPermitsUsed());
        assertFalse(cmd.isExecutionComplete());
        assertEquals(null, cmd.getFailedExecutionException());
        assertNull(cmd.getExecutionException());
        System.out.println("Execution time : " + cmd.getExecutionTimeInMilliseconds());
        assertTrue(cmd.getExecutionTimeInMilliseconds() > -1);
        assertFalse(cmd.isSuccessfulExecution());
        assertCommandExecutionEvents(cmd, HystrixEventType.CANCELLED);
        assertEquals(0, cmd.metrics.getCurrentConcurrentExecutionCount());
        assertSaneHystrixRequestLog(1);
    } catch (InterruptedException ex) {
        ex.printStackTrace();
    }
}
Also used : Action0(rx.functions.Action0) CountDownLatch(java.util.concurrent.CountDownLatch) HystrixRuntimeException(com.netflix.hystrix.exception.HystrixRuntimeException) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) Subscription(rx.Subscription) Test(org.junit.Test)

Aggregations

Subscription (rx.Subscription)302 Test (org.junit.Test)82 List (java.util.List)75 CompositeSubscription (rx.subscriptions.CompositeSubscription)55 Action0 (rx.functions.Action0)45 ArrayList (java.util.ArrayList)41 CountDownLatch (java.util.concurrent.CountDownLatch)38 Func1 (rx.functions.Func1)24 AtomicReference (java.util.concurrent.atomic.AtomicReference)20 AtomicBoolean (java.util.concurrent.atomic.AtomicBoolean)19 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)17 Observable (rx.Observable)17 LinkedList (java.util.LinkedList)13 CommandStreamTest (com.netflix.hystrix.metric.CommandStreamTest)11 PlayList (io.github.ryanhoo.music.data.model.PlayList)11 MetaChangedEvent (io.hefuyi.listener.event.MetaChangedEvent)10 View (android.view.View)9 IOException (java.io.IOException)9 AndroidSchedulers (rx.android.schedulers.AndroidSchedulers)8 Intent (android.content.Intent)7