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

时间:2016-02-08 16:07:05

标签: java java-ee ejb-3.1

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

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

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

当获得光标时,随后将其用于请求基础数据(另一个调用)。

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

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

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

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

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

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

所以问题是:

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

1 个答案:

答案 0 :(得分:0)

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