Использование SolverConfig.xml в Timefold для Quarkus приводит к ошибке в собственном образе GraalVM.JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Использование SolverConfig.xml в Timefold для Quarkus приводит к ошибке в собственном образе GraalVM.

Сообщение Anonymous »

Я работаю над созданием REST API с использованием Timefold для Quarkus и запускаю его как встроенную сборку на GraalVM на базе Windows.
Я реализовал метод POST с именем /evaluate, который подсчитывает баллы вместо выполнения заданий. При запуске его с помощью команды mvn quarkus:dev на JVM он работает правильно. Однако при выполнении собственной сборки при вызове метода POST возникает ошибка.

Код: Выделить всё

    @Operation(summary = "Calculate and return a score for the allocation schedule.")
@APIResponses(value = {
@APIResponse(
responseCode = "200",
description = "Schedule scores.",
content = @Content(mediaType = MediaType.APPLICATION_JSON, schema = @Schema(implementation = StaffScheduleEvaluationResponse.class))
),
@APIResponse(responseCode = "404", description = "Score not found.",
content = @Content(mediaType = MediaType.APPLICATION_JSON,
schema = @Schema(implementation = ErrorInfo.class))),
@APIResponse(responseCode = "500", description = "A problem occurred while processing the score.",
content = @Content(mediaType = MediaType.APPLICATION_JSON,
schema = @Schema(implementation = ErrorInfo.class)))
})
@POST
@Path("/evaluate")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public StaffScheduleEvaluationResponse getEvaluate(StaffSchedule problem) {

// Score Calculation
SolverFactory actualSolverFactory = SolverFactory.createFromXmlResource("jp/co/dowell/solverConfig.xml");
SolutionManager solutionManager = SolutionManager.create(actualSolverFactory);
ScoreAnalysis scoreAnalysis = solutionManager.analyze(problem);
ScoreAnalysisResult scoreAnalysisResult = generateScoreAnalysis(scoreAnalysis, problem);

return new StaffScheduleEvaluationResponse(
scoreAnalysis.score(),
scoreAnalysisResult
);
}
Иерархия в каталоге ресурсов следующая:

Код: Выделить всё

resources
├ org/acme/staffscheduling
│ └ solverConfig.xml
├ META-INF/native-image
│ └ reflect-config.json
└ application.properties
solverConfig.xml:

Код: Выделить всё




org.acme.staffscheduling.domain.StaffSchedule
org.acme.staffscheduling.domain.StaffAssignment



org.acme.staffscheduling.solver.StaffScheduleConstraintProvider




OR



ALLOCATE_ENTITY_FROM_QUEUE
DECREASING_DIFFICULTY_IF_AVAILABLE
DECREASING_STRENGTH_IF_AVAILABLE


TABU_SEARCH


1.0


1.0


2.0





1.0
ALL

2
4



1.0
ALL

2
4





reflect-config.json:

Код: Выделить всё

[
{
"name": "ai.timefold.solver.core.api.solver.SolverFactory",
"allDeclaredMethods": true,
"allDeclaredFields": true,
"allDeclaredConstructors": true
},
{
"name": "ai.timefold.solver.core.config.solver.SolverConfig",
"allDeclaredMethods": true,
"allDeclaredFields": true,
"allDeclaredConstructors":  true
}
]

application.properties:

Код: Выделить всё

########################
# Timefold Solver properties
########################
quarkus.timefold.solver.termination.spent-limit=300s

quarkus.arc.context-propagation.enabled=true
quarkus.log.category."ai.timefold.solver".min-level=TRACE
%dev.quarkus.log.category."ai.timefold.solver".level=DEBUG
%prod.quarkus.log.category."ai.timefold.solver".level=INFO
quarkus.log.category."ai.timefold.solver".level=TRACE

# Domain model configuration
# Solution class for the optimization problem
quarkus.timefold.solver.solution-class=org.acme.staffscheduling.domain.StaffSchedule
# Entity class to represent planning variables
quarkus.timefold.solver.entity-classes=org.acme.staffscheduling.domain.StaffAssignment
# Score Director configuration
# Constraint Provider class to define constraints
quarkus.timefold.solver.score-director-factory.constraint-provider-class=org.acme.staffscheduling.solver.StaffScheduleConstraintProvider
quarkus.timefold.solver-config-xml=org/acme/staffscheduling/solverConfig.xml
# Termination conditions
# Multiple termination conditions are combined with OR logic
quarkus.timefold.solver.termination.composition-style=OR
# Maximum time without improvement to terminate solving
quarkus.timefold.solver.termination.unimproved-spent-limit=60s

########################
# Native build properties
########################
# Enable Swagger UI also in the native mode
quarkus.swagger-ui.always-include=true
quarkus.native.resources.includes=solver.xsd,org/acme/staffscheduling/solverConfig.xml

########################
# CORS Configuration
########################
# Enable CORS
quarkus.http.cors=true
# Allow all origins (modify as needed for security)
quarkus.http.cors.origins=*
# Allow specific HTTP methods
quarkus.http.cors.methods=GET,POST,PUT,DELETE,OPTIONS
# Allow specific headers in requests
quarkus.http.cors.headers=Authorization,Content-Type
# Expose specific headers to clients
quarkus.http.cors.exposed-headers=Authorization
## Cache preflight requests for 24 hours
#quarkus.http.cors.access-control-max-age=24H

########################
# logging file
########################
quarkus.log.file.enable=true
quarkus.log.file.path=logs/application.log
quarkus.log.file.format=%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p [%c{2.}] (%t) %s%e%n
quarkus.log.file.level=TRACE
quarkus.log.file.rotation.max-file-size=10M
quarkus.log.file.rotation.max-backup-index=5

ошибка:

Код: Выделить всё

__  ____  __  _____   ___  __ ____  ______
--/ __ \/ / / / _ | / _ \/ //_/ / / / __/
-/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/
2024-12-27 12:40:34,261 INFO  [ai.tim.sol.qua.bea.TimefoldSolverBannerBean] (main) Using Timefold Solver Community Edition v1.0.0-SNAPSHOT.
2024-12-27 12:40:34,267 INFO  [io.quarkus] (main) staff-scheduling 1.0.0-SNAPSHOT native (powered by Quarkus 3.16.3) started in 0.205s.  Listening on: http://0.0.0.0:8080
2024-12-27 12:40:34,268 INFO  [io.quarkus] (main) Profile prod activated.
2024-12-27 12:40:34,269 INFO  [io.quarkus] (main) Installed features: [agroal, cdi, hibernate-orm, hibernate-orm-panache, jdbc-postgresql, narayana-jta, resteasy, resteasy-jackson, smallrye-context-propagation, smallrye-openapi, swagger-ui, timefold-solver, timefold-solver-jackson, vertx]
2024-12-27 12:41:02,445 ERROR [io.qua.ver.htt.run.QuarkusErrorHandler] (executor-thread-1) HTTP Request to /schedules/evaluate failed, error id: b0b08726-35de-442b-98fb-70874e2d5892-1: org.jboss.resteasy.spi.UnhandledException: java.lang.IllegalArgumentException: The scoreDirectorFactory lacks configuration for either constraintProviderClass, easyScoreCalculatorClass or incrementalScoreCalculatorClass.
at org.jboss.resteasy.core.ExceptionHandler.handleApplicationException(ExceptionHandler.java:107)
at org.jboss.resteasy.core.ExceptionHandler.handleException(ExceptionHandler.java:344)
at org.jboss.resteasy.core.SynchronousDispatcher.writeException(SynchronousDispatcher.java:205)
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:452)
at org.jboss.resteasy.core.SynchronousDispatcher.lambda$invokePropagateNotFound$6(SynchronousDispatcher.java:275)
at org.jboss.resteasy.core.SynchronousDispatcher.lambda$preprocess$0(SynchronousDispatcher.java:154)
at org.jboss.resteasy.core.interception.jaxrs.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:321)
at org.jboss.resteasy.core.SynchronousDispatcher.preprocess(SynchronousDispatcher.java:157)
at org.jboss.resteasy.core.SynchronousDispatcher.invokePropagateNotFound(SynchronousDispatcher.java:260)
at io.quarkus.resteasy.runtime.standalone.RequestDispatcher.service(RequestDispatcher.java:86)
at io.quarkus.resteasy.runtime.standalone.VertxRequestHandler.dispatch(VertxRequestHandler.java:151)
at io.quarkus.resteasy.runtime.standalone.VertxRequestHandler$1.run(VertxRequestHandler.java:97)
at io.quarkus.vertx.core.runtime.VertxCoreRecorder$14.runWith(VertxCoreRecorder.java:627)
at org.jboss.threads.EnhancedQueueExecutor$Task.doRunWith(EnhancedQueueExecutor.java:2675)
at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2654)
at org.jboss.threads.EnhancedQueueExecutor.runThreadBody(EnhancedQueueExecutor.java:1627)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1594)
at org.jboss.threads.DelegatingRunnable.run(DelegatingRunnable.java:11)
at org.jboss.threads.ThreadLocalResettingRunnable.run(ThreadLocalResettingRunnable.java:11)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base@21.0.5/java.lang.Thread.runWith(Thread.java:1596)
at java.base@21.0.5/java.lang.Thread.run(Thread.java:1583)
at org.graalvm.nativeimage.builder/com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:896)
at org.graalvm.nativeimage.builder/com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:872)
Caused by: java.lang.IllegalArgumentException:  The scoreDirectorFactory lacks configuration for either constraintProviderClass, easyScoreCalculatorClass or incrementalScoreCalculatorClass.
at ai.timefold.solver.core.impl.score.director.ScoreDirectorFactoryFactory.decideMultipleScoreDirectorFactories(ScoreDirectorFactoryFactory.java:78)
at ai.timefold.solver.core.impl.score.director.ScoreDirectorFactoryFactory.buildScoreDirectorFactory(ScoreDirectorFactoryFactory.java:26)
at ai.timefold.solver.core.impl.solver.DefaultSolverFactory.buildScoreDirectorFactory(DefaultSolverFactory.java:191)
at ai.timefold.solver.core.impl.solver.DefaultSolverFactory.(DefaultSolverFactory.java:70)
at ai.timefold.solver.core.api.solver.SolverFactory.createFromXmlResource(SolverFactory.java:43)
at org.acme.staffscheduling.rest.StaffScheduleResource.getEvaluate(StaffScheduleResource.java:647)
at java.base@21.0.5/java.lang.reflect.Method.invoke(Method.java:580)
at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:154)
at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:118)
at org.jboss.resteasy.core.ResourceMethodInvoker.internalInvokeOnTarget(ResourceMethodInvoker.java:560)
at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTargetAfterFilter(ResourceMethodInvoker.java:452)
at org.jboss.resteasy.core.ResourceMethodInvoker.lambda$invokeOnTarget$2(ResourceMethodInvoker.java:413)
at org.jboss.resteasy.core.interception.jaxrs.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:321)
at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:415)
at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:378)
at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:356)
at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:70)
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:429)
... 20 more
Если кто-нибудь сможет помочь мне решить эту проблему, я буду очень признателен.

Подробнее здесь: https://stackoverflow.com/questions/793 ... lvm-native
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»