Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import io.reactivex.Observable
- import io.reactivex.rxkotlin.Observables
- import io.reactivex.schedulers.Schedulers
- val BAD_SESSION_ID = "BAD_SESSION_ID"
- val GOOD_SESSION_ID = "GOOD_SESSION_ID"
- fun main(args: Array<String>) {
- val fileList = listOf("file1", "file2", "file3", "file4")
- val filesObservables = Observable.fromIterable(fileList)
- .flatMap { prepareFile(it) }
- .toList()
- .toObservable()
- .publish()
- .autoConnect(2)
- val requestSingle = Observable.just(Request())
- val responseObservable = Observables.zip(filesObservables, requestSingle, { a, b -> Pair(a, b) })
- .flatMap { sendRequest(it.first, it.second, BAD_SESSION_ID) }
- .publish()
- .autoConnect(2)
- val requestFirstAttempt = responseObservable
- .filter { it == ErrorCode.OK }
- val sessionIdSingle = responseObservable
- .filter { it == ErrorCode.BAD_SESSION_ID }
- .flatMap { reLogin() }
- val requestSecondAttempt = Observables.zip(sessionIdSingle, filesObservables, requestSingle, { a, b, c -> Triple(a, b, c) })
- .flatMap { sendRequest(it.second, it.third, it.first) }
- Observable.merge(requestFirstAttempt, requestSecondAttempt)
- .subscribeOn(Schedulers.trampoline())
- .first(ErrorCode.UNKNOWN_ERROR)
- .subscribe({ value ->
- println("errorCode = $value")
- }, { error ->
- error.printStackTrace()
- })
- }
- fun prepareFile(file: String): Observable<String> {
- println("prepareFile")
- return Observable.just(file)
- }
- fun reLogin(): Observable<String> {
- println("reLogin")
- return Observable.just(GOOD_SESSION_ID)
- }
- fun sendRequest(files: MutableList<String>, request: Request, sessionId: String): Observable<ErrorCode> {
- return if (sessionId == BAD_SESSION_ID) {
- println("sendRequest BAD_SESSION_ID")
- Observable.just(ErrorCode.BAD_SESSION_ID)
- } else {
- println("sendRequest GOOD_SESSION_ID")
- Observable.just(ErrorCode.OK)
- }
- }
- class Request
- enum class ErrorCode {
- OK,
- BAD_SESSION_ID,
- UNKNOWN_ERROR
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement