【问题标题】:Cannot create JMS connection from standalone Java application to JBoss AS 7 message queue无法创建从独立 Java 应用程序到 JBoss AS 7 消息队列的 JMS 连接
【发布时间】:2012-10-26 13:23:34
【问题描述】:

我已经配置了一个在 JBoss AS 7.1.1.FINAL 上运行的 JMS 队列,使用 standalone-full.xml 作为配置文件。

然后我编写了一个独立 Java 程序来连接到队列并根据 JBoss 示例代码发送消息。

public class RemoteProducer {

    private static final Logger log = Logger.getLogger(RemoteProducer.class.getName());

    // Set up all the default values
    private static final String DEFAULT_CONNECTION_FACTORY = "jms/RemoteConnectionFactory";
    private static final String DEFAULT_DESTINATION = "jms/queue/test";
    private static final String DEFAULT_USERNAME = "jmstest";
    private static final String DEFAULT_PASSWORD = "fluppy";
    private static final String INITIAL_CONTEXT_FACTORY = "org.jboss.naming.remote.client.InitialContextFactory";
    private static final String PROVIDER_URL = "remote://localhost:4447";

    /**
     * @param args
     */
    public static void main(String[] args) {
        ConnectionFactory connectionFactory = null;
        Connection connection = null;
        Session session = null;
        MessageProducer producer = null;
        Destination destination = null;
        Context context = null;

        try {
            // Set up the context for the JNDI lookup
            final Properties env = new Properties();
            env.put(Context.INITIAL_CONTEXT_FACTORY, INITIAL_CONTEXT_FACTORY);
            env.put(Context.PROVIDER_URL, System.getProperty(Context.PROVIDER_URL, PROVIDER_URL));
            env.put(Context.SECURITY_PRINCIPAL, System.getProperty("username", DEFAULT_USERNAME));
            env.put(Context.SECURITY_CREDENTIALS, System.getProperty("password", DEFAULT_PASSWORD));
            context = new InitialContext(env);

            // Perform the JNDI lookups
            String connectionFactoryString = System.getProperty("connection.factory", DEFAULT_CONNECTION_FACTORY);
            log.info("Attempting to acquire connection factory \"" + connectionFactoryString + "\"");
            connectionFactory = (ConnectionFactory) context.lookup(connectionFactoryString);
            log.info("Found connection factory \"" + connectionFactoryString + "\" in JNDI");

            String destinationString = System.getProperty("destination", DEFAULT_DESTINATION);
            log.info("Attempting to acquire destination \"" + destinationString + "\"");
            destination = (Destination) context.lookup(destinationString);
            log.info("Found destination \"" + destinationString + "\" in JNDI");

            // Create the JMS connection, session, producer, and consumer
            connection = connectionFactory.createConnection(System.getProperty("username", DEFAULT_USERNAME), System.getProperty("password", DEFAULT_PASSWORD));
            session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            producer = session.createProducer(destination);
            connection.start();

            // TODO send messages

        } catch (NamingException e) {
            e.printStackTrace();
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}

很遗憾,对 connectionFactory.createConnection 的调用失败并出现 JMS 异常 (HornetQException[errorCode=3 message=Timed out waiting to receive cluster topology. Group:null):

日志:

Nov 06, 2012 3:37:42 PM de.test.jms.RemoteProducer main
INFO: Attempting to acquire connection factory "jms/RemoteConnectionFactory"
Nov 06, 2012 3:37:42 PM de.test.jms.RemoteProducer main
INFO: Found connection factory "jms/RemoteConnectionFactory" in JNDI
Nov 06, 2012 3:37:42 PM de.test.jms.RemoteProducer main
INFO: Attempting to acquire destination "jms/queue/test"
Nov 06, 2012 3:37:42 PM de.test.jms.RemoteProducer main
INFO: Found destination "jms/queue/test" in JNDI
javax.jms.JMSException: Failed to create session factory
    at org.hornetq.jms.client.HornetQConnectionFactory.createConnectionInternal(HornetQConnectionFactory.java:605)
    at org.hornetq.jms.client.HornetQConnectionFactory.createConnection(HornetQConnectionFactory.java:119)
    at de.test.jms.RemoteProducer.main(RemoteProducer.java:60)
Caused by: HornetQException[errorCode=3 message=Timed out waiting to receive cluster topology. Group:null]
    at org.hornetq.core.client.impl.ServerLocatorImpl.createSessionFactory(ServerLocatorImpl.java:804)
    at org.hornetq.jms.client.HornetQConnectionFactory.createConnectionInternal(HornetQConnectionFactory.java:601)
    ... 2 more

问题:不涉及集群,两个程序在同一台机器上运行,我没有配置任何IP地址。有谁知道我在 JBoss 配置中可能缺少什么?

欢迎任何提示:-)

【问题讨论】:

    标签: jms jboss7.x


    【解决方案1】:

    我通过检查和更改项目的 Maven 依赖项解决了这个问题。

    有了这个 Maven 依赖,程序按预期工作:

    <dependency>
        <groupId>org.jboss.as</groupId>
        <artifactId>jboss-as-jms-client-bom</artifactId>
        <version>7.1.1.Final</version>
        <type>pom</type>
    </dependency>
    

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题,但产品版本不同。 具体来说,我试图让 Spring Boot(1.4.1 版)应用程序向 HornetQ Server 2.3.25.SP13 版(嵌入在 JBoss EAP 6.4.10 服务器上)发送消息。 解决方案是在我的 Spring Boot 应用程序中添加以下依赖项:

          <dependency>
              <groupId>org.hornetq</groupId>
              <artifactId>hornetq-jms-client</artifactId>
              <version>2.3.22.Final</version>
          </dependency>
      

      【讨论】:

        猜你喜欢
        • 2012-03-24
        • 1970-01-01
        • 2014-07-05
        • 2016-07-24
        • 2014-12-08
        • 1970-01-01
        • 1970-01-01
        • 2013-08-01
        • 2014-05-08
        相关资源
        最近更新 更多