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)