将JMS从Jboss 4.2.3GA发送到7.1.1

时间:2014-09-22 13:00:40

标签: java-ee jboss jms jndi

我试图从Jboss 4.2.3GA实例向Jboss 7.1.1.Final实例发送JMS消息(远程)。当我尝试这样做时," 7.1.1风格"

properties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory");
properties.put(Context.PROVIDER_URL, "remote://127.0.0.1:4447");
InitialContext jndiContext = new InitialContext(properties);
ConnectionFactory cf = (ConnectionFactory) jndiContext.lookup("jms/RemoteConnectionFactory");

我得到了

  

ClassNotFoundException:org.jboss.naming.remote.client.InitialContextFactory

当我尝试这样做时," 4.2.3"方式

properties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
properties.put(Context.PROVIDER_URL, "remote://127.0.0.1:4447");
InitialContext jndiContext = new InitialContext(properties);
ConnectionFactory cf = (ConnectionFactory) jndiContext.lookup("jms/RemoteConnectionFactory");

我得到了

  

UnknownHostException:remote

使用不同的地址(jnp://127.0.0.1:4447)我有java.io.StreamCorruptedException: invalid stream header: 0000000C

我用standalone.bat --server-config=standalone-full.xml -b 0.0.0.0启动7.1.1。 请帮助我在这里蒙住眼睛。关于如何将JMS从4.2.3GA发送到7.1.1的任何示例都将非常感激。

1 个答案:

答案 0 :(得分:0)

这个问题的主要问题在于

  

不再支持以前JBoss版本中使用的旧的基于jnp的JNDI实现

我们必须使用remote:协议。有用的资源是jboss dev guide JNDImaster the jboss ejb tutorial

他们告诉您,jboss-client.jar需要%JBOSS_HOME%/bin/client。对于Java SE项目来说确实如此。对于不同的应用服务器,它太多导致它导致一些javax.*冲突并导致我的注入点失败。我最终得到了这套罐子:

  • 的JBoss-远程-3.2.3.GA.jar
  • 的JBoss远程命名-1.0.2.Final.jar
  • 的JBoss-SASL-1.0.0.Final.jar
  • 的JBoss编组-1.3.11.GA.jar
  • 的JBoss编组河-1.3.11.GA.jar
  • 的JBoss-测井3.1.0.GA.jar
  • 网状-3.2.6.Final.jar
  • xnio-API-3.0.3.GA.jar
  • xnio-NIO-3.0.3.GA.jar
  • HornetQ的核 - 客户2.2.13.Final.jar
  • 将hornetq-JMS-客户2.2.13.Final.jar

并成功发送消息给Jboss 7.1.1测试主题:

final Properties env = new Properties();
env.put(Context.INITIAL_CONTEXT_FACTORY, org.jboss.naming.remote.client.InitialContextFactory.class.getName());
env.put(Context.PROVIDER_URL, "remote://127.0.0.1:4447");
InitialContext jndiContext = new InitialContext(env);
ConnectionFactory cf = (ConnectionFactory) jndiContext.lookup("jms/RemoteConnectionFactory");
Topic topic = (Topic) jndiContext.lookup("jms/topic/test");
Connection conn = null;
try {
    conn = cf.createConnection();
    Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
    MessageProducer producer = session.createProducer(topic);
    TextMessage message = session.createTextMessage("Hello world");
    producer.send(message);
} catch (JMSException e) {
    log.error(e);
} finally {
    if (conn != null) {
        try {
            conn.close();
        } catch (JMSException e) {
            log.error(e);
        }
    }
}

但是由于

,我不得不关闭安全性
  

javax.security.sasl.SaslException:身份验证失败:所有可用的身份验证机制都失败

我没弄明白如何进行身份验证。我使用add-user脚本添加用户并使用不同的属性但没有成功。您可以通过security-realm="ApplicationRealm"

中的此部分删除standalone-full.xml来关闭安全性
<subsystem xmlns="urn:jboss:domain:remoting:1.1">
    <connector name="remoting-connector" socket-binding="remoting" security-realm="ApplicationRealm"/>
</subsystem>

和取消选择个人资料&gt;消息传递&gt;消息传递提供程序&gt;安全性已启用?在Jboss服务器管理控制台中。

<强>更新 无需禁用安全性。使用此选项:

env.put("jboss.naming.client.connect.options.org.xnio.Options.SASL_POLICY_NOPLAINTEXT", "false");
env.put(Context.SECURITY_PRINCIPAL, "username");
env.put(Context.SECURITY_CREDENTIALS, "pass");