Когда добавлять @Suspendable к методам в потоке? - PullRequest
0 голосов
/ 30 июня 2018

Как лучше всего аннотировать метод как @Suspendable? В потоке может быть несколько частных методов, которые запрашивают бизнес-логику хранилища / вычисления. Должны ли они быть помечены @Suspendable, чтобы он мог восстановиться, если узел потерпел крах на полпути?

Или @Suspendable только для методов, где send / sendAndReceived задействованы там, где его ожидают ответы от контрагентов?

1 Ответ

0 голосов
/ 30 июня 2018

Из параллельная вселенная :

Методы выполнения в Fiber, SuspendableRunnable и SuspendableCallable объявить, что они могут вызвать исключение SuspendExecution.

@ Suspendable - это наш способ указать метод suspendable, объявив throws SuspendExecution. Это удобно, поскольку SuspendExecution является проверенным исключением, поэтому, если f вызывает g и g является приостановленным, компилятор Java заставит нас объявить, что f приостановлено (и это должно быть потому, что он вызывает g, а g может быть приостановлено).

Иногда, однако, мы не можем объявить, что f выбрасывает SuspendExecution. Одним из примеров является то, что f является реализацией метода интерфейса, и мы не можем (или не хотим) изменять интерфейс, чтобы он вызывал SuspendExecution.

Итак, предположим, что метод f объявлен в интерфейсе I, и мы хотели бы сделать его реализацию в классе C приостановленной. Компилятор не позволит нам объявить, что мы бросаем SuspendExecution, потому что это будет конфликтовать с объявлением f в I.

Таким образом, мы делаем аннотацию C.f с аннотацией @Suspendable (в пакете co.paralleluniverse.fibers). Предполагая, что C.f вызывает park или какой-то другой приостанавливаемый метод g, который объявляет throws SuspendExecution, нам нужно окружить тело f командой try {} catch (SuspendExecution), чтобы метод скомпилировался.

если мы хотим запустить h в волокне, то он должен быть приостановлен, потому что он вызывает f, который является приостановленным. Мы могли бы обозначить h как приостанавливаемый, либо пометив его @Suspendable, либо объявив SuspendExecution

Если мы хотим, чтобы какой-либо метод выполнялся в волокне, он должен быть приостановлен. в общем, любой метод, который вызывает метод, который может выдать SuspendExecution или помечен @Suspendable.

В моем случае я столкнулся с ошибкой вызова SubFlow из функции, так как я не аннотировал ее @Suspendable Я столкнулся с Quasar Exception. Поскольку SubFlow помечено @Suspendable, аннотирование моей функции помогло избавиться от этих ошибок. Ошибка: Uninstrumented whole methods ('**') or single calls ('!!') detected:

...