0

問題を示す次のコードがあります。

@Component
public class App {
    @Autowired S1 s1;
    @Autowired S2 s2;
    int jobs = 0;
    @Scheduled(cron = "0 * * * * ?")
    void foo() {
        System.out.println("schedule cron job: " + jobs++);
        Observable<String> observable = Observable.just("bar");
        ConnectableObservable<String> publishedObservable = observable.publish();
        publishedObservable.subscribe(s1);
        publishedObservable.subscribe(s2);
        publishedObservable.connect();
    }
}

サブスクライバ 1:

@Component
public class S1 extends Subscriber<String> {
    private AtomicInteger counter = new AtomicInteger(0);

    @Override
    public void onCompleted() {
    }

    @Override
    public void onError(Throwable e) {
    }

    @Override
    public void onNext(String s) {
        System.out.println("S1:::: Times called: " + counter.getAndIncrement() + ", input: " + s);

    }
}

サブスクライバ 2:

@Component
public class S2 extends Subscriber<String> {
    private AtomicInteger counter = new AtomicInteger(0);

    @Override
    public void onCompleted() {
    }

    @Override
    public void onError(Throwable e) {
    }

    @Override
    public void onNext(String s) {
        System.out.println("S2:::: Times called: " + counter.getAndIncrement() + ", input: " + s);
    }
}

出力は次のようになります。

schedule cron job: 0
S1:::: Times called: 0, input: bar
S2:::: Times called: 0, input: bar
schedule cron job: 1
schedule cron job: 2
schedule cron job: 3
schedule cron job: 4
......

foo メソッドが呼び出されるたびに S1 と S2 が呼び出されないのはなぜですか? それを達成する方法は?

これは rx 一部のサブスクリプション ロジックによるものですか、それともこれらの Bean がシングルトンであるためですか?

4

1 に答える 1

2

foo メソッドが呼び出されるたびに S1 と S2 が呼び出されないのはなぜですか?

RxJavaSubscriberはステートフルであり、シーケンスを消費すると使用できなくなり、サブスクライブされていないと報告されます。再度購読しても効果はありません。ソースを購読する必要があるたびに、それらを再作成する必要があります。

于 2016-09-28T11:39:39.217 に答える