Настройте Apache Cayenne для асинхронного использования с Vertx

Я использую Apache Cayenne с Vertx. Vertx полагается на асинхронность всего и активно ищет потоки, которые блокируют.

Так что исполняем что-то вроде ...

List<Artist> artists = ObjectSelect.query(Artist.class).select(context);

... приведет к тому, что Vertx будет жаловаться на следующее:

WARNING: Thread Thread[vert.x-eventloop-thread-0,5,main] has been blocked for 4750 ms, time limit is 2000

Обратите внимание, что на самом деле есть способы обойти это, заключив код в функцию executeBlocking следующим образом:

// Turning synchronous code to async in Vertx
vertx.executeBlocking<Any>({ future ->
     List<Artist> artists = ObjectSelect.query(Artist.class).select(context)
     future.complete(artists)
}, { res ->
     // The result
})

Однако становится больно продолжать так оборачивать мои функции ORM.

Интересно, есть ли флаг или переключатель для включения асинхронного режима Cayenne? Или, если такого флага нет, мне интересно, есть ли способ использовать Async Driver Postgres от Маурисио. Я выбрал именно этот асинхронный драйвер, потому что Vertx обеспечивает для него встроенную поддержку .


person gurpreet-    schedule 10.03.2018    source источник
comment
Это вопрос Apache Cayenne, поэтому просто оставьте это как комментарий: почему бы не упаковать вашу службу db как рабочую версию? Вы бы избавились от предупреждения о заблокированном потоке и могли бы легко масштабировать / масштабировать, открывая эту службу, отличную от шины событий.   -  person tsegismont    schedule 12.03.2018
comment
Это отличное предложение. Если я общаюсь через шину событий с vertx cayenne verticle, тогда я предполагаю, что мне нужно будет создать уровень абстракции над шиной событий для связи с ORM?   -  person gurpreet-    schedule 13.03.2018
comment
Вы можете использовать Сервисные прокси Vert.x   -  person tsegismont    schedule 13.03.2018


Ответы (1)


К сожалению, нет волшебного переключателя, чтобы сделать Cayenne асинхронным. Cayenne внутренне в значительной степени полагается на JDBC, который, в свою очередь, является синхронным (и, вероятно, навсегда, см. Хорошее обсуждение здесь).

Более того, зависимость от JDBC затрудняет использование драйверов, отличных от jdbc, так что здесь тоже не повезло.

Так что настраиваемая оболочка, подходящая для вашей среды, кажется вашим лучшим (если не единственным) вариантом.

person Nikita    schedule 13.03.2018
comment
Есть некоторые разговоры о асинхронном JDBC от Oracle, который заявлен для выпуска в JDK 10, так что, надеюсь, они получат это вовремя. - person gurpreet-; 13.03.2018