ContextNotActiveException с Quarkus и Jenetics

Первый раз, когда использую Quarkus, это, вероятно, вопрос новичков, но я не знаю, как его решить. Я пытаюсь настроить конечную точку, которая должна запускать генетический алгоритм (созданный с помощью Jenetics) и возвращать результат. Это определение конечной точки:

@Path("/items")
public class ItemResource {

    @Inject
    ItemService service;

    @GET
    public List<Item> getItems() {
        return service.getItems();
    }

}

Конечная точка требует выполнения для класса обслуживания ниже:

@ApplicationScoped
public class ItemService {

    @Inject
    ItemMapper mapper;

    @Transactional
    public List<Item> getItems() {
        int numOfItems = Math.toIntExact(Item.count());
        IntegerChromosome chromosome = IntegerChromosome.of(0, numOfItems - 1, 14);
        Factory<Genotype<IntegerGene>> factory = Genotype.of(chromosome);
        Engine<IntegerGene, Double> engine = Engine
                .builder(this::fitnessFunction, factory)
                .build();
        Genotype<IntegerGene> result = engine.stream()
                .limit(100)
                .collect(EvolutionResult.toBestGenotype());
        return mapper.toItems(result);
    }

}

и, наконец, это класс картографа:

@ApplicationScoped
public class ItemMapper {

    public List<Item> toItems(Genotype<IntegerGene> genotype) {
        List<Item> items = Item.listAll();
        return genotype.chromosome().stream()
                .map(IntegerGene::intValue)
                .map(items::get)
                .collect(Collectors.toList());
    }

}

Когда я запускаю приведенный выше код, я получаю следующее исключение:

Error handling 0d80baf3-12da-49ec-b8d0-e48472c801c9-1, org.jboss.resteasy.spi.UnhandledException: java.util.concurrent.CancellationException: javax.enterprise.context.ContextNotActiveException

Код безупречно работает в стандартном приложении Java, но не в веб-сервисе. Любая идея?


Здесь вы можете найти трассировку стека.


person Andrea    schedule 17.03.2021    source источник
comment
Работает, если переместить @Transactional в ItemResource?   -  person geoand    schedule 18.03.2021
comment
Нет, возникает то же исключение.   -  person Andrea    schedule 18.03.2021
comment
Можете ли вы добавить трассировку стека? Item содержит код доступа к БД? Является ли какая-либо часть вычислений (в Item или в Jenetics) асинхронной, то есть в другом потоке?   -  person Nikos Paraskevopoulos    schedule 18.03.2021
comment
По умолчанию Jenetics использует ForkJoinPool.defaultPool() для одновременной оценки значений пригодности. Если это проблема, вы можете явно указать используемый Executor при сборке движка. И да, была бы полезна полная трассировка стека.   -  person Franz Wilhelmstötter    schedule 18.03.2021
comment
Есть ли способ настроить Jenetics с конкретным пулом потоков?   -  person geoand    schedule 18.03.2021
comment
Элемент @NikosParaskevopoulos - это PanacheEntity, так что да, он определенно содержит код доступа к БД. В частности, я использую два статических метода count() и listAll()   -  person Andrea    schedule 19.03.2021
comment
@ FranzWilhelmstötter Я только что добавил трассировку стека, взгляните на обновленный вопрос   -  person Andrea    schedule 19.03.2021


Ответы (1)


Вы можете попробовать установить другую службу выполнения.

final Executor executor = Executors.newFixedThreadPool(10);
final Engine<EnumGene<WayPoint>, Double> engine = Engine.builder(...)
    .executor(executor)
    .build();
person Franz Wilhelmstötter    schedule 18.03.2021
comment
Скорее всего, вы получите такой же ContextNotActiveException с рукотворным исполнителем. Если это так, введите ManagedExecutorService как @Resource ManagedExecutorService managedExecutor и используйте его. - person Nikos Paraskevopoulos; 19.03.2021
comment
Я действительно получил такое же исключение, установив Executors.newFixedThreadPool(10) в качестве исполнителя. Я хочу попробовать @Resource ManagedExecutorService managedExecutor, но не могу найти этот класс, мне как-то его создать? - person Andrea; 19.03.2021
comment
Привет, @Andrea, это javax.enterprise.concurrent.ManagedExecutorService и javax.annotation.Resource. Я не уверен, работает ли это для Quarkus, хотя это работает для традиционного JEE. Если это не так, вы можете попробовать 2 вещи: (1) @Inject ManagedExecutorService вместо @Resource ... и (2) использовать ManagedExecutor MicroProfile, как описано здесь и ответ Энди на этот вопрос. - person Nikos Paraskevopoulos; 19.03.2021
comment
@NikosParaskevopoulos Очевидно ManagedExecutorService не работает в Quarkus, поэтому я попробовал с @Inject ManagedExecutor executor. У меня такое же исключение, но с другой трассировкой стека - person Andrea; 19.03.2021