Как повторно вызвать исключение в шине событий 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

0 ответов

Другие вопросы по тегам