2017-02-16 13 views
1

私たちのプロジェクトには以下のコードがありますが、動作は良好ですがランダムに実行時にクラスdefが見つかりませんでした。私たちのAppサーバーは毎週日曜日に再起動されるので、ランダムなサーバーインスタンスでこのエラーが発生することがあります。 サーバーを再起動すると、問題が解決しますが、なぜクラスの読み込みが途切れるかがわかります。Java 8ラムダ - ランタイムエラー

私はこの質問にやや似たエラーを持って、問題は、JDK 9 Transforming lambdas in Java 8

に固定されている。しかし、私は、誰かが、それは誤りと同じ種類であり、それは時折起こる理由を説明することができます結論の前にいるようです。

public boolean isAttachmentExpired(final Document_Attachment da) { 
    return this.bcDocumentScreen.getValidator().getAttachmentsValidator().isAttachmentExpired(da); 
} 

public boolean isAttachmentWarningShown() { 
    return CollectionUtils.isNotEmpty(getAttachments()) && getAttachments().stream().anyMatch(this::isAttachmentExpired); 
} 

public boolean isAttachmentExpired(final Document_Attachment da) { 
     final Date today = DateHelper.today(); 
     return DateHelper.diffInYears(today, da.getUploaded()) >= 1; 
    } 

エラー: -

Caused by: java.lang.reflect.InvocationTargetException 
     at sun.reflect.GeneratedMethodAccessor1913.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:498) 
     at org.jboss.seam.util.Reflections.invoke(Reflections.java:22) 
     at org.jboss.seam.intercept.RootInvocationContext.proceed(RootInvocationContext.java:32) 
     at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:56) 
     at org.jboss.seam.core.BijectionInterceptor.aroundInvoke(BijectionInterceptor.java:79) 
     at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68) 
     at org.jboss.seam.persistence.ManagedEntityInterceptor.aroundInvoke(ManagedEntityInterceptor.java:48) 
     at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68) 
     at org.jboss.seam.transaction.RollbackInterceptor.aroundInvoke(RollbackInterceptor.java:28) 
     at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68) 
     at org.jboss.seam.core.MethodContextInterceptor.aroundInvoke(MethodContextInterceptor.java:44) 
     at org.jboss.seam.intercept.SeamInvocationContext.proceed(SeamInvocationContext.java:68) 
     at org.jboss.seam.intercept.RootInterceptor.invoke(RootInterceptor.java:107) 
     at org.jboss.seam.intercept.JavaBeanInterceptor.interceptInvocation(JavaBeanInterceptor.java:196) 
     at org.jboss.seam.intercept.JavaBeanInterceptor.invoke(JavaBeanInterceptor.java:114) 
     at com.XXX.BcdAttachmentsSection_$$_javassist_seam_91.isAttachmentWarningShown(BcdAttachmentsSection_$$_javassist_seam_91.java) 
     at sun.reflect.GeneratedMethodAccessor1912.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:498) 
     at javax.el.BeanELResolver.getValue(BeanELResolver.java:363) 
     at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176) 
     at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203) 
     at org.jboss.el.parser.AstPropertySuffix.getValue(AstPropertySuffix.java:53) 
     at org.jboss.el.parser.AstValue.getValue(AstValue.java:67) 
     at org.jboss.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186) 
     at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109) 
     ... 122 more 
Caused by: java.lang.NoClassDefFoundError: com/XXX/docsections/BcdAttachmentsSection$$Lambda$75 
     at com.XXX.BcdAttachmentsSection$$Lambda$75/1736532374.get$Lambda(Unknown Source) 
     at com.XXXX.isAttachmentWarningShown(BcdAttachmentsSection.java:51) 
     ... 150 more 
+0

シャットダウン中にこれが起こっていますか? – teppic

+0

いいえ、ユーザーがisAttachmentWarningShownメソッドが呼び出されるモジュールにアクセスしようとするたびに発生します –

+2

Reflectionクラスと匿名クラスの間のこの非互換性はわかりますが、jbossが 'Predicate'でReflection経由でメソッドを呼び出そうとしている理由を理解できません。 。 – Holger

答えて

5

計装が関与している場合には、the bug, you have linkedが適用されないということは非常に可能です。このバグJDK-8027681, “Lambda serialization fails once reflection proxy generation kicks in”は、16回以上実行されたすべてのReflection操作(設定可能なしきい値)に影響します。これは、HotSpotがインライン化できるバイトコードで構成されるアクセサクラスを生成することで、このバイトコードは、Java 8の初期バージョンでラムダ式用に生成された匿名クラスにはアクセスできませんでした。

このバグは修正されましたが、特定の数の呼び出し後にクラスを生成するという前述の動作生成されたこれらのクラスをインストルメントするためには、まだInstrumentationバグが存在しないために失敗し、呼び出し回数に依存することがときどき発生する可能性が高いです。

このInstrumentation/JVMのバグは修正する必要がありますが(次のリリースで修正される)、これらのクラスを計測しようとするのにも役立ちません。通常、これらの内部ヘルパークラスを計測する理由はないはずです。

+0

このバグを参照していただきありがとうございますが、このバグが解決された後のjdk 1.8.0_111上に既にあります。 –

+0

また、アプリケーションはweblogicにデプロイされています。このメソッドを持つクラスがjboss継ぎ目コンポーネントであるため、実際には 'jboss'を参照するエラーのトレースがあります。 –

+1

これは、どのような計測器にも適用されます(「jboss」か「jboss seam component」かどうかは関係ありません)。この声明はまだ成立しており、この傍受が何を達成しようとしているのかは不明です。 – Holger

関連する問題