This is an automated email from the ASF dual-hosted git repository. jianbin pushed a commit to branch develop in repository https://gitbox.apache.org/repos/asf/incubator-seata.git
The following commit(s) were added to refs/heads/develop by this push: new c5bbd74177 bugfix: fix Alibaba Dubbo convert error (#6628) c5bbd74177 is described below commit c5bbd74177b2e6e6cd9924677a2c9fd7605ab3aa Author: jimin <sliev...@163.com> AuthorDate: Mon Jun 24 20:39:02 2024 +0800 bugfix: fix Alibaba Dubbo convert error (#6628) --- changes/en-us/develop.md | 1 + changes/zh-cn/develop.md | 1 + .../AlibabaDubboTransactionConsumerFilter.java | 62 ++++++++++++++++++++++ ... => AlibabaDubboTransactionProviderFilter.java} | 43 ++++++--------- .../seata-dubbo-alibaba/reflect-config.json | 14 ++++- .../META-INF/services/com.alibaba.dubbo.rpc.Filter | 3 +- ...ibabaDubboTransactionPropagationFilterTest.java | 15 +++--- 7 files changed, 100 insertions(+), 39 deletions(-) diff --git a/changes/en-us/develop.md b/changes/en-us/develop.md index a634a753cb..ec1e2d83a7 100644 --- a/changes/en-us/develop.md +++ b/changes/en-us/develop.md @@ -13,6 +13,7 @@ Add changes here for all PR submitted to the develop branch. - [[#4410](https://github.com/seata/seata/pull/4410)] support jdk9+ compile code - [[#6104](https://github.com/seata/seata/pull/6104)] fix dubbo 3.x consumer can't generate TCC proxy in tcc mode. - [[#6409](https://github.com/seata/seata/pull/6409)] fix the failure of RemotingParser to prevent AT mode from executing. +- [[#6628](https://github.com/seata/seata/pull/6628)] fix Alibaba Dubbo convert error. ### optimize: - [[#6044](https://github.com/seata/seata/pull/6044)] optimize derivative product check base on mysql diff --git a/changes/zh-cn/develop.md b/changes/zh-cn/develop.md index 8d8016f978..ce89801cbe 100644 --- a/changes/zh-cn/develop.md +++ b/changes/zh-cn/develop.md @@ -13,6 +13,7 @@ - [[#4410](https://github.com/seata/seata/pull/4410)] 修复jdk9+版本编译后,引入后ByteBuffer#flip NoSuchMethodError的问题 - [[#6104](https://github.com/seata/seata/pull/6104)] 修复在TCC模式下, dubbo 3.x版本消费者端不能生成TCC代理的问题 - [[#6409](https://github.com/seata/seata/pull/6409)] 修复 RemotingParser 失败导致 AT 模式无法执行的问题 +- [[#6628](https://github.com/seata/seata/pull/6628)] 修复 Alibaba Dubbo 转换错误 ### optimize: - [[#6044](https://github.com/seata/seata/pull/6044)] 优化MySQL衍生数据库判断逻辑 diff --git a/integration/dubbo-alibaba/src/main/java/io/seata/integration/dubbo/alibaba/AlibabaDubboTransactionConsumerFilter.java b/integration/dubbo-alibaba/src/main/java/io/seata/integration/dubbo/alibaba/AlibabaDubboTransactionConsumerFilter.java new file mode 100644 index 0000000000..0582fb381d --- /dev/null +++ b/integration/dubbo-alibaba/src/main/java/io/seata/integration/dubbo/alibaba/AlibabaDubboTransactionConsumerFilter.java @@ -0,0 +1,62 @@ +/* + * Copyright 1999-2019 Seata.io Group. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.seata.integration.dubbo.alibaba; + +import com.alibaba.dubbo.common.extension.Activate; +import com.alibaba.dubbo.rpc.Filter; +import com.alibaba.dubbo.rpc.Invocation; +import com.alibaba.dubbo.rpc.Invoker; +import com.alibaba.dubbo.rpc.Result; +import com.alibaba.dubbo.rpc.RpcContext; +import com.alibaba.dubbo.rpc.RpcException; + +import io.seata.core.constants.DubboConstants; +import io.seata.core.context.RootContext; +import io.seata.core.model.BranchType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * The type Alibaba dubbo transaction consumer filter. + */ +@Activate(group = {DubboConstants.CONSUMER}, order = 100) +public class AlibabaDubboTransactionConsumerFilter implements Filter { + + private static final Logger LOGGER = LoggerFactory.getLogger(AlibabaDubboTransactionConsumerFilter.class); + + @Override + public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException { + if (!DubboConstants.ALIBABADUBBO) { + return invoker.invoke(invocation); + } + String xid = RootContext.getXID(); + BranchType branchType = RootContext.getBranchType(); + + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("consumer xid in RootContext[{}], branchType in RootContext[{}]", xid, branchType); + } + if (xid != null) { + RpcContext.getContext().setAttachment(RootContext.KEY_XID, xid); + RpcContext.getContext().setAttachment(RootContext.KEY_BRANCH_TYPE, branchType.name()); + } + try { + return invoker.invoke(invocation); + } finally { + RpcContext.getContext().removeAttachment(RootContext.KEY_XID); + RpcContext.getContext().removeAttachment(RootContext.KEY_BRANCH_TYPE); + } + } +} diff --git a/integration/dubbo-alibaba/src/main/java/io/seata/integration/dubbo/alibaba/AlibabaDubboTransactionPropagationFilter.java b/integration/dubbo-alibaba/src/main/java/io/seata/integration/dubbo/alibaba/AlibabaDubboTransactionProviderFilter.java similarity index 71% rename from integration/dubbo-alibaba/src/main/java/io/seata/integration/dubbo/alibaba/AlibabaDubboTransactionPropagationFilter.java rename to integration/dubbo-alibaba/src/main/java/io/seata/integration/dubbo/alibaba/AlibabaDubboTransactionProviderFilter.java index 3f7eb64d59..818bc35dd3 100644 --- a/integration/dubbo-alibaba/src/main/java/io/seata/integration/dubbo/alibaba/AlibabaDubboTransactionPropagationFilter.java +++ b/integration/dubbo-alibaba/src/main/java/io/seata/integration/dubbo/alibaba/AlibabaDubboTransactionProviderFilter.java @@ -22,52 +22,41 @@ import com.alibaba.dubbo.rpc.Invoker; import com.alibaba.dubbo.rpc.Result; import com.alibaba.dubbo.rpc.RpcContext; import com.alibaba.dubbo.rpc.RpcException; + import io.seata.common.util.StringUtils; -import io.seata.core.context.RootContext; import io.seata.core.constants.DubboConstants; +import io.seata.core.context.RootContext; import io.seata.core.model.BranchType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** - * The type Transaction propagation filter. - * - * @author sharajava + * The type Alibaba dubbo transaction provider filter. */ -@Activate(group = {DubboConstants.PROVIDER, DubboConstants.CONSUMER}, order = 100) -public class AlibabaDubboTransactionPropagationFilter implements Filter { +@Activate(group = {DubboConstants.PROVIDER}, order = 100) +public class AlibabaDubboTransactionProviderFilter implements Filter { - private static final Logger LOGGER = LoggerFactory.getLogger(AlibabaDubboTransactionPropagationFilter.class); + private static final Logger LOGGER = LoggerFactory.getLogger(AlibabaDubboTransactionProviderFilter.class); @Override public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException { if (!DubboConstants.ALIBABADUBBO) { return invoker.invoke(invocation); } - String xid = RootContext.getXID(); - BranchType branchType = RootContext.getBranchType(); - String rpcXid = getRpcXid(); String rpcBranchType = RpcContext.getContext().getAttachment(RootContext.KEY_BRANCH_TYPE); if (LOGGER.isDebugEnabled()) { - LOGGER.debug("xid in RootContext[{}] xid in RpcContext[{}]", xid, rpcXid); + LOGGER.debug("xid in RpcContext[{}], branchType in RpcContext[{}]", rpcXid, rpcBranchType); } boolean bind = false; - if (xid != null) { - RpcContext.getContext().setAttachment(RootContext.KEY_XID, xid); - RpcContext.getContext().setAttachment(RootContext.KEY_BRANCH_TYPE, branchType.name()); - } else { - if (rpcXid != null) { - RootContext.bind(rpcXid); - if (StringUtils.equals(BranchType.TCC.name(), rpcBranchType)) { - RootContext.bindBranchType(BranchType.TCC); - } - bind = true; - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("bind xid [{}] branchType [{}] to RootContext", rpcXid, rpcBranchType); - } + if (rpcXid != null) { + RootContext.bind(rpcXid); + if (StringUtils.equals(BranchType.TCC.name(), rpcBranchType)) { + RootContext.bindBranchType(BranchType.TCC); } + bind = true; } + try { return invoker.invoke(invocation); } finally { @@ -82,7 +71,7 @@ public class AlibabaDubboTransactionPropagationFilter implements Filter { } if (!rpcXid.equalsIgnoreCase(unbindXid)) { LOGGER.warn("xid in change during RPC from {} to {},branchType from {} to {}", rpcXid, unbindXid, - rpcBranchType != null ? rpcBranchType : "AT", previousBranchType); + rpcBranchType != null ? rpcBranchType : BranchType.AT, previousBranchType); if (unbindXid != null) { RootContext.bind(unbindXid); LOGGER.warn("bind xid [{}] back to RootContext", unbindXid); @@ -93,8 +82,6 @@ public class AlibabaDubboTransactionPropagationFilter implements Filter { } } } - RpcContext.getContext().removeAttachment(RootContext.KEY_XID); - RpcContext.getContext().removeAttachment(RootContext.KEY_BRANCH_TYPE); RpcContext.getServerContext().removeAttachment(RootContext.KEY_XID); RpcContext.getServerContext().removeAttachment(RootContext.KEY_BRANCH_TYPE); } @@ -102,6 +89,7 @@ public class AlibabaDubboTransactionPropagationFilter implements Filter { /** * get rpc xid + * * @return */ private String getRpcXid() { @@ -111,5 +99,4 @@ public class AlibabaDubboTransactionPropagationFilter implements Filter { } return rpcXid; } - } diff --git a/integration/dubbo-alibaba/src/main/resources/META-INF/native-image/io.seata/seata-dubbo-alibaba/reflect-config.json b/integration/dubbo-alibaba/src/main/resources/META-INF/native-image/io.seata/seata-dubbo-alibaba/reflect-config.json index 3aabc896ce..8831f427be 100644 --- a/integration/dubbo-alibaba/src/main/resources/META-INF/native-image/io.seata/seata-dubbo-alibaba/reflect-config.json +++ b/integration/dubbo-alibaba/src/main/resources/META-INF/native-image/io.seata/seata-dubbo-alibaba/reflect-config.json @@ -3,7 +3,19 @@ "condition": { "typeReachable": "com.alibaba.dubbo.rpc.Filter" }, - "name": "io.seata.integration.dubbo.alibaba.AlibabaDubboTransactionPropagationFilter", + "name": "io.seata.integration.dubbo.alibaba.AlibabaDubboTransactionConsumerFilter", + "methods": [ + { + "name": "<init>", + "parameterTypes": [] + } + ] + }, + { + "condition": { + "typeReachable": "com.alibaba.dubbo.rpc.Filter" + }, + "name": "io.seata.integration.dubbo.alibaba.AlibabaDubboTransactionProviderFilter", "methods": [ { "name": "<init>", diff --git a/integration/dubbo-alibaba/src/main/resources/META-INF/services/com.alibaba.dubbo.rpc.Filter b/integration/dubbo-alibaba/src/main/resources/META-INF/services/com.alibaba.dubbo.rpc.Filter index 2d5cc351c2..ab28ff7084 100644 --- a/integration/dubbo-alibaba/src/main/resources/META-INF/services/com.alibaba.dubbo.rpc.Filter +++ b/integration/dubbo-alibaba/src/main/resources/META-INF/services/com.alibaba.dubbo.rpc.Filter @@ -1 +1,2 @@ -io.seata.integration.dubbo.alibaba.AlibabaDubboTransactionPropagationFilter \ No newline at end of file +io.seata.integration.dubbo.alibaba.AlibabaDubboTransactionConsumerFilter +io.seata.integration.dubbo.alibaba.AlibabaDubboTransactionProviderFilter \ No newline at end of file diff --git a/integration/dubbo-alibaba/src/test/java/io/seata/integration/dubbo/alibaba/AlibabaDubboTransactionPropagationFilterTest.java b/integration/dubbo-alibaba/src/test/java/io/seata/integration/dubbo/alibaba/AlibabaDubboTransactionPropagationFilterTest.java index 955a5567c0..afb5c4a21f 100644 --- a/integration/dubbo-alibaba/src/test/java/io/seata/integration/dubbo/alibaba/AlibabaDubboTransactionPropagationFilterTest.java +++ b/integration/dubbo-alibaba/src/test/java/io/seata/integration/dubbo/alibaba/AlibabaDubboTransactionPropagationFilterTest.java @@ -15,9 +15,8 @@ */ package io.seata.integration.dubbo.alibaba; -import com.alibaba.dubbo.rpc.Invocation; -import com.alibaba.dubbo.rpc.Invoker; import com.alibaba.dubbo.rpc.RpcContext; + import io.seata.core.context.RootContext; import io.seata.core.model.BranchType; import io.seata.integration.dubbo.alibaba.mock.MockInvoker; @@ -25,21 +24,18 @@ import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; -/** - * @author wang.liang - */ public class AlibabaDubboTransactionPropagationFilterTest { private static final String DEFAULT_XID = "1234567890"; @Test public void testInvoke_And_RootContext() { - AlibabaDubboTransactionPropagationFilter filter = new AlibabaDubboTransactionPropagationFilter(); + AlibabaDubboTransactionProviderFilter providerFilter = new AlibabaDubboTransactionProviderFilter(); // SAGA RpcContext.getContext().setAttachment(RootContext.KEY_XID, DEFAULT_XID); RpcContext.getContext().setAttachment(RootContext.KEY_BRANCH_TYPE, BranchType.SAGA.name()); - filter.invoke(new MockInvoker(() -> { + providerFilter.invoke(new MockInvoker(() -> { assertThat(RootContext.getXID()).isEqualTo(DEFAULT_XID); assertThat(RootContext.getBranchType()).isEqualTo(BranchType.AT); }), null); @@ -49,7 +45,7 @@ public class AlibabaDubboTransactionPropagationFilterTest { // TCC RpcContext.getContext().setAttachment(RootContext.KEY_XID, DEFAULT_XID); RpcContext.getContext().setAttachment(RootContext.KEY_BRANCH_TYPE, BranchType.TCC.name()); - filter.invoke(new MockInvoker(() -> { + providerFilter.invoke(new MockInvoker(() -> { assertThat(RootContext.getXID()).isEqualTo(DEFAULT_XID); assertThat(RootContext.getBranchType()).isEqualTo(BranchType.TCC); }), null); @@ -57,11 +53,12 @@ public class AlibabaDubboTransactionPropagationFilterTest { assertThat(RootContext.unbindBranchType()).isNull(); // TCC + AlibabaDubboTransactionConsumerFilter consumerFilter = new AlibabaDubboTransactionConsumerFilter(); RootContext.bind(DEFAULT_XID); RootContext.bindBranchType(BranchType.SAGA); RpcContext.getContext().setAttachment(RootContext.KEY_XID, DEFAULT_XID); RpcContext.getContext().setAttachment(RootContext.KEY_BRANCH_TYPE, BranchType.TCC.name()); - filter.invoke(new MockInvoker(() -> { + consumerFilter.invoke(new MockInvoker(() -> { assertThat(RootContext.getXID()).isEqualTo(DEFAULT_XID); assertThat(RootContext.getBranchType()).isEqualTo(BranchType.SAGA); }), null); --------------------------------------------------------------------- To unsubscribe, e-mail: notifications-unsubscr...@seata.apache.org For additional commands, e-mail: notifications-h...@seata.apache.org