2016-02-08 2 views
0

У меня есть интересная проблема. У нас есть несколько EJB, которые называются локальным кодом (через локальный интерфейс) и клиентским кодом (через удаленный интерфейс).Как определить, является ли вызов EJB удаленным или локальным клиентом

Код работает на серверах Weblogic 12c и использует RMI для вызова методов.

Система находится в разработке уже много лет, а наряду с другими реализована функциональность браузера вокруг пользовательских курсоров (своего рода дескриптор для набора результатов). Уже существует много вызовов для получения такого курсора для разных типов данных.

Когда курсор получен, он используется впоследствии для запроса базовых данных (другого вызова).

В нашем случае мы хотим узнать, выполняется ли вызов из локального кода или удаленного клиента. Мы хотим знать это, чтобы мы могли предварительно загрузить первые n элементов и тем самым сократить количество вызовов на наш сервер. Каждый вызов имеет накладные расходы около 20 мс, чего мы хотим избежать.

Код удаленного клиента является общим (курсор завернут в виде списка) и его можно легко настроить для обработки предварительно загруженных данных.

Локальные абоненты также называют эти методы EJB для получения курсора, но обычно используют другие функции для обработки курсора (обертывание в итераторах, объединениях и т. Д.). Поэтому они стали бы намного сложнее, если бы им пришлось обрабатывать предварительную загрузку (и они часто не нужны).

Итак, мы хотим сделать перехватчик для предварительной загрузки данных в курсор, но только если вызов выполняется с удаленного клиента. До сих пор мы не могли найти способ сделать это.

Я пробовал RemoteServer.getClientHost(), но он всегда вызывает исключение, в котором нет соединения.

Я искал, если SessionContext может быть расширен с полем/значением, которое будет установлено вызывающим пользователем для идентификации удаленного клиента, но может найти что-нибудь об этом. (У нас есть домашняя обертка для интерфейса службы, которая может быть расширена путем вставки такой информации в контекст).

Так что вопрос:

Есть общий способ узнать, в EJB-перехватчиком, что происхождение вызова было из другой системы

+0

[Как клиент знает, что реализация компонента EJB удалена или локальна в ejb3] (http://stackoverflow.com/questions/17399117/how-does-client-know-the-ejb-bean-implementation-is- remote-or-local-in-ejb3)? – Perdomoff

+0

Я ищу способ определить в реальной реализации EJB, откуда я звоню. Данная ссылка дает информацию для клиентов, как позвонить EJB. К сожалению, это наоборот. Перехватчик находится только вокруг EJB и за локальным или удаленным вызовом. –

ответ

0

Если удаленный клиент использует любой вид аутентификации должна быть некоторая информация в контексте безопасности о принципе, который может использоваться для дифференциации. В противном случае, прежде чем найти лучшее решение, new Throwable().getStackTrace() возвращает массив всех вызывающих абонентов. Должен быть метод вверх по потоку, который мог бы определить, является ли вызов локальным, или это было сделано с помощью удаленного вызова.

+0

К сожалению, одна и та же аутентификация также используется кодом сервера, поэтому исключает принципала. Я тоже подумал о подходе к стоп-тракту, но это дорого и сложно, я думаю, из-за того, что мониторинг EJB контролируется. Однако может быть подход. –

+0

Пожалуйста, разместите его в качестве ответа, если вы найдете лучший подход. –

+1

Я закончил внедрение подхода, основанного на stacktrace. Производительность его разумная, она занимает около 100-200 микросекунд, и сейфы около 20 мс на стороне клиента (накладные расходы за звонок) –