seata-samples icon indicating copy to clipboard operation
seata-samples copied to clipboard

Why does `BusinessService` call non-public Java API to perform health check?

Open linghengqian opened this issue 1 year ago • 0 comments

Why you need it?

Is your feature request related to a problem? Please describe in details

  • I noticed that org.apache.seata.api.BusinessService was calling a non-public Java API to do health checks. Refer to https://github.com/apache/incubator-seata-samples/blob/3ae0a30e94ccb76eabf8ffc15863dbfa29bda598/at-sample/at-api/src/main/java/org/apache/seata/api/BusinessService.java .
import io.seata.core.exception.TransactionException;
import io.seata.core.rpc.netty.RmNettyRemotingClient;
import io.seata.rm.RMClient;
import io.seata.tm.TMClient;
import io.seata.tm.api.GlobalTransaction;
import io.seata.tm.api.GlobalTransactionContext;
import org.apache.seata.api.service.OrderService;
import org.apache.seata.api.service.impl.AccountServiceImpl;
import org.apache.seata.api.service.impl.OrderServiceImpl;
import org.apache.seata.api.service.impl.StorageServiceImpl;
import org.springframework.util.ReflectionUtils;

import java.lang.reflect.Method;
import java.sql.SQLException;
import java.util.concurrent.TimeUnit;

RmNettyRemotingClient rmNettyRemotingClient = RmNettyRemotingClient.getInstance();
        Class<? extends RmNettyRemotingClient> rmRemoteClass = rmNettyRemotingClient.getClass();
        ReflectionUtils.doWithFields(rmRemoteClass, field -> {
            if (field.getName().equals("clientChannelManager")) {
                field.setAccessible(true);
                //channelManger
                Object o = field.get(rmNettyRemotingClient);
                Method reconnect;
                try {
                    reconnect = o.getClass().getDeclaredMethod("reconnect", String.class);
                    reconnect.setAccessible(true);
                    reconnect.invoke(o, "my_test_tx_group");
                } catch (Exception e) {
                    throw new RuntimeException("reconnect failed!", e);
                }
            }
        });
  • To do a health check, it is very strange to have to use reflection.

How it could be?

A clear and concise description of what you want to happen. You can explain more about input of the feature, and output of it.

  • No sure. Maybe expose the relevant API on the seata client side?

Other related information

Add any other context or screenshots about the feature request here.

  • Null.

linghengqian avatar Aug 05 '24 15:08 linghengqian