【问题标题】:hystrix Fallback is not getting called for invidiual Item in Collectionhystrix 后备没有被要求收集中的单个项目
【发布时间】:2018-07-26 11:38:33
【问题描述】:

如果出现任何错误,我必须为列表中的每个项目调用 falback 并继续处理其他项目,这可能吗?

@Subscriber('dupe-user-check')
@HystrixCommand(fallbackMethod = "subscriptionSearchFallback")
void duplicateUserCheck(Object payload) {
// call to other microservice
//Validate response and see if user already exist for this item
//If yes
throw new DuplicateUserException("User Already Exist. Response Payload 
                            ${response.json.toString()}")
.........................................................
}



void subscriptionSearchFallback(Object payload, Throwable throwable) {
        logger.error("SUBSCRIPTION SEARCH FALLBACK :", throwable)
        itemStatusUpdateService.updateItemStatus(item.itemKey,DUPE_EMAIL_FAILED)
}

目前它不会回退。

异常跟踪:

java.lang.IllegalArgumentException: ValidationDuplicateEmailService::User 已经存在。响应负载 {"statusDesc":["999 - 用户信息不 有效"],"hasErrors":true,"statusCode":"999"} 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:423) 在 org.springsource.loaded.ri.ReflectiveInterceptor.jlrConstructorNewInstance(ReflectiveInterceptor.java:1076) 在 org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:83) 在 org.codehaus.groovy.reflection.CachedConstructor.doConstructorInvoke(CachedConstructor.java:77) 在 org.codehaus.groovy.runtime.callsite.ConstructorSite$ConstructorSiteNoUnwrap.callConstructor(ConstructorSite.java:84) 在 org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:247) 在 com.xyz.ValidationDuplicateEmailService.duplicateUserCheck(ValidationDuplicateEmailService.groovy:60) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1427) 在 org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:216) 在 grails.events.subscriber.MethodSubscriber.call(MethodSubscriber.groovy:51) 在 org.grails.events.EventSubscriberTrigger.proceed(EventSubscriberTrigger.groovy:31) 在 org.grails.events.bus.ExecutorEventBus$_buildNotificationCallable_closure1$_closure3.doCall(ExecutorEventBus.groovy:36) 在 org.grails.events.bus.ExecutorEventBus$_buildNotificationCallable_closure1$_closure3.call(ExecutorEventBus.groovy) 在 groovy.lang.Closure.run(Closure.java:495) 在 java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 在 java.util.concurrent.FutureTask.run(FutureTask.java:266) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在 java.lang.Thread.run(Thread.java:745)

【问题讨论】:

    标签: grails groovy hystrix


    【解决方案1】:

    这不起作用的原因是因为 @HystrixCommand 的方法是从同一个类中调用的。

    正如this 问题的答案中所讨论的,这是 Spring 的 AOP 的限制。

    【讨论】:

    • 感谢 Davin 的回复...所以这应该可以吗? @HystrixCommand(fallbackMethod = "subscriptionSearchFallback") @Subscriber('dupe-user-check') void duplicateUserCheck(Object payload) { .......... .................... } 这里的订阅者来自 'grails.events.annotation.*'
    • 不行还是不行,更新异常跟踪。
    • 这是一个 Spring Boot 应用程序吗?如果是这样,请确保您在配置类上有 @EnableCircuitBreaker。这是一些文档spring.io/guides/gs/circuit-breaker
    • Grails,是的,它已启用,它在其他服务中运行良好,因为它们是从外部调用的[正如你所建议的那样]......但在这里它不会以某种方式回退。我根据您的建议在上面进行了更新。
    • 这可能是 AOP 和同一方法上的两个注释的问题。如果您删除@Subscriber,它会起作用吗?
    猜你喜欢
    • 2017-10-18
    • 2018-06-21
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    相关资源
    最近更新 更多