0

有一个Wildfly Docker 容器实例,从Docker Hub下载,配置了 jms 队列和test用户test密码。Docker 实例使用Dockerfile中的以下代码启动:

FROM jboss/wildfly
COPY target/analysis-engine-1.0-SNAPSHOT.jar /opt/jboss/wildfly/standalone/deployments/
COPY docker-config/standalone-full.xml /opt/jboss/wildfly/standalone/configuration/
RUN /opt/jboss/wildfly/bin/add-user.sh -a -u test -p test --silent
ENTRYPOINT ["/opt/jboss/wildfly/bin/standalone.sh", "-c", "standalone-full.xml", "-Djboss.http.port=8081", "-b", "0.0.0.0", "-bmanagement", "0.0.0.0"]

standalone-full.xml与原始副本的唯一区别是添加了用于远程通信的JMS 队列,即<jms-queue name="MyQueue" entries="java:jboss/exported/jms/MyQueue"/>

另一方面,在同一台机器上,我使用以下代码创建了一个 Java SE jms 客户端:

public static void main(String[] args) throws JMSException {
    try {
        String principal = "test";
        String password = "test";
        Properties p = new Properties();
        p.setProperty(Context.PROVIDER_URL, "http-remoting://127.0.0.1:8081");
        p.setProperty(Context.INITIAL_CONTEXT_FACTORY, WildFlyInitialContextFactory.class.getName());
        p.setProperty(Context.SECURITY_PRINCIPAL, principal);
        p.setProperty(Context.SECURITY_CREDENTIALS, password);
        InitialContext context = new InitialContext(p);
        ConnectionFactory queueConnFactory = (ConnectionFactory) context.lookup("jms/RemoteConnectionFactory");
        Queue jmsQueue = (Queue) context.lookup("jms/MyQueue");
        try(JMSContext jmsContext = queueConnFactory.createContext(principal, password)) {
            Message message = jmsContext.createTextMessage("This is the message sent to the jms queue");
            jmsContext.createProducer().send(jmsQueue, message);
        }
    } catch (NamingException e) {
        e.printStackTrace();
    }
}

运行这个JMS客户端,也就是main上面的方法,会导致如下错误:

18:19:32.839 [main] ERROR org.apache.activemq.artemis.core.client - AMQ214016: Failed to create netty connection
java.net.UnknownHostException: f8788578fd46
    at java.net.InetAddress.getAllByName0(InetAddress.java:1281) ~[?:1.8.0_312]
    at java.net.InetAddress.getAllByName(InetAddress.java:1193) ~[?:1.8.0_312]
    at java.net.InetAddress.getAllByName(InetAddress.java:1127) ~[?:1.8.0_312]
    at java.net.InetAddress.getByName(InetAddress.java:1077) ~[?:1.8.0_312]
    at io.netty.util.internal.SocketUtils$8.run(SocketUtils.java:156) ~[netty-all-4.1.65.Final.jar:4.1.65.Final]
    at io.netty.util.internal.SocketUtils$8.run(SocketUtils.java:153) ~[netty-all-4.1.65.Final.jar:4.1.65.Final]
    at java.security.AccessController.doPrivileged(Native Method) ~[?:1.8.0_312]
    at io.netty.util.internal.SocketUtils.addressByName(SocketUtils.java:153) ~[netty-all-4.1.65.Final.jar:4.1.65.Final]
    at io.netty.resolver.DefaultNameResolver.doResolve(DefaultNameResolver.java:41) ~[netty-all-4.1.65.Final.jar:4.1.65.Final]
    at io.netty.resolver.SimpleNameResolver.resolve(SimpleNameResolver.java:61) ~[netty-all-4.1.65.Final.jar:4.1.65.Final]
    at io.netty.resolver.SimpleNameResolver.resolve(SimpleNameResolver.java:53) ~[netty-all-4.1.65.Final.jar:4.1.65.Final]
    at io.netty.resolver.InetSocketAddressResolver.doResolve(InetSocketAddressResolver.java:55) ~[netty-all-4.1.65.Final.jar:4.1.65.Final]
    at io.netty.resolver.InetSocketAddressResolver.doResolve(InetSocketAddressResolver.java:31) ~[netty-all-4.1.65.Final.jar:4.1.65.Final]
    at io.netty.resolver.AbstractAddressResolver.resolve(AbstractAddressResolver.java:106) ~[netty-all-4.1.65.Final.jar:4.1.65.Final]
    at io.netty.bootstrap.Bootstrap.doResolveAndConnect0(Bootstrap.java:206) ~[netty-all-4.1.65.Final.jar:4.1.65.Final]
    at io.netty.bootstrap.Bootstrap.access$000(Bootstrap.java:46) ~[netty-all-4.1.65.Final.jar:4.1.65.Final]
    at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:180) ~[netty-all-4.1.65.Final.jar:4.1.65.Final]
    at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:166) ~[netty-all-4.1.65.Final.jar:4.1.65.Final]
    at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:578) ~[netty-all-4.1.65.Final.jar:4.1.65.Final]
    at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:552) ~[netty-all-4.1.65.Final.jar:4.1.65.Final]
    at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:491) ~[netty-all-4.1.65.Final.jar:4.1.65.Final]
    at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:616) ~[netty-all-4.1.65.Final.jar:4.1.65.Final]
    at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:605) ~[netty-all-4.1.65.Final.jar:4.1.65.Final]
    at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:104) ~[netty-all-4.1.65.Final.jar:4.1.65.Final]
    at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84) ~[netty-all-4.1.65.Final.jar:4.1.65.Final]
    at io.netty.channel.AbstractChannel$AbstractUnsafe.safeSetSuccess(AbstractChannel.java:1012) ~[netty-all-4.1.65.Final.jar:4.1.65.Final]
    at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:516) ~[netty-all-4.1.65.Final.jar:4.1.65.Final]
    at io.netty.channel.AbstractChannel$AbstractUnsafe.access$200(AbstractChannel.java:429) ~[netty-all-4.1.65.Final.jar:4.1.65.Final]
    at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:486) ~[netty-all-4.1.65.Final.jar:4.1.65.Final]
    at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:164) ~[netty-all-4.1.65.Final.jar:4.1.65.Final]
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:472) ~[netty-all-4.1.65.Final.jar:4.1.65.Final]
    at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:387) ~[netty-all-4.1.65.Final.jar:4.1.65.Final]
    at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) ~[netty-all-4.1.65.Final.jar:4.1.65.Final]
    at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-all-4.1.65.Final.jar:4.1.65.Final]
    at org.apache.activemq.artemis.utils.ActiveMQThreadFactory$1.run(ActiveMQThreadFactory.java:118) ~[artemis-commons-2.16.0.jar:2.16.0]
18:19:32.843 [main] DEBUG org.apache.activemq.artemis.core.client.impl.ClientSessionFactoryImpl - Connector towards NettyConnector [host=f8788578fd46, port=8081, httpEnabled=false, httpUpgradeEnabled=true, useServlet=false, servletPath=/messaging/ActiveMQServlet, sslEnabled=false, useNio=true, activemqServerName=default, httpUpgradeEndpoint=http-acceptor] failed
18:19:32.845 [main] DEBUG org.apache.activemq.artemis.core.client.impl.ClientSessionFactoryImpl - Backup is not active, trying original connection configuration now.

最终的异常堆栈是:

Exception in thread "main" javax.jms.JMSRuntimeException: Failed to create session factory
    at org.apache.activemq.artemis.jms.client.JmsExceptionUtils.convertToRuntimeException(JmsExceptionUtils.java:88)
    at org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory.createContext(ActiveMQConnectionFactory.java:326)
    at org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory.createContext(ActiveMQConnectionFactory.java:314)
    at rx.practice.advanced.javax.naming.InitialContextLookupMDBDemo.main(InitialContextLookupMDBDemo.java:24)
Caused by: javax.jms.JMSException: Failed to create session factory
    at org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory.createConnectionInternal(ActiveMQConnectionFactory.java:886)
    at org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory.createContext(ActiveMQConnectionFactory.java:321)
    ... 2 more
Caused by: ActiveMQNotConnectedException[errorType=NOT_CONNECTED message=AMQ219007: Cannot connect to server(s). Tried with all available servers.]
    at org.apache.activemq.artemis.core.client.impl.ServerLocatorImpl.createSessionFactory(ServerLocatorImpl.java:703)
    at org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory.createConnectionInternal(ActiveMQConnectionFactory.java:884)
    ... 3 more 

创建JMSContext. _ _ 这意味着初始化ConnectionFactoryQueue通过JNDI正常工作成功,服务器端日志也可以证明这一点。

问题:如何使JMSContxt的创建成功?

4

0 回答 0