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>
如果那里有专家,请给我一个提示。