带lambda的optaplanner

时间:2018-07-10 19:58:49

标签: aws-lambda drools optaplanner drools-planner

我正在使用optaplanner解决计划问题。我想从AWS Lambda调用调度代码(我知道Lambda的最大执行时间是5分钟,对于这个应用程序来说还可以)

要实现这一点,我构建了一个带有两个模块的maven项目: 模块1:调度优化代码 module-2:aws lambda处理程序(从module-1调用调度代码)

当我在IntelliJ Idea中对模块1(具有optaplanner代码)运行测试时,它运行良好。

当我调用lambda函数时,出现以下异常:

java.lang.ExceptionInInitializerError:    
java.lang.ExceptionInInitializerError
java.lang.ExceptionInInitializerError
 at org.kie.api.internal.utils.ServiceRegistry.getInstance(ServiceRegistry.java:27)
 ...
Caused by: java.lang.RuntimeException: Child services [org.kie.api.internal.assembler.KieAssemblers] have no parent
 at org.kie.api.internal.utils.ServiceDiscoveryImpl.buildMap(ServiceDiscoveryImpl.java:191)
 at org.kie.api.internal.utils.ServiceDiscoveryImpl.getServices(ServiceDiscoveryImpl.java:97)
 ...

我在maven文件中包括以下依赖项:org.optaplanner optaplanner-core 7.7.0.Final

还检查了jar文件是否包含drools-core,kee-api,kei-internal和drools-compiler。有谁知道可能是什么问题?

2 个答案:

答案 0 :(得分:1)

在受限环境(例如AWS-lambda)中运行时,听起来像流口水中的bug。请create a JIRA并在此处链接。

答案 1 :(得分:0)

我在运行包含示例OptaPlanner项目的胖罐时遇到相同的错误。进行一些调试后发现,调用services时问题ServiceDiscoveryImpl::buildMap是空的;我在构建中使用的是第一个META-INF/kie.conf,因此该文件中缺少服务。自然,您的测试将正常运行,因为类路径将包含所有依赖项(即几个不同的META-INF/kie.conf文件),而不是您尝试在lambda上执行的程序集。

串联这些文件(在程序集中使用适当的合并策略)可以解决此问题,并且在给定ServiceDiscoveryImpl如何加载这些文件的情况下显得很合适。更新后的JAR可以作为AWS lambda正常运行。

注意:我使用的是scoreDrl Cloud Balancing示例中的默认v7.12.0.Final