Axon - Как получить метод дескриптора @QueryHandler для возврата необязательного <MyType> - PullRequest
1 голос
/ 06 марта 2020

Примечание:

Суть этого вопроса не в том, чтобы просто вернуть значение, которое я в конечном итоге хочу.
Я могу сделать это, просто не используя Optional. Мне бы хотелось элегантное решение, чтобы я мог начать возвращать Optional.

Объяснение того, что я пытался сделать:

Я использовал QueryGateway с подписью, которая будет запросить мой обработчик. Я разбил свой код, чтобы вы могли видеть, что на моем CompletableFuture я сделаю блокировку get, чтобы получить Optional, который содержит объект, который я действительно хочу. Обратите внимание , что я не ищу класс, который содержит мой необязательный. Если это не элегантно, тогда я могу просто выполнить проверку на ноль.

Вызов запроса работает, но я получаю следующую ошибку:

org.axonframework.axonserver.connector.query.AxonServerQueryDispatchException: CANCELLED: HTTP/2 error code: CANCEL
    Received Rst Stream  
    AXONIQ-5002
    58484@DESKTOP-CK6HLMM

Пример кода, который инициирует запрос:

UserProfileOptionByUserQuery q = new UserProfileOptionByUserQuery(userId);    
CompletableFuture<Optional<UserProfile>> query = 
  queryGateway.query(q,ResponseTypes.optionalInstanceOf(UserProfile.class));
Optional<UserProfile> optional = query.get();

Ошибка возникает при вызове query.get().

Пример моего обработчика запросов:

@QueryHandler
Optional<UserProfile> handle(UserProfileOptionByUserQuery query, @MetaDataValue(USER_INFO) UserInfo userInfo) {
    assertUserCanQuery(query, userInfo);
    return userProfileRepository.findById(query.getUserId());
}

Обработчик запросов работает нормально. Другие действия, такие как использование OptionalResponseType, не инициировали бы мой запрос по желанию.

1 Ответ

1 голос
/ 09 марта 2020

Я думаю, что ключ лежит за исключением того, что вы получаете Стивена.

Просто чтобы убедиться в этом, я протестировал следующие варианты, когда дело доходит до Optional обработки запросов:

  1. Обработчик запросов возвращает Optional, Диспетчер запросов использует OptionalResponeType
  2. Обработчик запросов возвращает MyType, Диспетчер запросов использует OptionalResponeType
  3. Обработчик запросов возвращает Optional , Диспетчер запросов использует InstanceResponeType

Добавлено, я пробовал эти перестановки как на SimpleQueryBus, так и на Axon Server. Оба автобуса по всем трем вариантам работали для меня совершенно нормально.

Это подсказывает мне, что вам следует погрузиться в AxonServerQueryDispatchException, который вы получаете. Поэтому я собираюсь дать вам пару вопросов для дальнейшего выяснения, в чем заключается проблема. Я бы посоветовал обновить исходный вопрос с ответами на них.

Есть ли у вас более подробный след стека за шанс? И какие версии Axon Framework и Axon Server вы используете? Вы на стандартной версии? Корпоративный выпуск? Такое поведение происходит только для этого точного обработчика запросов Optional, которым вы поделились с нами?

...