0

我们正在尝试为 JDE9.0 使用动态 java 连接器,并面临进程句柄数增加的问题。

设想:

与多个调用同时并行调用动态 JDE 连接器。

BSFN的执行过程如下:

1) 登录方法拥有所有凭据并返回 sessionID

int sessionID =   
Connector.getInstance().login(username.trim(), password.trim(), env.trim(), role.trim());
…

2) ExecuteBSFN 有输入参数为module、bsfnName 和inputfile(输入数据到bsfn)

…..

ExecutableMethod execMethod = bsfnMethod.createExecutable();
execMethod.resetValues();
Map<String, String> input = inputParams(moduleName, bsfnName, inputFile);

if(input != null)
   execMethod.setValues(input);

CallObjectErrorList errorList = execMethod.executeBSFN(sessionID);
Map output = execMethod.getValues();
….

3)注销:

Connector.getInstance().logoff(sessionID);    

在这种情况下,我们观察到进程的句柄计数不断增加,即使我们使用了 logoff() 方法并最终导致 OutOfMemory。

为了在注销实现中解决此问题,在注销后我们调用:

       Connector.getInstance().shutDown();

在这种情况下,我们观察到它会为后续调用引发空指针异常。有谁知道如何克服这种情况?

4

2 回答 2

0

您应该通过查看企业服务器 callobject 内核 jde 日志文件来查看从用户会话调用的 BSFN 是否阻止了注销,因为 BSFN 仍在企业服务器 callobject 内核中异步运行。

连接器.getInstance().shutDown(); 将遍历所有活动用户会话并调用 Connector.getInstance().logoff(sessionID);。

所以如果有其他活动会话运行业务功能,shutDown 将在 BSFN 执行过程中注销会话,并导致注销会话的空指针异常。

于 2019-11-22T07:20:28.533 回答
0

如果您有多个JDE会话,则Connector.getInstance().shutDown() 它将不起作用,因为shutDown() 将关闭所有活动会话,这就是为什么您会收到其他活动用户的空指针异常。

对于您的句柄计数和 OutOfMemory,您可以关闭特定会话,例如

第 1 步:通过会话 ID 注销用户

Connector.getInstance().logoff(sessionID);

第 2 步:通知 JDE 关闭当前会话,它将解决您的句柄计数和 OutOfMemory 问题

                        NotificationManager.notifyEvent(new JdeEvent() {

                            @Override
                            public Object getSource() {
                                return Connector.getInstance();
                            }

                            @Override
                            public String getName() {
                                return "SHUTDOWN";
                            }
                        });
于 2020-01-06T06:44:12.477 回答