Я отправляю сообщение через 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!!!!!!!!!!!!!!!!!!!