Hystrix仅在第一次发生错误时执行fallbackMethod

时间:2019-02-21 13:50:33

标签: java spring microservices hystrix

我正在尝试使用Spring框架编写一个小脚本,该脚本在“笔记”微服务上为“用户”创建一个“笔记”。

然后有一个独立的“用户”微服务,为了为用户创建注释,我应该首先检查该用户是否存在于“用户”微服务中。

但是,如果“用户”微服务已关闭,我想将该注释存储在地图中(以及用户名),然后每10秒重试一次。

我希望每次执行带有@HystrixCommand标记的方法时,Hystrix的执行方式都完全相同,但是第一次执行,第二次不执行。

如果第二次调用“ createUserNote”方法的“用户”微服务仍然处于关闭状态,则Hystrix不会处理错误。

    @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 :(得分:1)

您必须了解注释的工作方式。注释仅在类的外部中使用。 注释@HystrixCommand将包装您的对象以处理来自外部的所有呼叫。

但是,当您从createUserNote方法调用retryCreateUserNote方法时,这是内部操作。该方法调用不会通过包装对象!

这就是为什么您只看到它被调用一次的原因。

我希望这可以澄清正在发生的事情!