长安链JAVA SDK避坑总结

红太狼 2024-05-08 07:22 195阅读 0赞

2.3.0-~2.3.1避坑点

1、当同步等待调用合约结果时,会有内存溢出风险。

避坑方法:不要使用同步等待结果。

  1. syncResultTimeout设置为0

2、 连接池设置不当,会出现Pool exhausted异常,详见:

  1. java.lang.RuntimeException: java.util.NoSuchElementException: Pool exhausted
  2. at org.chainmaker.sdk.ChainClient.sendTxRequest(ChainClient.java:2419) ~[chainmaker-sdk-java-2.3.1.jar!/:?]
  3. at org.chainmaker.sdk.ChainClient.sendRequest(ChainClient.java:2619) ~[chainmaker-sdk-java-2.3.1.jar!/:?]
  4. at org.chainmaker.sdk.ChainClient.sendContractRequest(ChainClient.java:2564) ~[chainmaker-sdk-java-2.3.1.jar!/:?]
  5. at org.chainmaker.sdk.ChainClient.queryContract(ChainClient.java:461) ~[chainmaker-sdk-java-2.3.1.jar!/:?]

避坑方法:临时方法就是根据并发量,调大maxTotal和maxIdle。

经测试,调大后压测时又可能会出现其他异常。

3、连接池连接未关闭异常。如下:

  1. [[] 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!!! ~*~*~*
  2. Make sure to call shutdown()/shutdownNow() and wait until awaitTermination() returns true.
  3. java.lang.RuntimeException: ManagedChannel allocation site
  4. at io.grpc.internal.ManagedChannelOrphanWrapper$ManagedChannelReference.<init>(ManagedChannelOrphanWrapper.java:94) ~[grpc-core-1.23.0.jar!/:1.23.0]
  5. at io.grpc.internal.ManagedChannelOrphanWrapper.<init>(ManagedChannelOrphanWrapper.java:52) ~[grpc-core-1.23.0.jar!/:1.23.0]
  6. at io.grpc.internal.ManagedChannelOrphanWrapper.<init>(ManagedChannelOrphanWrapper.java:43) ~[grpc-core-1.23.0.jar!/:1.23.0]
  7. at io.grpc.internal.AbstractManagedChannelImplBuilder.build(AbstractManagedChannelImplBuilder.java:512) ~[grpc-core-1.23.0.jar!/:1.23.0]
  8. at org.chainmaker.sdk.RpcServiceClient.initManagedChannel(RpcServiceClient.java:170) ~[chainmaker-sdk-java-2.3.1.jar!/:?]
  9. at org.chainmaker.sdk.RpcServiceClient.<init>(RpcServiceClient.java:83) ~[chainmaker-sdk-java-2.3.1.jar!/:?]
  10. at org.chainmaker.sdk.RpcServiceClient.newServiceClient(RpcServiceClient.java:91) ~[chainmaker-sdk-java-2.3.1.jar!/:?]
  11. at org.chainmaker.sdk.GrpcClientFactory.createRpcClient(GrpcClientFactory.java:126) ~[chainmaker-sdk-java-2.3.1.jar!/:?]
  12. at org.chainmaker.sdk.GrpcClientFactory.create(GrpcClientFactory.java:109) ~[chainmaker-sdk-java-2.3.1.jar!/:?]
  13. at org.chainmaker.sdk.GrpcClientFactory.create(GrpcClientFactory.java:21) ~[chainmaker-sdk-java-2.3.1.jar!/:?]
  14. at org.apache.commons.pool2.BasePooledObjectFactory.makeObject(BasePooledObjectFactory.java:70) ~[commons-pool2-2.11.1.jar!/:2.11.1]
  15. at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:571) ~[commons-pool2-2.11.1.jar!/:2.11.1]
  16. at org.apache.commons.pool2.impl.GenericObjectPool.ensureIdle(GenericObjectPool.java:637) ~[commons-pool2-2.11.1.jar!/:2.11.1]
  17. at org.apache.commons.pool2.impl.GenericObjectPool.ensureMinIdle(GenericObjectPool.java:659) ~[commons-pool2-2.11.1.jar!/:2.11.1]
  18. at org.apache.commons.pool2.impl.BaseGenericObjectPool$Evictor.run(BaseGenericObjectPool.java:170) ~[commons-pool2-2.11.1.jar!/:2.11.1]
  19. at org.apache.commons.pool2.impl.EvictionTimer$WeakRunner.run(EvictionTimer.java:113) ~[commons-pool2-2.11.1.jar!/:2.11.1]
  20. at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[?:1.8.0_275]
  21. at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) ~[?:1.8.0_275]
  22. at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) ~[?:1.8.0_275]
  23. at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) ~[?:1.8.0_275]
  24. at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[?:1.8.0_275]
  25. at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[?:1.8.0_275]
  26. at java.lang.Thread.run(Thread.java:748) ~[?:1.8.0_275]

避坑方法:升级SDK版本到2.3.1.2

4、不同步等待调用结果时

  1. ResultOuterClass.TxResponse只有请求结果,不会有合约执行结果返回

这点需要注意,不然很容易导致上链结果误判。

发表评论

表情:
评论列表 (有 0 条评论,195人围观)

还没有评论,来说两句吧...

相关阅读

    相关 四种缓存的总结

    背景 分布式、缓存、异步和多线程被称为互联网开发的四大法宝。今天我总结一下项目开发中常接触的四种缓存实际项目中遇到过的问题。 JVM堆内缓存 JVM堆内缓存因为可以避免m

    相关 四种缓存的总结

    背景 分布式、缓存、异步和多线程被称为互联网开发的四大法宝。今天我总结一下项目开发中常接触的四种缓存实际项目中遇到过的问题。 JVM堆内缓存 JVM堆内缓存因为可以