0

GlassFish v3.1.2.2 のログ ハンドラからメールを送信する必要があります。

smtphandler-0.6 と -0.7 を使用しようとしましたが、成功は限定的でした。jarfile を domain/lib/ext にインストールし、domain/config/logging.properties で smtphandler のプロパティを構成します。smtphandler のメール インポートへの依存を満たすために、次の 2 つの方法を試しました。 smtphandler jar と並んで domain/lib/ext の .jar。(システム全体で同じ javamail クラスが使用されるように、前者のアプローチを好みます。しかし、違いはなく、どちらの方法でも機能しないようです。)

これらの配置のどちらでも、動作は同じです。

  • JVM の verbose:class 出力に示されているように、ハンドラーは ok をロードします。
  • ドメインの起動中に発生したエラーや警告 (期限切れの証明書など) についてメールを送信することがあります。メールを送信する前に、以下に説明するように失敗する場合もあります。
  • アプリケーションをデプロイしていくつかのアプリケーション エラーをログに記録すると、常に失敗します。ハンドラーが呼び出されたことがわかります。これは、デバッガーといくつかの基本的な System.out の「ログ」によって証明されます。

根本的な問題は NoSuchMethodException: com.sun.mail.smtp.SMTPTransport.[init](Session, URLName) です。c'tor が見つからないということは、トランスポート オブジェクトを作成できないことを意味します。これは最終的に NoSuchProtocolException として現れます。

SMTPTransport クラスがロードされ、要求された c'tor があることがわかります。私たちの最良の理論は、クラスのロードが何らかの形で関与しているということですが、正確にどのように把握することはできませんでした. (しかし、私たちは今その角度に取り組んでいます。)

質問:

  • ハンドラーを正しい場所 (domain/lib/ext) にデプロイしていますか?
  • (空の、アプリがない) ドメインの起動中に (時々) メールを送信するのに、アプリケーションから出力されたログに失敗するのはなぜですか? 確かにそれは競合状態ですが、時折少しの間動作し、その後確実に失敗するスレッドは何をしているのでしょうか?
  • これらすべての兆候が一緒になって、クラスの読み込みの問題を暗示していると考えるのは正しいでしょうか?

JavaMail 1.4.4 および 1.5 を使用して、GlassFish バージョン 3.1.2.2 および 4 でこれらの症状を再現しました。

助けてくれてありがとう。

4

1 に答える 1

0

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/modulesjavax.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/modulesHK2 サービスとして配置されたハンドラー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/extorの下にインストール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
于 2013-10-11T19:33:24.870 に答える