gpt4 book ai didi

java - Hystrix 的 IllegalStateException

转载 作者:行者123 更新时间:2023-12-02 05:00:53 26 4
gpt4 key购买 nike

我是 Hystrix 的新手。我正在尝试将它与 Spring AOP 一起使用。以下详细说明了我想要实现的目标。

有一个“ServiceClass”,其中注入(inject)了一些 RestClient 类。我正在使用Spring。现在,我想将 Hystrix 与 Spring AOP 结合使用,以便可以同步或异步地从 ServiceClass 调用 RestClient 的方法。

到目前为止我所做的事情如下。

创建了一个类“MyCommand”,它扩展了 HystrixCommand 实现了 MethodInterceptor

在其中实现了一个方法“execute(MethodInitation m, String mode)”,如下所示:

                      protected Object execute(MethodInvocation m, String mode){
this.mode = mode;
this.method = m;
return execute();}

在(重写方法)“调用”

                       public Object invoke(MethodInvocation m) throws throwable{
try{
execute(m,"Sync");
} catch(Exception e){
e.printStackTrace();
}
}

这个“MyCommand”被设置为 spring-config 文件中“ServiceClass”的 AOP 拦截器。

现在的问题是;在我的“Main”应用程序中,当我从 ClassPathXmlApplicationContext 检索“ServiceClass”并调用一种方法时,它工作正常。但是,如果我尝试调用“ServiceClass”的两个方法,它会抛出以下异常:

              *java.lang.IllegalStateException: This instance can only be executed once. Please instantiate a new instance.*

代码片段:

              ServiceClass srvc = (ServiceClass) ctx.getBean("proxy");
srvc.getRequest();
srvc.postRequest();

我花了将近三天的时间试图找出这个异常的原因和解决方案,但没有任何好处。请帮助我解决这个问题。我错过了什么?

一如既往,提前致谢

最佳答案

HystrixCommand 对象只能使用一次,因为它在执行后包含有用的状态信息,可用于进一步处理。例如,如果您想在调用 run() 超时后进行特殊处理,您可以执行以下操作:

public class MyHystrixCommand extends HystrixCommand<Object> { ... }

MyHystrixCommand command = new MyHystrixCommand();

command.execute();

if(command.isResponseTimedOut()){
//do post processing
}

如果您可以多次调用 execute() ,特别是从多个线程调用(如果您的 REST 端点有多个使用者,就会发生这种情况),您将无法知道哪一个调用是调用的当您查询命令的状态时超时。

关于java - Hystrix 的 IllegalStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28297394/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com