如何在Wildfly 10上查找远程jms队列

时间:2017-11-08 09:50:41

标签: java jboss jms wildfly message-queue

令人惊讶的是,我无法找到如何向Wildfly 10 jms队列发送消息的工作示例。似乎每个版本的Jboss都有不同的方式这样做,所以我可以找到一些例子,但每个版本都针对Wildfly 10解决了不同的版本而没有。

我要做的是从主wildfly实例(在机器1上运行)发送消息到托管在slave wildfly实例上的JMS队列(在机器2-n上运行)。换句话说,我可能有几个slave wildfly实例。

我已将每个从属实例的standalone-full.xml添加到以下内容中:
1)在global-modules元素

<module name="org.jboss.remote-naming" slot="main"/>

2)队列定义为

<jms-queue name="JobTaskMDB" entries="queue/JobTaskExecuterQueue java:jboss/exported/queue/JobTaskExecuterQueue"/>

3)每个奴隶都有来宾用户

我唯一添加到主实例的standalone-full.xml的是上面的(1)

给定一个机器名称,例如“WILDD250148-8C9”,如何有选择地将主Wildfly实例的消息发送到托管其中一个从属实例的指定机器的队列?

到目前为止,我甚至无法通过队列的查找。 我尝试过以下代码:

String server = "WILDD250148-8C9";
final Properties env = new Properties();
env.put(Context.INITIAL_CONTEXT_FACTORY, org.jboss.naming.remote.client.InitialContextFactory.class.getName());
env.put(Context.SECURITY_PRINCIPAL, "guest"); //has been added to all slaves
env.put(Context.SECURITY_CREDENTIALS, "guest"); 
String url = 
    //"queue/JobTaskExecuterQueue";
    //"http-remoting://" + server + ":8080";
    //"tcp://" + server + ":5445";
    "jnp://" + server + ":1099";
env.put(Context.PROVIDER_URL, url);  
env.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
remoteContext = new InitialContext(env);
String lookupName = 
    //"java:jboss/exported/queue/JobTaskExecuterQueue"; 
    //"JobTaskMDB";
    "queue.queue/JobTaskExecuterQueue";
Object x = remoteContext.lookup(lookupName);

我总是得到“javax.naming.CommunicationException:无法连接到任何服务器”,例如

 javax.naming.CommunicationException: Failed to connect to any server. Servers tried: [jnp://WILDD250148-8C9:1099 (No connection provider for URI scheme "jnp" is installed)]

javax.naming.CommunicationException: Failed to connect to any server. Servers tried: [tcp://WILDD250148-8C9:5445 (No connection provider for URI scheme "tcp" is installed)]

当我使用网址“http-remoting://”+ server +“:8080”时,我得到了例外:

javax.naming.CommunicationException: Failed to connect to any server. Servers tried: [http-remoting://WILDD250148-8C9:8080 (Operation failed with status WAITING after 5000 MILLISECONDS)] [Root exception is java.net.ConnectException: Operation failed with status WAITING after 5000 MILLISECONDS]

显然我甚至不知道要使用哪个提供商网址。

我在这里缺少什么?

1 个答案:

答案 0 :(得分:1)

WildFly 10的正确网址提供商是http-remoting。 这适用于Wildfly 10.1:

    Properties props = new Properties();
    props.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
    props.put(Context.PROVIDER_URL, "http-remoting://127.0.0.1:8080");
    props.put(Context.SECURITY_PRINCIPAL, "user");
    props.put(Context.SECURITY_CREDENTIALS, "password");
    InitialContext ctx = new InitialContext(props);
    ActiveMQConnectionFactory cf = (ActiveMQConnectionFactory) ctx.lookup("jms/RemoteConnectionFactory");
    ActiveMQQueue queue = (ActiveMQQueue) ctx.lookup("queue/JobTaskExecuterQueue");

如果队列的JNDI名称是java:jboss/exported/queue/JobTaskExecuterQueue,那么从客户端使用queue/JobTaskExecuterQueue(它相对于java:jboss/exported/命名空间)

删除此行,不需要: env.put(Context.URL_PKG_PREFIXES,"org.jboss.naming:org.jnp.interfaces");

如果你正在

  

在5000 MILLISECONDS

之后,操作失败,状态为WAITING

那么这意味着连接因某些可能不同的原因而被卡住超过5秒,例如防火墙,网络速度慢或其他什么 - 客户端代码可能是正确的。