我用弹簧。我有很多具有链接依赖性的捆绑包。
mvc 包--> (调用)biz 包-->核心包-->公共包-->远程 RPC 服务
所有捆绑包都加载在同一个 JVM 中。但是mvc bundle不会直接调用biz bundle的对象,而是biz bundle通过向mvc bundle暴露一个接口来发布服务。mvc Bundle有一个代理对象,代理对象调用服务实现对象。
我的堆栈跟踪如下所示:
...
at com.mycorp.kbdatacenter.common.service.integration.nomo.NomoDataServiceClientImpl.getPropertyDistribution(NomoDataServiceClientImpl.java:64) ~[kbdatacenter-common-service-integration-1.0.0.jar:?]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_92]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_92]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_92]
at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_92]
at com.mycorp.sofa.runtime.service.binding.JvmBindingAdapter$JvmServiceInvoker$1.call(JvmBindingAdapter.java:87) ~[?:?]
at com.mycorp.ambush.chain.codewrapper.CodeWrapperInvocationImpl.proceed(CodeWrapperInvocationImpl.java:77) ~[ambush-1.0.10.jar:?]
at com.mycorp.guardian.client.sofa.GuardianCodeWrapperInterceptor.invokeCodeWrapper(GuardianCodeWrapperInterceptor.java:76) ~[guardian-sofa-1.1.5.jar:?]
at com.mycorp.ambush.chain.codewrapper.CodeWrapperInvocationImpl.proceed(CodeWrapperInvocationImpl.java:71) ~[ambush-1.0.10.jar:?]
at com.mycorp.ambush.catalog.AbstractCatalog.doIntercept(AbstractCatalog.java:252) ~[ambush-1.0.10.jar:?]
at com.mycorp.ambush.api.AmbushRPCUtil.invokeClient(AmbushRPCUtil.java:79) ~[ambush-1.0.10.jar:?]
at com.mycorp.sofa.runtime.service.binding.JvmBindingAdapter$JvmServiceInvoker.doInvoke(JvmBindingAdapter.java:90) ~[?:?]
at com.mycorp.sofa.runtime.service.component.ServiceProxy.invoke(ServiceProxy.java:29) ~[?:?]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.4.RELEASE.jar:4.3.4.RELEASE]
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213) ~[spring-aop-4.3.4.RELEASE.jar:4.3.4.RELEASE]
at com.sun.proxy.$Proxy91.getPropertyDistribution(Unknown Source) ~[?:?]
at com.mycorp.kbdatacenter.core.service.tag.TagDataQueryServiceImpl.queryByFilterRule(TagDataQueryServiceImpl.java:105) ~[kbdatacenter-core-service-1.0.0.jar:?]
... (119 lines more)
Run Code Online (Sandbox Code Playgroud)
我的核心包有一个代理对象nomoDataServiceClient,它调用公共包中的Impl对象。
我的问题是,是否可以过滤 StackTraceElement[],忽略包com.sun.proxy、sun.reflect等。我希望我的 stackstace 看起来像这样干净:
...
at com.mycorp.kbdatacenter.common.service.integration.nomo.NomoDataServiceClientImpl.getPropertyDistribution(NomoDataServiceClientImpl.java:64) ~[kbdatacenter-common-service-integration-1.0.0.jar:?]
at com.mycorp.kbdatacenter.core.service.tag.TagDataQueryServiceImpl.queryByFilterRule(TagDataQueryServiceImpl.java:105) ~[kbdatacenter-core-service-1.0.0.jar:?]
...
Run Code Online (Sandbox Code Playgroud)
是的你可以。如果捕获异常,您可以获取堆栈跟踪元素,从中创建一个新的(过滤后的)数组,并覆盖异常的堆栈跟踪,例如
try {
//your exception throwing call here
} catch(Exception e) {
e.setStackTrace(Arrays.stream(e.getStackTrace())
.filter(se -> !se.getClassName().startsWith("com.sun.proxy")) //or any other filter criteria
.collect(toList())
.toArray(new StackTraceElement[0])); //create a new stacktrace from the filtered list
//either e.printStackStrace();
//or rethrow
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1596 次 |
| 最近记录: |