quarkus-vertx: неблокирующий вызов БД из вертикали приводит к ContextNotActiveException - PullRequest
0 голосов
/ 26 января 2020

Я отправляю сообщение через Vert.x EventBus. Слушающая вертикаль запускает неблокирующий вызов для бэкэнда, чтобы прочитать все сущности из БД. Моя проблема - исключение во время обращения к БД: ContextNotActiveException. Я пробовал panache и spring-data и получал одинаковый результат в обоих случаях (возможно, одинаковую ошибку в обоих из них!?).

@Path("/vertx")
@Log
public class ApiVertx extends AbstractVerticle {
    @Inject
    EventBus eventBus;

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public void getViaSpringData() {
        System.out.println("\n-send to bus: START");
        eventBus.request(ConsumerAsyncSpringData.CONSUMER_ADR_SPRING_DATA, "", event -> {
            System.out.println("\tRespons is ready.");
            if (event.succeeded()) {
                System.out.println("\tSuccess: " + event.result()
                        .body());
            } else {
                System.out.println("\tSuccess: NO!!!!!!!!!!!!!!!!!!!");
            }
        });
        System.out.println("+send to bus: OK");
    }
}

@ApplicationScoped
public class ConsumerAsyncPanache extends AbstractVerticle {
    public static final String CONSUMER_ADR_PANACHE = "CONSUMER_ADR_PANACHE";

    @ConsumeEvent(ConsumerAsyncPanache.CONSUMER_ADR_PANACHE)
//    @ActivateRequestContext
    @Transactional
    public CompletionStage<String> getAllPets(String str) throws Exception {
        System.out.println("-------------------------- ConsumerAsyncPanache started");
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        return CompletableFuture.supplyAsync(() -> {
            try {
                List<Pet> petLst = Pet.listAll(Sort.by("name"));
            } catch (Exception e) {
                System.out.println("############################### " + e.toString());
                throw e;
            }
            return "testString";
        }, executorService);
    }
}
@Entity
@AllArgsConstructor
@NoArgsConstructor
public class Pet extends PanacheEntity {
    @Column(length = 40, unique = true)
    public String name;
}

curl localhost: 8080 / vertx производит следующее

-send to bus: START
+send to bus: OK
-------------------------- ConsumerAsyncPanache started
############################### javax.enterprise.context.ContextNotActiveException: interface 
javax.enterprise.context.RequestScoped
        Respons is ready.
        Success: NO!!!!!!!!!!!!!!!!!!!

Подход с пружинными данными. С тем же результатом.

@ApplicationScoped
public class ConsumerAsyncSpringData extends AbstractVerticle {
    public static final String CONSUMER_ADR_SPRING_DATA = "CONSUMER_ADR_SPRING_DATA";

    @Inject
    private FruitRepository fruitRepository;

    @ConsumeEvent(ConsumerAsyncSpringData.CONSUMER_ADR_SPRING_DATA)
    public CompletionStage<String> getAllPets(String str) throws Exception{
        System.out.println("-------------------------- consumer started");
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        return CompletableFuture.supplyAsync(() -> {
            try {
                fruitRepository.findAll();
            } catch (Exception e) {
                System.out.println("############################### " + e.toString());
                throw e;
            }
            return "Spring-Data";
        }, executorService);
    }
}
public interface FruitRepository extends CrudRepository<Fruit, Long> {}

Соответствующий вывод

-send to bus: START
+send to bus: OK
-------------------------- ConsumerAsyncSpringData started
############################### javax.enterprise.context.ContextNotActiveException: 
interface javax.enterprise.context.RequestScoped
        Respons is ready.
        Success: NO!!!!!!!!!!!!!!!!!!!

1 Ответ

0 голосов
/ 26 января 2020

Я прошел подобную проблему и решил с расширением smallrye-context-propagation. Пожалуйста, отметьте этот URL , который объясняет, как это решается.

...