【发布时间】:2017-03-31 23:08:56
【问题描述】:
我有一个在独立域上运行但在集群设置中失败的应用程序。
在我的应用程序中,我有一个 JCA 资源适配器,它需要在 EIS 中的特定情况下通过 JMS 消息发送消息,因此在事件之后的连接实现中我调用 getJMSConnectionFactory。
private Object lookup(String what) {
try {
// needs no environment
Context jndiContext = new InitialContext();
return jndiContext.lookup(what);
} catch (NamingException ex) {
throw MyProjectException.getInstance("lookup of " + what + " failed.", ex);
}
}
public ConnectionFactory getJMSConnectionFactory() throws JMSException {
return (ConnectionFactory)lookup("java:comp/DefaultJMSConnectionFactory");
}
我也以这种方式查找目标,然后发送 JMS 消息。现在,当我部署到单个域时,它可以按预期工作,但是当我尝试在集群设置中执行此操作时,我得到了这个异常(下面的相关详细信息):
javax.ejb.EJBException
Caused by: myclasspath.MyProjectException: sayHelloyOverJMS
Caused by: myclasspath.MyProjectException: lookup of java:comp/DefaultJMSConnectionFactory failed.
Caused by: javax.naming.NamingException: Lookup failed for 'java:comp/DefaultJMSConnectionFactory' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Root exception is javax.naming.NamingException: Lookup failed for 'jms/__defaultConnectionFactory' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Root exception is javax.naming.NamingException: Unable to lookup resource : jms/__defaultConnectionFactory [Root exception is com.sun.appserv.connectors.internal.api.ConnectorRuntimeException: Lookup failed for '__SYSTEM/pools/jms/__defaultConnectionFactory-Connection-Pool' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming}]]]
Caused by: javax.naming.NamingException: Lookup failed for 'jms/__defaultConnectionFactory' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Root exception is javax.naming.NamingException: Unable to lookup resource : jms/__defaultConnectionFactory [Root exception is com.sun.appserv.connectors.internal.api.ConnectorRuntimeException: Lookup failed for '__SYSTEM/pools/jms/__defaultConnectionFactory-Connection-Pool' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming}]]
Caused by: javax.naming.NamingException: Unable to lookup resource : jms/__defaultConnectionFactory [Root exception is com.sun.appserv.connectors.internal.api.ConnectorRuntimeException: Lookup failed for '__SYSTEM/pools/jms/__defaultConnectionFactory-Connection-Pool' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming}]
Caused by: com.sun.appserv.connectors.internal.api.ConnectorRuntimeException: Lookup failed for '__SYSTEM/pools/jms/__defaultConnectionFactory-Connection-Pool' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming}
Caused by: javax.naming.NamingException: Lookup failed for '__SYSTEM/pools/jms/__defaultConnectionFactory-Connection-Pool' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Root exception is javax.naming.NameNotFoundException: jms]
Caused by: javax.naming.NameNotFoundException: jms
我认为相关的细节是:
Lookup failed for '__SYSTEM/pools/jms/__defaultConnectionFactory-Connection-Pool'.
这似乎找到了“__SYSTEM/pools”,但没有找到“jms”。我确实查看了 Glassfish 的 GUI 以配置连接池
jms/__defaultConnectionFactory-Connection-Pool,但我没有在那里找到任何有关“目标”的信息,所以我认为它应该在整个域中都可用,包括集群。集群配置的资源选项卡没有列出连接池(或任何其他“__SYSTEM”条目)。
当我问 glassfish 有哪些可用的 JNDI 资源时:
$ asadmin list-jms-resources cluster_name
jms/DataFlowClusterCommunicationTopic
jms/__defaultConnectionFactory
Command list-jms-resources executed successfully.
$ asadmin list-jms-resources domain-1-instance
remote failure: The list-jms-resources command is not allowed on target domain-1-instance because it is part of cluster cluster_name
Command list-jms-resources failed.
$ asadmin list-jms-resources domain
jms/DataFlowClusterCommunicationTopic
jms/__defaultConnectionFactory
Command list-jms-resources executed successfully.
所以,据我了解,jms/__defaultConnectionFactory 名称是存在的,并且应该在集群设置中与域设置一样多。
环境:
- AS:GlassFish Server 开源版 4.1.1(内部版本 1)
-
Java:
- openjdk 版本“1.8.0_111”
- OpenJDK 运行时环境(内部版本 1.8.0_111-8u111-b14-2-b14)
- OpenJDK 64 位服务器 VM(内部版本 25.111-b14,混合模式)
操作系统:Linux fuchs-linux-pc 4.7.0-1-amd64 #1 SMP Debian 4.7.8-1 (2016-10-19) x86_64 GNU/Linux
- 使用 Maven 3 构建
【问题讨论】:
-
你在这个问题上有什么进展吗?我也有同样的情况
-
@karelss 不幸的是,现在我自己不再有这个问题了(我不再参与这个项目了)。我们有机会切换到不同的 AS,并且这样做了。它在那里奏效了,但那种等待发生的问题的模糊感觉仍然存在。
-
@karelss 如果您支持这个问题,它将被推到首页。如果您选择提出新问题,请留下一个链接,以便最终将其作为重复问题关闭。
-
在做了一些研究后,我发现 glassfish jira 上报告了一些与此问题相关的错误,例如 java.net/jira/browse/GLASSFISH-21656 或 java.net/jira/browse/GLASSFISH-21655,我将等待检查此问题是否已修复5.0 版。
-
@karelss 这两个问题都已经关闭。您是否已经尝试过 4.1.2 版本?