长安链JAVA SDK避坑总结
2.3.0-~2.3.1避坑点
1、当同步等待调用合约结果时,会有内存溢出风险。
避坑方法:不要使用同步等待结果。
syncResultTimeout设置为0
2、 连接池设置不当,会出现Pool exhausted异常,详见:
java.lang.RuntimeException: java.util.NoSuchElementException: Pool exhausted
at org.chainmaker.sdk.ChainClient.sendTxRequest(ChainClient.java:2419) ~[chainmaker-sdk-java-2.3.1.jar!/:?]
at org.chainmaker.sdk.ChainClient.sendRequest(ChainClient.java:2619) ~[chainmaker-sdk-java-2.3.1.jar!/:?]
at org.chainmaker.sdk.ChainClient.sendContractRequest(ChainClient.java:2564) ~[chainmaker-sdk-java-2.3.1.jar!/:?]
at org.chainmaker.sdk.ChainClient.queryContract(ChainClient.java:461) ~[chainmaker-sdk-java-2.3.1.jar!/:?]
避坑方法:临时方法就是根据并发量,调大maxTotal和maxIdle。
经测试,调大后压测时又可能会出现其他异常。
3、连接池连接未关闭异常。如下:
[[] 2023-05-19 18:15:50,721][commons-pool-evictor][ERROR] ManagedChannelOrphanWrapper$ManagedChannelReference.cleanQueue(151): *~*~*~ Channel ManagedChannelImpl{logId=1, target=192.168.1.2:18304} was not shutdown properly!!! ~*~*~*
Make sure to call shutdown()/shutdownNow() and wait until awaitTermination() returns true.
java.lang.RuntimeException: ManagedChannel allocation site
at io.grpc.internal.ManagedChannelOrphanWrapper$ManagedChannelReference.<init>(ManagedChannelOrphanWrapper.java:94) ~[grpc-core-1.23.0.jar!/:1.23.0]
at io.grpc.internal.ManagedChannelOrphanWrapper.<init>(ManagedChannelOrphanWrapper.java:52) ~[grpc-core-1.23.0.jar!/:1.23.0]
at io.grpc.internal.ManagedChannelOrphanWrapper.<init>(ManagedChannelOrphanWrapper.java:43) ~[grpc-core-1.23.0.jar!/:1.23.0]
at io.grpc.internal.AbstractManagedChannelImplBuilder.build(AbstractManagedChannelImplBuilder.java:512) ~[grpc-core-1.23.0.jar!/:1.23.0]
at org.chainmaker.sdk.RpcServiceClient.initManagedChannel(RpcServiceClient.java:170) ~[chainmaker-sdk-java-2.3.1.jar!/:?]
at org.chainmaker.sdk.RpcServiceClient.<init>(RpcServiceClient.java:83) ~[chainmaker-sdk-java-2.3.1.jar!/:?]
at org.chainmaker.sdk.RpcServiceClient.newServiceClient(RpcServiceClient.java:91) ~[chainmaker-sdk-java-2.3.1.jar!/:?]
at org.chainmaker.sdk.GrpcClientFactory.createRpcClient(GrpcClientFactory.java:126) ~[chainmaker-sdk-java-2.3.1.jar!/:?]
at org.chainmaker.sdk.GrpcClientFactory.create(GrpcClientFactory.java:109) ~[chainmaker-sdk-java-2.3.1.jar!/:?]
at org.chainmaker.sdk.GrpcClientFactory.create(GrpcClientFactory.java:21) ~[chainmaker-sdk-java-2.3.1.jar!/:?]
at org.apache.commons.pool2.BasePooledObjectFactory.makeObject(BasePooledObjectFactory.java:70) ~[commons-pool2-2.11.1.jar!/:2.11.1]
at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:571) ~[commons-pool2-2.11.1.jar!/:2.11.1]
at org.apache.commons.pool2.impl.GenericObjectPool.ensureIdle(GenericObjectPool.java:637) ~[commons-pool2-2.11.1.jar!/:2.11.1]
at org.apache.commons.pool2.impl.GenericObjectPool.ensureMinIdle(GenericObjectPool.java:659) ~[commons-pool2-2.11.1.jar!/:2.11.1]
at org.apache.commons.pool2.impl.BaseGenericObjectPool$Evictor.run(BaseGenericObjectPool.java:170) ~[commons-pool2-2.11.1.jar!/:2.11.1]
at org.apache.commons.pool2.impl.EvictionTimer$WeakRunner.run(EvictionTimer.java:113) ~[commons-pool2-2.11.1.jar!/:2.11.1]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[?:1.8.0_275]
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) ~[?:1.8.0_275]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) ~[?:1.8.0_275]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) ~[?:1.8.0_275]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[?:1.8.0_275]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[?:1.8.0_275]
at java.lang.Thread.run(Thread.java:748) ~[?:1.8.0_275]
避坑方法:升级SDK版本到2.3.1.2
4、不同步等待调用结果时
ResultOuterClass.TxResponse只有请求结果,不会有合约执行结果返回
这点需要注意,不然很容易导致上链结果误判。
还没有评论,来说两句吧...