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

How to determine whether an EJB call is from a remote or local client

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

代码在 Weblogic 12c 服务器上运行并使用 RMI 进行方法调用。

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

获得游标后,它随后用于请求基础数据(另一个调用)。

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

远程客户端代码是通用的(光标包裹在一种列表中)并且可以轻松调整以处理预加载的数据。

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

所以我们想制作一个拦截器来在游标中预加载数据,但前提是调用是从远程客户端进行的。到目前为止,我们找不到这样做的方法。

我试过 RemoteServer.getClientHost() 但它总是抛出没有连接的异常。

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

所以问题是:

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

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