GlassFish サーバーにログ ハンドラーをインストールしようとしたときに、この NoSuchMethodException のバグが報告されたようです。この問題は、バグ K6668 | JavaMail チームによって提起されました。GH144 - JavaMail 1.5.3で修正された、使用できない Store および Transport クラスをスキップします。Glassfish の JavaMail モジュールとデプロイされた他のすべてのコピーをアップグレードすると、問題が修正されるはずです。「glassfish/bin/asadmin start-domain -v」を使用して Glassfish を起動すると、すべてのブートストラップ メッセージを確認できるようになります。
•ハンドラーを正しい場所 (domain/lib/ext) にデプロイしていますか?
はい。domain/lib/ext にデプロイできますが、正しいトランスポート サービスを見つけるために JavaMail 1.5.3 を含める必要があります。それ以外の場合は、jar をモジュール ディレクトリにデプロイし、HK2 メタデータを追加して、smtphandler をサービスのように見せることができます。これは、新しい jar を含めるか、既存の smtphandler jar を変更することで実行できます。
GlassFish 3 の場合META-INF/inhabitants/default
、以下を含むファイルを追加する必要があります。
class=smtphandler.SMTPHandler,index=java.util.logging.Handler
GlassFish 4 の場合META-INF/hk2-locator/default
、以下を含むファイルを追加する必要があります。
[smtphandler.SMTPHandler]
contract={java.util.logging.Handler}
scope=javax.inject.Singleton
次に、glassfish/modules
javax.mail.jar をアップグレードするとともに、jar をフォルダーに配置する必要があります。
もう 1 つのオプションは、smtphandler をサブクラス化して HK2 ログ ハンドラー サービスのように見せ、シャットダウン時に電子メールをトリガーする preDestroy メソッドを追加することです。これについては、『Oracle GlassFish Server 3.1 管理ガイド』のパート I セクション 7 の「Adding a Custom Logging Handler 」というタイトルで説明されています。
GlassFish 4では、logging.properties でハンドラーを見つける方法が 2 つあります。配置されたハンドラは、プロパティ ファイルdomain/lib/ext
の標準handlers
キーを使用します。glassfish/modules
HK2 サービスとして配置されたハンドラーhandlerServices
は、プロパティ ファイルのキーを使用して読み込まれます。
#GF3 ext/endorsed or OSGI. GF4 ext/endorsed only.
handlers=smtphandler.SMTPHandler
#GF4 OSGI only, 'handlerServices' should not contain any whitespace characters between handlers.
handlerServices=com.sun.enterprise.server.logging.GFFileHandler,smtphandler.SMTPHandler
• (空で、アプリがない) ドメインの起動中に (ときどき) メールを送信するのに、アプリケーションから出力されたログに失敗するのはなぜですか? 確かにそれは競合状態ですが、時折少しの間動作し、その後確実に失敗するスレッドは何をしているのでしょうか?
GF と Web アプリによってログに記録されたメッセージ間のコンテキスト クラス ローダーの違い。CCL は JavaMail でトランスポートを見つけるために使用されます。「sendBuffer」メソッドにパッチを適用すると、動作が修正されます。
@Override
protected void sendBuffer() {
final Thread thread = Thread.currentThread();
ClassLoader ccl = null;
try {
ccl = thread.getContextClassLoader();
thread.setContextClassLoader(
javax.mail.Transport.class.getClassLoader());
} catch (SecurityException ignore) {
}
try {
super.sendBuffer();
} finally {
try {
thread.getContextClassLoader();
thread.setContextClassLoader(ccl);
} catch (SecurityException ignore) {
}
}
}
•これらすべての兆候がまとめてクラスローディングの問題を暗示していると考えるのは正しいですか?
はい。これを正しく機能させる唯一の方法は、smtphandler をサブクラス化またはパッチを適用して HK2 コンポーネントのように見せ、CCL を変更することです。
GlassFish v3.1.2.2 のログ ハンドラからメールを送信する必要があります。smtphandler-0.6 と -0.7 を使用しようとしましたが、成功は限定的でした。
免責事項:私はJavaMail プロジェクトに含まれるMailHandlerのコンテンツ開発者です。
smtphandler の代替は、JavaMail 参照実装に含まれるcom.sun.mail.util.logging.MailHandlerです。
GlassFish 4では、 JavaMail 1.5.3 以降glassfish/modules/javax.mail.jar
が必要です。更新されたバージョンは、 JavaMail API ホームページからダウンロードでき、GlassFish にバンドルされているバージョンを置き換えるために使用できます。
logging.properties
次に、ドメインの を変更する必要があります。開始するために含めることができるサンプル構成を次に示します。
#Ensure no whitespace between handler class names.
handlerServices=com.sun.enterprise.server.logging.GFFileHandler,com.sun.mail.util.logging.MailHandler
com.sun.mail.util.logging.MailHandler.subject=com.sun.mail.util.logging.CollectorFormatter
#com.sun.mail.util.logging.CollectorFormatter.format=GlassFish 4.x:{0}{1}{2}{4,choice,-1#|0#|0<... {4,number,integer} more}
#com.sun.mail.util.logging.CompactFormatter.format=[%4$-7.7s] %7$#.140s
com.sun.mail.util.logging.MailHandler.level=WARNING
com.sun.mail.util.logging.MailHandler.filter=com.sun.mail.util.logging.DurationFilter
com.sun.mail.util.logging.MailHandler.pushLevel=WARNING
com.sun.mail.util.logging.MailHandler.mail.smtp.host=some-smtp-host
#com.sun.mail.util.logging.MailHandler.mail.user=some-user
#com.sun.mail.util.logging.MailHandler.authenticator=some-password
com.sun.mail.util.logging.MailHandler.mail.from=app@server.com
#com.sun.mail.util.logging.MailHandler.mail.sender=team@list.com
com.sun.mail.util.logging.MailHandler.mail.to=devs@bugfixers.com
com.sun.mail.util.logging.MailHandler.verify=resolve
com.sun.mail.util.logging.MailHandler.mail.smtp.quitwait=false
com.sun.mail.util.logging.MailHandler.mail.smtps.quitwait=false
com.sun.mail.util.logging.MailHandler.mail.smtp.connectiontimeout=45000
com.sun.mail.util.logging.MailHandler.mail.smtps.connectiontimeout=45000
com.sun.mail.util.logging.MailHandler.mail.smtp.timeout=45000
com.sun.mail.util.logging.MailHandler.mail.smtps.timeout=45000
GlassFish 3 の場合、JavaMail (javax.mail.jar) をdomain/lib/ext
orの下にインストールglassfish/lib/endorsed
し、これによってアプリケーションが壊れないことをテストする必要があります。このクラスローダ構成は GlassFish 4 でも機能し、MailHandler を smtphandler の動作をエミュレートできる MemoryHandler と組み合わせることができます。
logging.properties
次に、ドメインの を変更する必要があります。handlers
の代わりに標準タグを使用する必要があることを除いて、GlassFish 4 と同じサンプルを使用できますhandlerServices
。
handlers=java.util.logging.MemoryHandler
java.util.logging.MemoryHandler.target=com.sun.mail.util.logging.MailHandler
java.util.logging.MemoryHandler.size=512
java.util.logging.MemoryHandler.level=INFO
java.util.logging.MemoryHandler.push=WARNING
com.sun.mail.util.logging.MailHandler.capacity=512
com.sun.mail.util.logging.MailHandler.level=INFO
com.sun.mail.util.logging.MailHandler.pushLevel=WARNING
com.sun.mail.util.logging.MailHandler.filter=com.sun.mail.util.logging.DurationFilter
com.sun.mail.util.logging.DurationFilter.records=512
com.sun.mail.util.logging.DurationFilter.duration=5*60*1000