[ 
https://issues.apache.org/jira/browse/SCB-960?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

wujimin updated SCB-960:
------------------------
    Fix Version/s: java-chassis-1.1.0

> when consumer local failed(eg: LB failed), CompletableFuture callback can not 
> get InvocationContext
> ---------------------------------------------------------------------------------------------------
>
>                 Key: SCB-960
>                 URL: https://issues.apache.org/jira/browse/SCB-960
>             Project: Apache ServiceComb
>          Issue Type: Bug
>          Components: Java-Chassis
>            Reporter: wujimin
>            Assignee: wujimin
>            Priority: Major
>             Fix For: java-chassis-1.1.0
>
>
> to support inherit context for all future scenes automatically, must wrap 
> arguments and return future as below codes.
>  and need to wrap about 40 methods
> {code:java}
> @Override
> public <U> CompletableFuture<U> handle(BiFunction<? super T, Throwable, ? 
> extends U> fn) {
>   return wrap(super.handle(wrap(fn)));
> }
> public <T> CompletableFuture<T> wrap(CompletableFuture<T> baseFuture) {
>   InvocationContextCompletableFuture<T> future = new 
> InvocationContextCompletableFuture<>(context);
>   baseFuture.whenComplete((r, e) -> {
>     if (e == null) {
>       future.complete(r);
>       return;
>     }
>     future.completeExceptionally(e);
>   });
>   return future;
> }
> public <T, R> Function<T, R> wrap(Function<T, R> action) {
>   return (t) -> {
>     InvocationContext old = ContextUtils.getInvocationContext();
>     ContextUtils.setInvocationContext(context);
>     try {
>       return action.apply(t);
>     } finally {
>       ContextUtils.setInvocationContext(old);
>     }
>   };
> }
> {code}
> it's too complex.
>  so we will only add a api to get context from future,that's enough.
>  consumers get context from future and then choose one of the solution:
> 1.threadLocal, need to clear
> {code:java}
> ContextUtils.setInvocationContext(context);
> try {
>   // business logic
> } finally {
>   ContextUtils.removeInvocationContext();
> }
> {code}
> 2.rpc: context to be a argument of the consumer api
> {code:java}
> String testContext(InvocationContext context, String name);
> {code}
> 3.restTemplate: use CseHttpEntity
> {code:java}
> CseHttpEntity<?> httpEntity = new CseHttpEntity<>(body);
> httpEntity.setContext(context);
> {code}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to