Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java GlassFish:电子邮件日志处理程序_Java_Logging_Glassfish_Jakarta Mail - Fatal编程技术网

Java GlassFish:电子邮件日志处理程序

Java GlassFish:电子邮件日志处理程序,java,logging,glassfish,jakarta-mail,Java,Logging,Glassfish,Jakarta Mail,我们需要从GlassFish v3.1.2.2中的日志处理程序发送邮件 我们尝试使用smtphandler-0.6和-0.7,但效果有限。我们将jarfile安装到domain/lib/ext,并在domain/config/logging.properties中配置smtphandler的属性。我们尝试了两种方法来满足smtphandler对邮件导入的依赖:1)编辑其清单类路径以指向../../../../../../modules/javax.mail.jar,以及2)将javax.mail

我们需要从GlassFish v3.1.2.2中的日志处理程序发送邮件

我们尝试使用smtphandler-0.6和-0.7,但效果有限。我们将jarfile安装到domain/lib/ext,并在domain/config/logging.properties中配置smtphandler的属性。我们尝试了两种方法来满足smtphandler对邮件导入的依赖:1)编辑其清单类路径以指向../../../../../../modules/javax.mail.jar,以及2)将javax.mail.jar放在域/lib/ext中与smtphandler jar一起。(我们更喜欢前一种方法,以便在整个系统中使用相同的javamail类。但这似乎没有什么区别,也不可行。)

对于这两种安排中的任何一种,行为都是相同的:

  • 处理程序加载ok,如JVM的verbose:class输出所示
  • 有时,它会发送邮件,询问在域启动期间发生的错误和警告(如过期的证书)。其他情况下,在发送邮件之前,它会失败,如下所述
  • 一旦我们部署了应用程序并记录了一些应用程序错误,它就会失败。我们可以看出处理程序被调用了——这可以通过调试器和一些基本的System.out“日志记录”来证明
根问题是NoSuchMethodException:com.sun.mail.smtp.SMTPTransport。[init](会话,URLName)。找不到c'tor意味着无法创建传输对象;这最终表现为一种无任何例外

我们可以看到SMTPTransport类已加载,并且它具有请求的c'tor。我们最好的理论是,类加载在某种程度上是有关系的,但我们还没有弄清楚到底是如何进行的。(然而,我们现在正在从这个角度出发。)

问题:

  • 我们是否将处理程序部署到正确的位置(domain/lib/ext)
  • 为什么它(有时)在(空的,没有应用程序的)域启动期间发送邮件,但应用程序发出的日志失败?当然,这是一种竞争条件,但是那些线程在做什么,偶尔会工作一段时间,然后可靠地失败呢
  • 我们是否正确地认为所有这些指示一起意味着类加载问题
我们在GlassFish版本3.1.2.2和4以及JavaMail 1.4.4和1.5中重现了这些症状


提前感谢您的帮助。

似乎有人为此报告了一个bug。这个问题是由JavaMail团队提出的,而JavaMail团队是其下属的。升级glassfish中的JavaMail模块和部署的所有其他副本应该可以纠正这个问题。使用“glassfish/bin/asadmin start domain-v”启动glassfish也很有帮助,这样您就可以看到所有引导消息

•我们是否将处理程序部署到正确的位置(domain/lib/ext)

对。您可以部署到domain/lib/ext,但必须包含JavaMail 1.5.3,以便找到正确的传输服务。否则,您可以将jar部署到modules dir并添加,以使smtphandler看起来像一个服务。这可以通过包括新的jar或修改现有的smtphandler jar来实现

对于GlassFish 3,必须添加包含以下内容的文件
META-INF/infant/default

class=smtphandler.SMTPHandler,index=java.util.logging.Handler
[smtphandler.SMTPHandler]
contract={java.util.logging.Handler}
scope=javax.inject.Singleton
对于GlassFish 4,必须添加包含以下内容的文件
META-INF/hk2 locator/default

class=smtphandler.SMTPHandler,index=java.util.logging.Handler
[smtphandler.SMTPHandler]
contract={java.util.logging.Handler}
scope=javax.inject.Singleton
然后,jar必须与升级javax.mail.jar一起放在
glassfish/modules
文件夹中

另一个选项是将smtphandler子类化,使其看起来像HK2日志处理程序服务,并添加preDestroy方法以在关闭时触发电子邮件。《Oracle GlassFish Server 3.1管理指南》第一部分第7节对此进行了描述,标题为

在GlassFish 4下,需要在logging.properties中找到处理程序。放置在
domain/lib/ext
中的处理程序使用属性文件中的标准
Handlers
键。使用属性文件中的
handlerServices
键加载作为HK2服务放置在
glassfish/modules
中的处理程序

#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应用之间的差异。JavaMail中使用CCL来定位传输。修补“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项目的内容开发者

smtphandler的替代方案是JavaMail参考实现中包含的

在GlassFish4下,必须有
GlassFish/modules/javax.mail.jar
,也就是说。更新版本可从下载,并可用于替换与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