quarkus-vertx:来自 Verticle 的非阻塞数据库调用导致 ContextNotActiveException
quarkus-vertx: non-blocking db call from verticle results in ContextNotActiveException
我通过 Vert.x EventBus 发送消息。监听 Verticle 开始对后端进行非阻塞调用以从数据库中读取所有实体。我的问题是调用数据库时出现异常: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!!!!!!!!!!!!!!!!!!!
一种使用 spring 数据的方法。结果一样。
@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!!!!!!!!!!!!!!!!!!!
我遇到了类似的问题并用 smallrye-context-propagation
解决了
延期。请查看此 ,它解释了它是如何解决的。
我通过 Vert.x EventBus 发送消息。监听 Verticle 开始对后端进行非阻塞调用以从数据库中读取所有实体。我的问题是调用数据库时出现异常: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!!!!!!!!!!!!!!!!!!!
一种使用 spring 数据的方法。结果一样。
@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!!!!!!!!!!!!!!!!!!!
我遇到了类似的问题并用 smallrye-context-propagation
解决了
延期。请查看此