Java 如何确定EJB调用是来自远程客户端还是本地客户端

Java 如何确定EJB调用是来自远程客户端还是本地客户端,java,jakarta-ee,ejb-3.1,Java,Jakarta Ee,Ejb 3.1,我有一个有趣的问题。 我们有许多EJB,它们由本地代码(通过本地接口)和客户端代码(通过远程接口)调用 代码在WebLogic12c服务器上运行,并使用RMI进行方法调用 该系统已经开发了很多年,其他系统也围绕用户定义的游标(一种结果集的句柄)实现浏览器功能。已经有许多调用为各种数据类型获取这样的游标 获取游标后,随后将使用它来请求基础数据(另一个调用) 在我们的例子中,我们想知道调用是从本地代码还是从远程客户端完成的。我们想知道这一点,这样我们就可以预加载前n项,从而减少对服务器的调用次数。每

我有一个有趣的问题。 我们有许多EJB,它们由本地代码(通过本地接口)和客户端代码(通过远程接口)调用

代码在WebLogic12c服务器上运行,并使用RMI进行方法调用

该系统已经开发了很多年,其他系统也围绕用户定义的游标(一种结果集的句柄)实现浏览器功能。已经有许多调用为各种数据类型获取这样的游标

获取游标后,随后将使用它来请求基础数据(另一个调用)

在我们的例子中,我们想知道调用是从本地代码还是从远程客户端完成的。我们想知道这一点,这样我们就可以预加载前n项,从而减少对服务器的调用次数。每个呼叫都有大约20毫秒的开销,这是我们希望避免的

远程客户端代码是通用的(游标被包装在一种列表中),可以轻松地进行调整以处理预加载的数据

本地调用方也调用这些EJB方法来获取游标,但通常使用其他功能来处理游标(包装在迭代器、联接等中)。因此,如果他们必须处理预加载(而且他们通常不需要预加载),他们将变得更加复杂

因此,我们希望创建一个拦截器来预加载游标中的数据,但前提是调用来自远程客户端。到目前为止,我们还没有找到这样做的方法

我尝试了RemoteServer.getClientHost(),但它总是在没有连接时抛出异常

我搜索了SessionContext是否可以用调用者设置的字段/值来扩展,以识别远程客户端,但是我可以找到任何关于这样做的信息。(我们有一个自制的服务接口包装器,可以扩展到在上下文中插入此类信息)

因此,问题是:


是否有一种通用方法可以在EJB拦截器中发现调用的来源是来自不同的系统

如果远程客户端使用任何类型的身份验证,则安全上下文中应该有一些关于主体的信息,可用于区分。否则,在找到更好的解决方案之前,
new Throwable()。getStackTrace()
返回所有调用者的数组。上游必须有一个方法,可以判断调用是本地的还是通过远程调用完成的。

?我正在寻找一种方法,以确定在实际EJB实现中从何处调用我。给定的链接为客户端提供了如何调用EJB的信息。遗憾的是,情况恰恰相反。拦截器就在EJB附近,在本地或远程调用后面。遗憾的是,服务器代码也使用相同的身份验证,因此排除了主体。我也考虑过stacktrace方法,但我想它既昂贵又复杂,因为监视的EJB不同。但是可能是一种方法。如果你找到更好的方法,请将其作为答案发布。我最终实现了基于stacktrace的方法。它的性能是合理的,大约需要100-200微秒,在客户端安全大约20毫秒(每次呼叫的开销)