我试图从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的任何示例都将非常感激。
答案 0 :(得分:0)
这个问题的主要问题在于
不再支持以前JBoss版本中使用的旧的基于jnp的JNDI实现
我们必须使用remote:
协议。有用的资源是jboss dev guide JNDI和master the jboss ejb tutorial。
他们告诉您,jboss-client.jar
需要%JBOSS_HOME%/bin/client
。对于Java SE项目来说确实如此。对于不同的应用服务器,它太多导致它导致一些javax.*
冲突并导致我的注入点失败。我最终得到了这套罐子:
并成功发送消息给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");