Hystrix выполняет fallbackMethod только при первой ошибке - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь создать небольшой скрипт с использованием среды Spring, который создает «заметку» для «пользователя» в микросервисе «Заметки».

Затем существует микросервис «Пользователи», который является независимым, и для создания заметки для пользователя я должен сначала проверить, существует ли этот пользователь в микросервисе «Пользователи».

ОднакоЕсли микросервис «Пользователь» не работает, я хочу сохранить эту заметку на карте (вместе с именем пользователя), а затем каждые 10 секунд повторять ее создание.

Я ожидал, что Hystrix выполнит в точностиТаким же образом каждый раз, когда метод с тегом @HystrixCommand выполняется, но в первый раз он выполняется, а во второй - нет.

Hystrix не обрабатывает ошибку, если микросервис «Users» не работает во второй раз, когда вызывается метод «createUserNote».

    @HystrixCommand(fallbackMethod = "createUserNoteReliable")
public NoteLab createUserNote(String username, NoteLab noteLab) {

    System.out.println("Trying to create user note (HystrixCommand)");

    URI uri = URI.create("http://localhost:8080/users/userExists/" + username);

    System.out.println("uri created");

    if (restTemplate.getForObject(uri, boolean.class)) {
        System.out.println("CREATING NOTE " +noteLab.getId());
        try {
            noteLab.setDateCreation(LocalDateTime.now());
            noteLab.setDateEdit(LocalDateTime.now());
            return addUserNote(username, noteLab);
        } catch (Exception e){
            return null;
        }
    } else {
        System.out.println("User " +username + " does not exist");
        return null;
    }

}

HashMap<NoteLab, String> mapNoteUser = new HashMap<>();

public NoteLab createUserNoteReliable(String username, NoteLab noteLab) {
    System.out.println("User server is down. Saving the note " +noteLab.getId());
    try {
        mapNoteUser.put(noteLab, username);
    } catch (Exception e){}
    return null;
}

@Scheduled(fixedDelay = 10000) //In miliseconds. (10s)
public void retryCreateUserNote(){
    System.out.println("Executing automatic retry method");

    for( NoteLab note:  mapNoteUser.keySet() ) {
        System.out.println("Retying to create note " + note.toString() + " from " + mapNoteUser.get(note));

        NoteLab noteToRetry = note;
        String userToRetry = mapNoteUser.get(note);

        mapNoteUser.remove(note);

        createUserNote(userToRetry, noteToRetry);
    }
}

Я оставляю здесь свой код и любую подсказку оБуду очень признателен за то, что происходит.

Заранее большое спасибо!

1 Ответ

0 голосов
/ 22 февраля 2019

Вы должны понимать, как работают аннотации.Аннотация используется только с вне класса.Аннотация @HystrixCommand обернет ваш объект для обработки всех вызовов извне.

Но когда вы вызываете метод createUserNote из метода retryCreateUserNote, это внутри операции.Этот вызов метода не пройдет через объект-оболочку!

Вот почему вы видите, что он вызывается только один раз.

Надеюсь, это прояснит, что происходит!

...