2017-05-30 73 views
0

我有一个正在运行的GlassFish服务器(版本4.1)。现在我有兴趣使用jms和独立消息客户端创建一个简单的消息服务。 (这应该在单独的JVM中的远程机器上运行。)不幸的是,当我尝试初始化QueueConnectionFactory时,仍然收到NameNotFoundException。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并且已经创建了服务器的侦听器。 我花了最后几个小时看各种资源,试图解决问题,但我没有找到解决方案。

你能告诉我我哪里出错了吗?

非常感谢。

这里有一些资源,我一直在寻找:

编辑:

我也尝试了与jndi.properties文件,而不是props.put(...)和InitialContext(道具)。并且在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 

回答

1

尝试

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"); 
+0

发生了不同的错误:'异常在线程 “主要” 的javax.jms.JMSException:无法创建传输。原因:java.io.IOException:传输方案无法识别:[mq]' –

+0

它发生在'Connection connection = qFactory.createConnection();' –

+1

我已经更新了我的答案,是啊,这是什么mq传输? –