QueueConnectionFactory 查找时出现 NameNotFoundException
NameNotFoundException while QueueConnectionFactory lookup
我有一个 运行ning GlassFish-Server(4.1 版)。现在我有兴趣使用 jms 和独立的消息传递客户端创建一个简单的消息传递服务。 (这应该 运行 在单独的 JVM 中的远程机器上。)不幸的是,当我尝试初始化 QueueConnectionFactory 时,我仍然收到 NameNotFoundException。
这是我的代码:
import java.util.Properties;
import javax.naming.InitialContext;
import javax.jms.*;
import javax.naming.Context;
public class TestJMSQueue {
public static void main(String[] args) throws Exception{
String msg = "Hello from remote JMS Client";
test.sendMessage2Queue(msg);
System.exit(0);
}
private void sendMessage2Queue(String msg) throws Exception {
props.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.activemq.jndi.ActiveMQInitialContextFactory");
props.put(Context.PROVIDER_URL, "mq://localhost:7676");
props.put("connectionFactoryNames" , "TestQueueConnectionFactory");
props.put("queue." + "TestQueue", "TestQueue");
InitialContext ctx = new InitialContext(props);
System.out.println("Context created");
ConnectionFactory qFactory = (ConnectionFactory) ctx.lookup("TestQueueConnectionFactory");
Connection connection = qFactory.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
TextMessage message = session.createTextMessage();
message.setJMSDeliveryMode(DeliveryMode.NON_PERSISTENT);
message.setText(msg);
Queue queue = (Queue) ctx.lookup("TestQueue");
MessageProducer mp = session.createProducer(queue);
mp.send(message);
System.out.println("Message sent: " + msg);
mp.close();
session.close();
ctx.close();
}
}
工厂和队列存在于服务器上。
我正在关注 this tutorial 并且已经为服务器创建了侦听器。
我花了最后几个小时查看各种资源,试图解决问题,但没有找到解决方案。
你能告诉我哪里错了吗?
非常感谢。
以下是我一直在查看的一些资源:
- Using ActiveMQ via JNDI
- ActiveMQInitialContextFactory vs. NamingContextFactory
- ActiveMQ JNDI Lookup Issues
- http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/JMSProducer/JMSProducer.html
- https://www.javatpoint.com/jms-tutorial
编辑:
我还尝试使用 jndi.properties 文件而不是 props.put(...) 和 InitialContext(props)。并在 InitialContext 实例化之前添加以下内容:
properties.put("org.omg.CORBA.ORBInitialHost", "<IP>");
properties.put("org.omg.CORBA.ORBInitialPort", "3700");
//as found [here...][2]
//But as I understand it the solution with 3700 is not for JMS so I also tried it with 7676
也没用。
错误:
Exception in thread "main" javax.jms.JMSException: Could not create Transport. Reason: java.io.IOException: Transport scheme NOT recognized: [mq]
at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:33)
at org.apache.activemq.ActiveMQConnectionFactory.createTransport(ActiveMQConnectionFactory.java:232)
at org.apache.activemq.ActiveMQConnectionFactory.createActiveMQConnection(ActiveMQConnectionFactory.java:245)
at org.apache.activemq.ActiveMQConnectionFactory.createActiveMQConnection(ActiveMQConnectionFactory.java:214)
at org.apache.activemq.ActiveMQConnectionFactory.createConnection(ActiveMQConnectionFactory.java:161)
at testjmsqueue.TestJMSQueue.sendMessage2Queue(TestJMSQueue.java:60)
at testjmsqueue.TestJMSQueue.main(TestJMSQueue.java:30)
Caused by: java.io.IOException: Transport scheme NOT recognized: [mq]
at org.apache.activemq.util.IOExceptionSupport.create(IOExceptionSupport.java:25)
at org.apache.activemq.transport.TransportFactory.findTransportFactory(TransportFactory.java:171)
at org.apache.activemq.transport.TransportFactory.connect(TransportFactory.java:76)
at org.apache.activemq.ActiveMQConnectionFactory.createTransport(ActiveMQConnectionFactory.java:230)
... 5 more
Caused by: java.io.IOException: Could not find factory class for resource: META-INF/services/org/apache/activemq/transport/mq
at org.apache.activemq.util.FactoryFinder.doFindFactoryProperies(FactoryFinder.java:90)
at org.apache.activemq.util.FactoryFinder.newInstance(FactoryFinder.java:58)
at org.apache.activemq.util.FactoryFinder.newInstance(FactoryFinder.java:47)
at org.apache.activemq.transport.TransportFactory.findTransportFactory(TransportFactory.java:167)
... 7 more
尝试
props.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.activemq.jndi.ActiveMQInitialContextFactory");
props.put(Context.PROVIDER_URL, "mq://localhost:7676");
props.put("connectionFactoryNames" , "TestQueueConnectionFactory");
props.put("queue." + "TestQueue", "TestQueue");
InitialContext ic = new InitialContext(props);
ConnectionFactory qFactory = (ConnectionFactory) ic.lookup("TestQueueConnectionFactory");
Queue queue = (Queue ) ic.lookup("TestQueue");
我有一个 运行ning GlassFish-Server(4.1 版)。现在我有兴趣使用 jms 和独立的消息传递客户端创建一个简单的消息传递服务。 (这应该 运行 在单独的 JVM 中的远程机器上。)不幸的是,当我尝试初始化 QueueConnectionFactory 时,我仍然收到 NameNotFoundException。
这是我的代码:
import java.util.Properties;
import javax.naming.InitialContext;
import javax.jms.*;
import javax.naming.Context;
public class TestJMSQueue {
public static void main(String[] args) throws Exception{
String msg = "Hello from remote JMS Client";
test.sendMessage2Queue(msg);
System.exit(0);
}
private void sendMessage2Queue(String msg) throws Exception {
props.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.activemq.jndi.ActiveMQInitialContextFactory");
props.put(Context.PROVIDER_URL, "mq://localhost:7676");
props.put("connectionFactoryNames" , "TestQueueConnectionFactory");
props.put("queue." + "TestQueue", "TestQueue");
InitialContext ctx = new InitialContext(props);
System.out.println("Context created");
ConnectionFactory qFactory = (ConnectionFactory) ctx.lookup("TestQueueConnectionFactory");
Connection connection = qFactory.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
TextMessage message = session.createTextMessage();
message.setJMSDeliveryMode(DeliveryMode.NON_PERSISTENT);
message.setText(msg);
Queue queue = (Queue) ctx.lookup("TestQueue");
MessageProducer mp = session.createProducer(queue);
mp.send(message);
System.out.println("Message sent: " + msg);
mp.close();
session.close();
ctx.close();
}
}
工厂和队列存在于服务器上。
我正在关注 this tutorial 并且已经为服务器创建了侦听器。 我花了最后几个小时查看各种资源,试图解决问题,但没有找到解决方案。
你能告诉我哪里错了吗?
非常感谢。
以下是我一直在查看的一些资源:
- Using ActiveMQ via JNDI
- ActiveMQInitialContextFactory vs. NamingContextFactory
- ActiveMQ JNDI Lookup Issues
- http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/JMSProducer/JMSProducer.html
- https://www.javatpoint.com/jms-tutorial
编辑:
我还尝试使用 jndi.properties 文件而不是 props.put(...) 和 InitialContext(props)。并在 InitialContext 实例化之前添加以下内容:
properties.put("org.omg.CORBA.ORBInitialHost", "<IP>");
properties.put("org.omg.CORBA.ORBInitialPort", "3700");
//as found [here...][2]
//But as I understand it the solution with 3700 is not for JMS so I also tried it with 7676
也没用。
错误:
Exception in thread "main" javax.jms.JMSException: Could not create Transport. Reason: java.io.IOException: Transport scheme NOT recognized: [mq]
at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:33)
at org.apache.activemq.ActiveMQConnectionFactory.createTransport(ActiveMQConnectionFactory.java:232)
at org.apache.activemq.ActiveMQConnectionFactory.createActiveMQConnection(ActiveMQConnectionFactory.java:245)
at org.apache.activemq.ActiveMQConnectionFactory.createActiveMQConnection(ActiveMQConnectionFactory.java:214)
at org.apache.activemq.ActiveMQConnectionFactory.createConnection(ActiveMQConnectionFactory.java:161)
at testjmsqueue.TestJMSQueue.sendMessage2Queue(TestJMSQueue.java:60)
at testjmsqueue.TestJMSQueue.main(TestJMSQueue.java:30)
Caused by: java.io.IOException: Transport scheme NOT recognized: [mq]
at org.apache.activemq.util.IOExceptionSupport.create(IOExceptionSupport.java:25)
at org.apache.activemq.transport.TransportFactory.findTransportFactory(TransportFactory.java:171)
at org.apache.activemq.transport.TransportFactory.connect(TransportFactory.java:76)
at org.apache.activemq.ActiveMQConnectionFactory.createTransport(ActiveMQConnectionFactory.java:230)
... 5 more
Caused by: java.io.IOException: Could not find factory class for resource: META-INF/services/org/apache/activemq/transport/mq
at org.apache.activemq.util.FactoryFinder.doFindFactoryProperies(FactoryFinder.java:90)
at org.apache.activemq.util.FactoryFinder.newInstance(FactoryFinder.java:58)
at org.apache.activemq.util.FactoryFinder.newInstance(FactoryFinder.java:47)
at org.apache.activemq.transport.TransportFactory.findTransportFactory(TransportFactory.java:167)
... 7 more
尝试
props.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.activemq.jndi.ActiveMQInitialContextFactory");
props.put(Context.PROVIDER_URL, "mq://localhost:7676");
props.put("connectionFactoryNames" , "TestQueueConnectionFactory");
props.put("queue." + "TestQueue", "TestQueue");
InitialContext ic = new InitialContext(props);
ConnectionFactory qFactory = (ConnectionFactory) ic.lookup("TestQueueConnectionFactory");
Queue queue = (Queue ) ic.lookup("TestQueue");