Как повторно вызвать исключение в шине событий vert.x с помощью Smallrye Mutiny
Я пытаюсь использовать шину событий quarkus в качестве шины сообщений для реализации простой реализации шаблона команд. Я использую механизм запроса / ответа. Я отправляю сообщение из ресурса обработчику команд, прослушивающему тот же канал.
Я пытаюсь имитировать исключение в обработчике команд, отправляющем событие сбоя Uni обратно в ресурс, но, если я не использую recoveryWithItem, я получаю "Необработанное асинхронное исключение", я могу понять это, поскольку обработчик команд блокирует, поэтому он должен будет выполняться в другом рабочем потоке.
На и все, что я хочу, - это повторно вызвать это исключение, чтобы мой ExceptionMapper мог настроить подходящий HTTP-ответ, в общем, я хочу, чтобы исключение, созданное вершиной обработчика команд, также было выброшено в основной поток.
Может кто-нибудь указать мне дорогу? Благодаря!
Вот код ресурса:
@POST
@Path("/{idList}/items")
public Uni<Response> addItemToList(@PathParam("idList") UUID idList, AddItemToListDTO addItemToListDTO) throws RuntimeException {
return bus.<Response>request(
"add-item-command", new AddItemToListCommand(idList, addItemToListDTO.getItemName()))
.onItem()
.transform(Message::body);
// If i dont recover the exception here, i get a "Unhandled asynchronous exception, sending back 500: (RECIPIENT_FAILURE,8191) TodoList b8f1562d-32c3-43fc-aa3d-672a6b92d9a7 not found"
// I want the TodoListException be thrown in this thread context
}
Вот код обработчика команд
@Transactional
@ConsumeEvent(value = "add-item-command", blocking = true)
public Uni<TodoList> handle(AddItemToListCommand cmd) {
TodoList todoList = todoListRepository
.find("id", cmd.getIdTodoList())
.firstResult();
if (todoList == null) {
return Uni.createFrom().failure(new TodoListNotFoundException(cmd.getIdTodoList()));
// Here i am explicitly failing the Uni
}
TodoListItem item = new TodoListItem(cmd.getItemName());
todoList.addItem(item);
todoListRepository.persist(todoList);
return Uni.createFrom().item(todoList);
}
Исключение:
package org.max.todo_list.domain;
import java.util.UUID;
public class TodoListNotFoundException extends RuntimeException {
private final UUID todoListId;
public TodoListNotFoundException(UUID todoListId) {
super(String.format("TodoList %s not found", todoListId));
this.todoListId = todoListId;
}
public UUID getTodoListId() {
return todoListId;
}
}
Уже исправлено! ================================================== ===================
Это действительно была ошибка в автобусе событий quarkus. Он уже исправлен для всех, у кого такая же проблема.
https://github.com/quarkusio/quarkus/pull/12616/commits/60fbca9b9f7ecc5a4873856495e0f24001b7b950