feign-oauth2-spring-cloud-starter icon indicating copy to clipboard operation
feign-oauth2-spring-cloud-starter copied to clipboard

Using w/ latest version of spring-cloud (brixton) feign client gets: HystrixRuntimeException

Open bitsofinfo opened this issue 9 years ago • 12 comments

2016-07-01 10:45:41.741 ERROR 17730 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.netflix.hystrix.exception.HystrixRuntimeException: audit failed and no fallback available.] with root cause

java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.
        at org.springframework.web.context.request.RequestContextHolder.currentRequestAttributes(RequestContextHolder.java:131) ~[spring-web-4.2.6.RELEASE.jar:4.2.6.RELEASE]
        at org.springframework.web.context.request.SessionScope.get(SessionScope.java:91) ~[spring-web-4.2.6.RELEASE.jar:4.2.6.RELEASE]
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:340) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
        at org.springframework.aop.target.SimpleBeanTargetSource.getTarget(SimpleBeanTargetSource.java:35) ~[spring-aop-4.2.6.RELEASE.jar:4.2.6.RELEASE]
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:187) ~[spring-aop-4.2.6.RELEASE.jar:4.2.6.RELEASE]
        at com.sun.proxy.$Proxy166.getAccessTokenRequest(Unknown Source) ~[na:na]
        at io.jmnarloch.spring.cloud.feign.OAuth2FeignRequestInterceptor.apply(OAuth2FeignRequestInterceptor.java:71) ~[feign-oauth2-spring-cloud-starter-1.0.0.jar:1.0.0]
        at feign.SynchronousMethodHandler.targetRequest(SynchronousMethodHandler.java:154) ~[feign-core-8.16.2.jar:8.16.2]
        at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:88) ~[feign-core-8.16.2.jar:8.16.2]
        at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:76) ~[feign-core-8.16.2.jar:8.16.2]
        at feign.hystrix.HystrixInvocationHandler$1.run(HystrixInvocationHandler.java:97) ~[feign-hystrix-8.16.2.jar:8.16.2]
        at com.netflix.hystrix.HystrixCommand$1.call(HystrixCommand.java:293) ~[hystrix-core-1.5.3.jar:1.5.3]
        at com.netflix.hystrix.HystrixCommand$1.call(HystrixCommand.java:289) ~[hystrix-core-1.5.3.jar:1.5.3]
        at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:46) ~[rxjava-1.1.5.jar:1.1.5]
        at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:35) ~[rxjava-1.1.5.jar:1.1.5]
        at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:50) ~[rxjava-1.1.5.jar:1.1.5]
        at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30) ~[rxjava-1.1.5.jar:1.1.5]
        at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:50) ~[rxjava-1.1.5.jar:1.1.5]
        at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30) ~[rxjava-1.1.5.jar:1.1.5]
        at rx.Observable.unsafeSubscribe(Observable.java:8460) ~[rxjava-1.1.5.jar:1.1.5]
        at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:51) ~[rxjava-1.1.5.jar:1.1.5]
        at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:35) ~[rxjava-1.1.5.jar:1.1.5]
        at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:50) ~[rxjava-1.1.5.jar:1.1.5]
        at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30) ~[rxjava-1.1.5.jar:1.1.5]
        at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:50) ~[rxjava-1.1.5.jar:1.1.5]
        at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30) ~[rxjava-1.1.5.jar:1.1.5]
        at rx.Observable.unsafeSubscribe(Observable.java:8460) ~[rxjava-1.1.5.jar:1.1.5]
        at rx.internal.operators.OperatorSubscribeOn$1.call(OperatorSubscribeOn.java:94) ~[rxjava-1.1.5.jar:1.1.5]
        at com.netflix.hystrix.strategy.concurrency.HystrixContexSchedulerAction$1.call(HystrixContexSchedulerAction.java:56) ~[hystrix-core-1.5.3.jar:1.5.3]
        at com.netflix.hystrix.strategy.concurrency.HystrixContexSchedulerAction$1.call(HystrixContexSchedulerAction.java:47) ~[hystrix-core-1.5.3.jar:1.5.3]
        at com.netflix.hystrix.strategy.concurrency.HystrixContexSchedulerAction.call(HystrixContexSchedulerAction.java:69) ~[hystrix-core-1.5.3.jar:1.5.3]
        at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55) ~[rxjava-1.1.5.jar:1.1.5]
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[na:1.8.0_45]
        at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[na:1.8.0_45]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) ~[na:1.8.0_45]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) ~[na:1.8.0_45]
        at java.lang.Thread.run(Thread.java:745) [na:1.8.0_45]

bitsofinfo avatar Jul 01 '16 16:07 bitsofinfo

Also is this project now superceded by this in spring-cloud-netflix? https://github.com/spring-cloud/spring-cloud-security/commit/2718a044d30912eafb03f7a21e409afac8f1387f

https://github.com/spring-cloud/spring-cloud-security/pull/75 https://github.com/spring-cloud/spring-cloud-security/issues/56

bitsofinfo avatar Jul 01 '16 17:07 bitsofinfo

Are you running the extension through @HystrixCommand annotated method? If so you need to understand how the Hystrix works through use of threads. In general it means that for every @HystrixCommand a new thread will be started, so that there is no way to access the the ThreadLocal variable.

jmnarloch avatar Jul 04 '16 08:07 jmnarloch

Also this extension was targeted solely for the Spring Cloud 1.0.x when it simply didn't had such functionality. Currently the version Spring Cloud 1.1.x provides you with such option.

jmnarloch avatar Jul 04 '16 08:07 jmnarloch

@bitsofinfo Please see https://jmnarloch.wordpress.com/2016/07/06/spring-boot-hystrix-and-threadlocals/

jmnarloch avatar Jul 14 '16 10:07 jmnarloch

This can't be handled in this project by itself.

jmnarloch avatar Jul 14 '16 10:07 jmnarloch

I run an interface annotated with @FeignClient without any @HystrixCommand - and I also get this error. Can I resolve it somehow?

ventskus-roman avatar Jul 20 '16 12:07 ventskus-roman

Hmm, in your case it might mean that you haven't configured correctly the OAuth Resource server. It's hard to say not knowing your setup.

jmnarloch avatar Jul 20 '16 13:07 jmnarloch

In semaphore mode it works fine, thank you!

ventskus-roman avatar Jul 20 '16 13:07 ventskus-roman

Are you running your client in separate thread?

jmnarloch avatar Jul 20 '16 13:07 jmnarloch

I use it with Spring web. Client calls rest endpoint of my application, and then it calls feign client. I think, each request worked in separate thread by default in Spring. Am I right?

ventskus-roman avatar Jul 20 '16 13:07 ventskus-roman

It should be only in request bounded thread which makes it perfectly fine with this extension, as long as you don't use @Async/@Scheduled or anything that will spin a new thread.

jmnarloch avatar Jul 20 '16 14:07 jmnarloch

Great! Thanks!

ventskus-roman avatar Jul 20 '16 14:07 ventskus-roman