Java worklight多线程/servletcontext调用适配器
我在worklight和多线程方面遇到了一些问题 我们有一个批量导入器,需要每天运行一次。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:
到目前为止我们做了什么
- 导入程序是servletContextListener
- 使用Quartz将导入器作为cronjob运行
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);