|
Подскажите по rxJava
|
|||
---|---|---|---|
#18+
Всем привет, не могу разобраться с rxJava. Элементарная (на первый взгляд) задача: пройтись по массиву с ip адресами и найти первый доступный. Код: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30.
В логах имеем: D/mylog: onNext 192.168.0.103:7799 D/mylog: onError null То есть доходит до первого недоступного и останавливается. Интернеты говорят, что нужно вроде как использовать onExceptionResumeNext\onErrorResumeNext. Пробовал добавлять и .onExceptionResumeNext(Observable.from(%ARRAY%)) и .onErrorResumeNext(Observable.from(%ARRAY%)) и вместе - результат в логах такой же, как и без них. Что я делаю не так ? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2021, 11:52 |
|
Подскажите по rxJava
|
|||
---|---|---|---|
#18+
я не специалист по rx от слова вообще, но по-моему оно в onError вообще не должно попадать по-хорошему, если ты все ошибки в onNext ловишь. Возможно у тебя там вываливается что-то окромя IOException, например в Integer.parseInt или прилетает null вместо строки или IndexOutOfBounds, если в адресах IP без порта. T.e. стремится нужно не к затыканию дыр в виде "как продолжить после ошибки", а к исправлению или учету этой конкретной ошибки Кроме того из кода не видно, где тут "первый доступный"? Где остановка при успехе? По-хорошему проверка должна где-то в filter (или аналоге) происходить, а потом должно быть что-то типа findFirst. Но вот вопрос в том, как сделать в filter асинхронную проверку. Имхо RxJava тут либо вообще мимо кассы, либо нужно делать не так (как правильно на Rx я не знаю) - стартовать всю процедуру в отдельном потоке и уже в нем проверять каждый IP по очереди блокирующим запросом. На стримах я бы сделал так Код: java 1. 2. 3. 4. 5. 6. 7.
P. S. погуглил коротко, с rx нужно делать примерно так (правильный синтаксис может отличаться, но идея вроде понятна) Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2021, 13:31 |
|
Подскажите по rxJava
|
|||
---|---|---|---|
#18+
chpasha, Ок, будем вникать дальше, спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2021, 13:53 |
|
Подскажите по rxJava
|
|||
---|---|---|---|
#18+
Возможно - долгий таймаут по недоступности. А добавь логгирование ошибок. Код: java 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2021, 13:54 |
|
Подскажите по rxJava
|
|||
---|---|---|---|
#18+
bobo96, Самое первое - неправильно вот это автор Код: java 1. 2.
Поэтому ни фига и непонятно что не работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2021, 14:13 |
|
Подскажите по rxJava
|
|||
---|---|---|---|
#18+
Возможно вот эта ловушка и не ловит никаких ошибок потому что не делается re-throw ошибк наверх. Код: java 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2021, 14:22 |
|
Подскажите по rxJava
|
|||
---|---|---|---|
#18+
Спасибо за ответы. В общем ситуация такая (сам я тоже с этой либой раньше не работал): изначально у меня была такая зависимость - implementation group: 'io.reactivex', name: 'rxjava', version: '1.3.8' (кодинг под андроид если что), потом, попав вроде как на офф. сайт проекта заимплементил другие либы - implementation 'io.reactivex.rxjava3:rxandroid:3.0.0', implementation 'io.reactivex.rxjava3:rxjava:3.0.0' С ними все ок, при ошибке остановки нет! Но проблема в другом: как остановиться, когда найден ip, который отвечает ?))) Код немного другой, на всякий случай с зависимостями: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50.
Лог: D/mylog: onSubscribe D/mylog: onNext 192.168.43.21:7001 D/mylog: catch failed to connect to /192.168.43.21 (port 7001) from /192.168.43.1 (port 49872) after 2000ms: isConnected failed: ECONNREFUSED (Connection refused) D/mylog: onNext 192.168.0.103:7001 D/mylog: catch failed to connect to /192.168.0.103 (port 7001) from /10.88.209.250 (port 45876) after 2000ms D/mylog: onNext 85.12.240.55:7001 D/mylog: catch failed to connect to /85.12.xxx.xxx (port 7001) from /10.88.209.250 (port 39630) after 2000ms D/mylog: onNext 109.195.107.114:7001 D/mylog: catch failed to connect to /109.195.xxx.xxx (port 7001) from /10.88.209.250 (port 42966) after 1999ms: isConnected failed: ECONNREFUSED (Connection refused) D/mylog: onComplete ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2021, 07:22 |
|
Подскажите по rxJava
|
|||
---|---|---|---|
#18+
А "реактивность" вообще предполагает такое понятие как остановиться? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2021, 11:26 |
|
Подскажите по rxJava
|
|||
---|---|---|---|
#18+
mayton, без понятия, но логично предположить, что такая возможность должна быть. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2021, 12:54 |
|
Подскажите по rxJava
|
|||
---|---|---|---|
#18+
Можно вызвать System.exit(). Это прервёт java-процесс и процесс операционки. Но можно просто посмотреть в сторону отказа от реактивности как от шаблона подобных разработок. Я не имею ничего против Р. но очевидно что данная задача имеет строго выраженое начало и конец. Массив - конечен. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2021, 12:59 |
|
|
start [/forum/topic.php?fid=59&gotonew=1&tid=2120424]: |
0ms |
get settings: |
27ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
47ms |
get topic data: |
15ms |
get first new msg: |
9ms |
get forum data: |
3ms |
get page messages: |
265ms |
get tp. blocked users: |
2ms |
others: | 376ms |
total: | 763ms |
0 / 0 |