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( com.sun.enterprise.naming.util.JndiNamingObjectFactory の javax.naming.InitialContext.lookup(InitialContext.java:392) の InitialContext.java:392)。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) at javax.naming.InitialContext.lookup(InitialContext.java:392) at 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) で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) の lookup(SerialContext.java:498) javax.naming.InitialContext.lookup(InitialContext.java:392) の javax.naming.InitialContext com.sun.enterprise.naming.util.JndiNamingObjectFactory.create(JndiNamingObjectFactory.java:90) の .lookup(InitialContext.java:392)com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:455) の lookup(SerialContext.java:498) javax.naming.InitialContext.lookup(InitialContext.java:392) の javax.naming.InitialContext com.sun.enterprise.naming.util.JndiNamingObjectFactory.create(JndiNamingObjectFactory.java:90) の .lookup(InitialContext.java:392)

これが私の構成です:

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 ==> lookup( 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 :: lookup 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 :: 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.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 :: 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.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