Java worklight多线程/servletcontext调用适配器

Java worklight多线程/servletcontext调用适配器,java,multithreading,ibm-mobilefirst,worklight-adapters,Java,Multithreading,Ibm Mobilefirst,Worklight Adapters,我在worklight和多线程方面遇到了一些问题 我们有一个批量导入器,需要每天运行一次。 到目前为止我们做了什么 导入程序是servletContextListener 使用Quartz将导入器作为cronjob运行 除了调用HTTP适配器,代码中的所有内容都可以正常工作。每次调用适配器时,都会返回错误消息“BaseProjectLocal为空”。 如果该代码由另一个worklight适配器启动,则该代码工作正常 似乎存在错误,因为他不知道如何访问适配器(我假设) 2014年6月2日17:

我在worklight和多线程方面遇到了一些问题

我们有一个批量导入器,需要每天运行一次。
到目前为止我们做了什么

  • 导入程序是servletContextListener
  • 使用Quartz将导入器作为cronjob运行
除了调用HTTP适配器,代码中的所有内容都可以正常工作。每次调用适配器时,都会返回错误消息“BaseProjectLocal为空”。 如果该代码由另一个worklight适配器启动,则该代码工作正常

似乎存在错误,因为他不知道如何访问适配器(我假设)

2014年6月2日17:38:56 com.ibm.nl.wwdw.server.importer.ConnectionsImporter StartImport 严重:BaseProjectLocal为空

调用适配器的Java代码

public static JSONObject doCall(String adapter, String path, String paramArray) {
    Logging.logger.warning(adapter+"/"+path+"?"+paramArray);
    DataAccessService service = WorklightBundles.getInstance().getDataAccessService();//This line gives the error report
    ProcedureQName procedureQName = new ProcedureQName(adapter, path);
    InvocationResult result = service.invokeProcedure(procedureQName, paramArray);
    Logging.logger.warning(result.toJSON().toString());
    return result.toJSON();
}

}问题可能是线程没有身份验证上下文。虽然可以手动创建身份验证上下文,但很难实现,因为它需要使用内部API(这意味着它是不受支持的路径,…)

大概是这样的:

authService = (AuthenticationServiceBean);
getBeanFactory().getBean(AuthenticationService.BEAN_ID);
authContext = authService.createAuthenticationContext(realm, username, password);
AuthenticationContext.setThreadContext(authContext);
建议在Worklight之外运行导入程序,并远程调用适配器(通过HTTP)


但是请注意,适配器不应受到其他领域的保护。

您的
servletContextListener
是否配置了与Worklight相同的web项目?如果不是,你可能想试试。还要确保没有从
web.xml
authService = (AuthenticationServiceBean);
getBeanFactory().getBean(AuthenticationService.BEAN_ID);
authContext = authService.createAuthenticationContext(realm, username, password);
AuthenticationContext.setThreadContext(authContext);