worklight 多线程/servletcontext 调用适配器

Posted

技术标签:

【中文标题】worklight 多线程/servletcontext 调用适配器【英文标题】:worklight multi thread/servletcontext calling adapter 【发布时间】:2014-06-02 15:49:31 【问题描述】:

我在工作灯和多线程方面遇到了一些问题。

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

Importer 是一个 servletContextListener 使用 Quartz 将导入程序作为 cronjob 运行

除了调用 HTTP 适配器之外,代码中的所有内容都可以正常工作。每次调用适配器时都会返回错误消息“BaseProjectLocal 为空”。 如果代码由另一个工作灯适配器启动,则该代码可以正常工作。

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

java.lang.RuntimeException: BaseProjectLocal is null
at com.worklight.common.util.BaseProjectLocal.get(BaseProjectLocal.java:41)
at com.worklight.server.util.ProjectLocal.get(ProjectLocal.java:55)
at com.worklight.server.util.ProjectLocal.getWorklightBundlesS(ProjectLocal.java:113)
at com.worklight.server.bundle.api.WorklightBundles.getInstance(WorklightBundles.java:28)
at com.ibm.nl.wwdw.server.util.AdapterCaller.doCall(AdapterCaller.java:25)
at com.ibm.nl.wwdw.server.connections.CommunityCollector.getMembersFromCommunity(CommunityCollector.java:50)
at com.ibm.nl.wwdw.server.importer.ConnectionsImporter.StartImport(ConnectionsImporter.java:53)
at com.ibm.nl.wwdw.server.importer.MyJob.execute(MyJob.java:17)
at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)

2-jun-2014 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();

【问题讨论】:

您的servletContextListener 是否配置了与Worklight 相同的Web 项目?如果没有,您可能想尝试一下。还要确保您没有从 web.xml 中删除 Worklight 自己的侦听器 【参考方案1】:

问题可能是线程没有身份验证上下文。虽然可以手动创建身份验证上下文,但需要使用内部 API 才能完成(这意味着它是不受支持的路径,...)。

类似这样的:

authService = (AuthenticationServiceBean);
getBeanFactory().getBean(AuthenticationService.BEAN_ID);
authContext = authService.createAuthenticationContext(realm, username, password);
AuthenticationContext.setThreadContext(authContext);

建议在Worklight外部运行导入器,远程调用适配器(通过HTTP)。

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

【讨论】:

以上是关于worklight 多线程/servletcontext 调用适配器的主要内容,如果未能解决你的问题,请参考以下文章

如果工作区中存在工作灯项目,则 com.worklight.studio.plugin 线程在 Eclipse 启动时挂起

IBM Worklight v 5.0.6 - 无法在 Windows Phone 7.5 环境中导航多页

如何通过 Web Worker 中的 Worklight 适配器调用 Web 服务

Worklight & Dojo 多页错误

Worklight 6.2:无法在 windows phone 8 环境中添加多个 js 文件

IBM Worklight 和 Dojo 移动