You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@servicecomb.apache.org by "wujimin (JIRA)" <ji...@apache.org> on 2018/10/15 18:08:00 UTC

[jira] [Resolved] (SCB-960) when consumer local failed(eg: LB failed), CompletableFuture callback can not get InvocationContext

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

wujimin resolved SCB-960.
-------------------------
    Resolution: Fixed

> 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
>
> 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)