2017-05-30 72 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傳輸? –