1

Glassfish 在查找邮件资源时会陷入无限循环。仅当在 ejb.jar.xml 中定义自定义 <module-name> 时才会出现该错误。

例外:

在 javax.naming.InitialContext.lookup(InitialContext.java:392) 在 com.sun.enterprise.naming.util.JndiNamingObjectFactory.create(JndiNamingObjectFactory.java:90) 在 com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.lookup (GlassfishNamingManagerImpl.java:776) 在 com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.lookup(GlassfishNamingManagerImpl.java:744) 在 com.sun.enterprise.naming.impl.JavaURLContext.lookup(JavaURLContext.java:180) 在com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:498) 在 com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:455) 在 javax.naming.InitialContext.lookup( InitialContext.java:392) 在 com.sun.enterprise.naming.util.JndiNamingObjectFactory 的 javax.naming.InitialContext.lookup(InitialContext.java:392)。在 com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.lookup(GlassfishNamingManagerImpl.java:744) 的 com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.lookup(GlassfishNamingManagerImpl.java:776) 处创建 (JndiNamingObjectFactory.java:90)在 com.sun.enterprise.naming.impl.JavaURLContext.lookup(JavaURLContext.java:180) 在 com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:498) 在 com.sun.enterprise.naming .impl.SerialContext.lookup(SerialContext.java:455) 在 javax.naming.InitialContext.lookup(InitialContext.java:392) 在 javax.naming.InitialContext.lookup(InitialContext.java:392) 在 com.sun.enterprise。命名.util.JndiNamingObjectFactory.create(JndiNamingObjectFactory.java:90)776)在 com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.lookup(GlassfishNamingManagerImpl.java:744) 在 com.sun.enterprise.naming.impl.JavaURLContext.lookup(JavaURLContext.java:180) 在 com.sun.enterprise .naming.impl.SerialContext.lookup(SerialContext.java:498) at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:455) at javax.naming.InitialContext.lookup(InitialContext.java:392 ) 在 javax.naming.InitialContext.lookup(InitialContext.java:392) 在 com.sun.enterprise.naming.util.JndiNamingObjectFactory.create(JndiNamingObjectFactory.java:90)776)在 com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.lookup(GlassfishNamingManagerImpl.java:744) 在 com.sun.enterprise.naming.impl.JavaURLContext.lookup(JavaURLContext.java:180) 在 com.sun.enterprise .naming.impl.SerialContext.lookup(SerialContext.java:498) at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:455) at javax.naming.InitialContext.lookup(InitialContext.java:392 ) 在 javax.naming.InitialContext.lookup(InitialContext.java:392) 在 com.sun.enterprise.naming.util.JndiNamingObjectFactory.create(JndiNamingObjectFactory.java:90)在 com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:455) 中查找(SerialContext.java:498) 在 javax.naming.InitialContext.lookup(InitialContext.java:392) 在 javax.naming.InitialContext .lookup(InitialContext.java:392) 在 com.sun.enterprise.naming.util.JndiNamingObjectFactory.create(JndiNamingObjectFactory.java:90)在 com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:455) 中查找(SerialContext.java:498) 在 javax.naming.InitialContext.lookup(InitialContext.java:392) 在 javax.naming.InitialContext .lookup(InitialContext.java:392) 在 com.sun.enterprise.naming.util.JndiNamingObjectFactory.create(JndiNamingObjectFactory.java:90)

这是我的配置:

glassfish-resources.xml

<mail-resource enabled="true" host="${mail.host}"
    jndi-name="mail/MailSession" object-type="user"
    store-protocol="imap" store-protocol-class="com.sun.mail.imap.IMAPStore"
    transport-protocol="smtp" transport-protocol-class="com.sun.mail.smtp.SMTPTransport"
    user="mail@address.de" from="mail@address.de">
    <property name="mail-smtp-auth" value="true"/>
    <property name="mail-smtp-password" value="${password}" />
</mail-resource>

EMailService.java 中的注入

...
@Resource(name = "java:module/mail/MailSession")
private Session mySession;
...

ejb.jar.xml

<module-name>backend</module-name>

当然,上面提到的所有文件都驻留在同一个模块 => 后端。

使用 JNDI-Internals 的详细日志记录,我可以将问题深入到以下点:

工作场景(无模块名称):没有特殊模块名称时,模块名称将是带有我们文件扩展名的文件名,例如 backend-1.1.1-SNAPSHOT。这将导致以下查找场景,最终重新使用 MailResource:

.SerialContext;MethodName=lookup;|SerialContext ==> 查找(java:module/mail/MailSession)|#] .SerialContext;MethodName=lookup;|SerialContext ==> 查找相对名称:java:module/mail/MailSession|# ] .JavaURLContext;MethodName=lookup;|在 javaURLContext.lookup 中,name = java:module/mail/MailSession serialcontext...null|#] .SerialContext;MethodName=lookup;|SerialContext ==>lookup(java:global/portal -1.1.1/backend-1.1.1-SNAPSHOT/mail/MailSession)|#] .SerialContext;MethodName=lookup;|SerialContext ==> 查找相对名称:java:global/portal-1.1.1/backend-1.1。 1-SNAPSHOT/mail/MailSession|#] .SerialContextProviderImpl;MethodName=lookup;| SerialContextProviderImpl :: 查找 java:global/portal-1.1.1/backend-1.1.1-SNAPSHOT/mail/MailSession|#] .GlassfishNamingManagerImpl;MethodName=lookup;|GlassfishNamingManager..null|#] 中的串行上下文。

错误场景(自定义模块名称):添加自定义模块名称(如上面提到的 ejb.jar.xml 中所示)将因查找无限循环而失败。

相关的查找日志如下所示:

MethodName=lookup;|SerialContext ==> 查找相对名称:java:global/private-ear-1.2.0-SNAPSHOT/backend/mail/MailSession|#] FINE|glassfish3.1.1|com.sun.enterprise.naming|_ThreadID =23;_ThreadName=Thread-2;ClassName=com.sun.enterprise.naming.impl.SerialContextProviderImpl;MethodName=lookup;| SerialContextProviderImpl :: 查找 java:global/private-ear-1.2.0-SNAPSHOT/backend/mail/MailSession|#] FINE|glassfish3.1.1|com.sun.enterprise.naming|_ThreadID=23;_ThreadName=Thread-2; ClassName=com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl;MethodName=lookup;|GlassfishNamingManager..null|#] FINE|glassfish3.1.1|com.sun.enterprise.naming|_ThreadID=23;_ThreadName=Thread- 2;ClassName=com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl;MethodName=lookup;|GlassfishNamingManager : 查找名称 : java: MethodName=lookup;|SerialContext ==>lookup(java:global/private-ear-1.2.0-SNAPSHOT/backend/mail/MailSession)|#] FINE|glassfish3.1.1|com.sun.enterprise.naming|_ThreadID= 23;_ThreadName=Thread-2;ClassName=com.sun.enterprise.naming.impl.SerialContext;MethodName=lookup;|SerialContext ==> 查找相对名称:java:global/private-ear-1.2.0-SNAPSHOT/backend /mail/MailSession|#] FINE|glassfish3.1.1|com.sun.enterprise.naming|_ThreadID=23;_ThreadName=Thread-2;ClassName=com.sun.enterprise.naming.impl.SerialContextProviderImpl;MethodName=lookup;| SerialContextProviderImpl :: 查找 java:global/private-ear-1.2.0-SNAPSHOT/backend/mail/MailSession|#] FINE|glassfish3.1.1|com.sun.enterprise.naming|_ThreadID=23;_ThreadName=Thread-2; ClassName=com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl;MethodName=lookup;|GlassfishNamingManager 中的串行上下文..

从 asadmin 手动检查 glassfish 资源会获取以下条目:

private-ear-1.2.0-SNAPSHOT  <ear, web, ejb>
    private-frontend-1.2.0-SNAPSHOT.war  <WebModule>
    backend-1.2.0-SNAPSHOT.jar           <EJBModule>
        java:module/mail/MailSession <MailResource>

如果那里有专家,请给我一个提示。

4

0 回答 0