2014-10-08 162 views
1

我無法啓動JMS連接,其中使用ActiveMQConnectionFactory創建連接。下面是我的代碼:無法啓動JMS連接

public static void main(String[] args) throws Exception { 

    BrokerService broker = new BrokerService(); 
    try { 
     broker.setUseJmx(true); 
     broker.addConnector("vm://localhost:61616"); 
     broker.start(); 
     System.out.println("Broker started from EventManager >>>"); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    try { 
     ProducerConsumer pc = ProducerConsumer.getInstance(); 
     pc.sendMessage("TESTQ", "Hello"); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

ProducerConsumer的Java類:

public static ProducerConsumer getInstance() throws Exception { 
    if(produceConsume == null) { 
     System.out.println(" synchronized Instanace created "); 
     produceConsume = new ProducerConsumer(); 
    } 
    return produceConsume; 


private ProducerConsumer() throws Exception 
    { 
     ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(this.url); 
     try { 
      this.connection = connectionFactory.createConnection(); 
      this.connection.start(); 
     } catch (JMSException jms) { 
      throw new Exception("Exception when active MQ establishes connections....", jms); 
     } 
    } 

的代碼會卡在啓動(),與線程轉儲我可以看到下面的堆棧

全螺紋轉儲Java HotSpot™64位服務器虛擬機(24.0-b28混合型 模式):

「ActiveMQ Task-1」守護程序prio = 10 tid = 0x00007fbe3c414800 NID = 0x3543在 的Object.wait()[0x00007fbe2a715000] java.lang.Thread.State中:在java.lang.Object.wait(母語 方法) TIMED_WAITING(對象監視器上) - 等待< 0x00000007d7443228>(一個java.lang.Object)在org.apache.activemq.transport.failover.FailoverTransport.doReconnect(FailoverTransport.java:954) - 鎖定< 0x00000007d7443228>(org.apache.activemq.transport上的一個java.lang.Object) .failover.FailoverTransport $ 2.iterate(FailoverTransport.java:136) - 鎖定<在org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:127)0x00000007d7443218>(一java.lang.Object繼承) 在 org.apache.activemq.thread.PooledTaskRunner $ 1.run(PooledTa skRunner.java:48) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 在 java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:603) 是java。 lang.Thread.run(Thread.java:722)

「ActiveMQConnection [ID:AYUSH-0791-50867-1412762440207-2:1]調度程序」 守護程序PRIO = 10 TID = 0x00007fbe3c413000 NID = 0x3542中的Object.wait () [0x00007fbe2a816000] java.lang.Thread.State:WAITING(在對象 監視器上)java.lang.Object.wait(Native Method) - 等待< 0x00000007d75d73a8>(java.util.TaskQueue)at java .lang.Object.wait(OBJE ct.java:503)在 java.util.TimerThread.mainLoop(Timer.java:526) - 鎖定< 0x00000007d75d73a8>(一個java.util.TaskQueue)在java.util.TimerThread.run(Timer.java:505 )

「ActiveMQ代理[本地主機調度器」 守護程序PRIO = 10 TID = 0x00007fbe3c3e0000 NID = 0x3541中的Object.wait() [0x00007fbe2a917000] java.lang.Thread.State中:TIMED_WAITING(上在 對象監視器) java.lang.Object.wait(Native Method) - 等待< 0x00000007d93fa080>(java.util.TaskQueue)at java.util.TimerThread.mainLoop(Timer.java:552) - locked < 0x00000007d93fa080>(java .util.TaskQueue)在java.util.TimerThread.run (Timer.java:505)

「的ActiveMQ數據文件寫入」 守護程序PRIO = 10 TID = 0x00007fbe3c3d1800 NID = 0x3540中的Object.wait()[0x00007fbe2aa18000]
java.lang.Thread.State中:WAITING(上對象監視器)在 java.lang.Object.wait(本機方法) - 在 java.lang.Object.wait(Object.java等待< 0x00000007d93fa3b8>(一個org.apache.kahadb.journal.DataFileAppender $ 1): 503)at org.apache.kahadb.journal.DataFileAppender。processQueue(DataFileAppender.java:312) - 鎖定< 0x00000007d93fa3b8>(1 org.apache.kahadb.journal.DataFileAppender $)在 org.apache.kahadb.journal.DataFileAppender $ 2.run(DataFileAppender.java:203)

「的ActiveMQ雜誌檢查點工作者」 守護程序PRIO = 10 TID = 0x00007fbe3c3cb000 NID = 0x353f等待條件 [0x00007fbe2ab19000] java.lang.Thread.State中:在java.lang.Thread.sleep TIMED_WAITING (睡眠)(本機方法)at org.apache.activemq.store.kahadb.MessageDatabase $ 3.run(MessageDatabase.java:296)

「KahaDB Scheduler」守護進程prio = 10 tid = 0x00007fbe3c3c1000 NID = 0x353e在 的Object.wait()[0x00007fbe2b32b000] java.lang.Thread.State中:在java.lang.Object.wait(母語 方法) TIMED_WAITING(對象監視器上) - 等待< 0x00000007d981f418>( (Timer.java:552) - 鎖定< 0x00000007d981f418>(java.util.TaskQueue)java.util.TimerThread.run(Timer.java:505)java.util.TaskQueue(java.util.TaskQueue)java.util.TimerThread.run )

「RMI RenewClean- [192.168.57.33:47976]」 守護程序PRIO = 10 TID = 0x00007fbde0005800 NID = 0x353c中的Object.wait() [0x00007fbe2ad1b000] java.lang.Thread.State中:TIMED_WAITING(上 對象監視器)在java.lang .Object.wait(本機方法) - 在 java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135) 等待< 0x00000007d9889870>(一java.lang.ref.ReferenceQueue $ LOCK) - 鎖定< 0x00000007d9889870 >(一個java.lang.ref.ReferenceQueue $ Lock)at sun.rmi.transport.DGCClient $ EndpointEntry $ RenewCleanThread.run(DGCClient.java:535) at java.lang.Thread.run(Thread.java:722 )

「RMI調度程序(0)」 守護程序PRIO = 10 TID = 0x00007fbdf0024800 NID = 0x353b 等待條件[0x00007fbe2ae1c000] java.lang.Thread.State中:在sun.misc.Unsafe.park TIMED_WAITING(停車場) (本地方法) - 停車等待< 0x00000007850ffb10>(一java.util.concurrent.locks.AbstractQueuedSynchronizer中的$的ConditionObject) 在 java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:226) 在 java.util.concurrent中。 locks.AbstractQueuedSynchronizer $ ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2082) 在 java.util.concurrent.ScheduledThreadPoolExecutor中的$ DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1090) 在 java.util.concurrent.ScheduledThreadPoolExecutor中的$ DelayedWorkQueue.take( ScheduledThreadPoolExecutor.java:807) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1043) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1103) 在 java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:603) 在java.lang.Thread.run(線程。的java:722)

「GC守護進程」 守護程序PRIO = 10 TID = 0x00007fbdf0006800 NID = 0x3539在 的Object.wait()[0x00007fbe2b028000] java.lang.Thread.State中:在java的 TIMED_WAITING(對象監視器上)。 lang.Object.wait(本地 法) - 在sun.misc.GC $ Daemon.run(GC.java:117) 等待< 0x00000007850069b0>(一sun.misc.GC $ LatencyLock) - 鎖定< 0x00000007850069b0> (太陽。misc.GC $ LatencyLock)

「RMI收割者」 PRIO = 10 TID = 0x00007fbdf0004800 NID = 0x3538在 的Object.wait()[0x00007fbe2b129000] java.lang.Thread.State中:在java的WAITING (對象監視器上) .lang.Object.wait(Native Method) - 等待< 0x0000000785000b98>(一個java.lang.ref.ReferenceQueue $ Lock) java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135) - locked < 0x0000000785000b98>(java.lang.ref.ReferenceQueue $ Lock)at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)at sun.rmi.transport.ObjectTable $ Reaper.run(ObjectTable.java: 351)at java.lang.Thread.run(Thread.java:722)

「RMI TCP接受-0」 守護程序PRIO = 10 TID = 0x00007fbdf0003000 NID = 0x3537 可運行的[0x00007fbe2b22a000] java.lang.Thread.State中:在 RUNNABLE在 java.net.PlainSocketImpl.socketAccept(本機方法) java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:398) at java.net.ServerSocket.implAccept(ServerSocket.java:522)at java.net.ServerSocket.accept(ServerSocket.java:490)at sun。 rmi.transport.tcp.TCPTransport $ AcceptLoop.executeAcceptLoop(TCPTransport.java:388) at sun.rmi.transport.tcp.TCPTransport $ AcceptLoop.run(TCPTransport.java:360) at java.lang.Thread.run (Thread.java:722)

「RMI TCP的Accept-1099」 守護程序PRIO = 10 TID = 0x00007fbe3c318000 NID = 0x3535 可運行的[0x00007fbe2b42c000] java.lang.Thread.State中:在 RUNNABLE在 java.net.PlainSocketImpl.socketAccept(本機方法) java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:398) 在java.net.ServerSocket.implAccept(ServerSocket.java:522)維持在 太陽 java.net.ServerSocket.accept(ServerSocket.java:490)。 rmi.transport.tcp.TCPTransport $ AcceptLoop.executeAcceptLoop(TCPTransport.java:388) at sun.rmi.transport.tcp.TCPTransport $ AcceptLoop.run(TCPTransport.java:360) at java.lang.Thread.run (Thread.java:722)

「服務線程」 守護程序PRIO = 10 TID = 0x00007fbe3c097800 NID = 0x3533 可運行的[0x0000000000000000] java.lang.Thread.State中:RUNNABLE

「C2 CompilerThread1」 守護程序PRIO = 10 TID = 0x00007fbe3c095800 NID = 0x3532 等待條件[0x0000000000000000] java.lang.Thread.State中: RUNNABLE

「C2 CompilerThread0」 守護程序PRIO = 10 TID = 0x00007fbe3c092800 NID = 0x3531 等待條件[0x0000000000000000] java.lang.Thread.State中: RUNNABLE

「信號分派器」 守護程序PRIO = 10 TID = 0x00007fbe3c090800 NID = 0x3530 等待條件[0x0000000000000000] java.lang.Thread.State中: RUNNABLE

「終結」 守護程序PRIO = 10 TID = 0x00007fbe3c071800 NID = 0x352e在 Object.wait()[0x00007fbe389f8000] java.lang.Thread.State:WAITING (on object monitor)at java.lang.Object.wait(Native Method) - 等待< 0x000000078500efa8>(java.lang.String參考Queue $鎖)在 java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135) - 鎖定< 0x000000078500efa8>(Java的java.lang.ref.ReferenceQueue $鎖)。lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)在 java.lang.ref.Finalizer $ FinalizerThread.run(Finalizer.java:177)

「參考處理程序」 守護程序PRIO = 10 TID = 0x00007fbe3c06f800 NID = 0x352d Object.wait()[0x00007fbe38af9000] java.lang.Thread.State: WAITING(在對象監視器上)java.lang.Object.wait(Native Method) - 等待< 0x000000078500ee20>(java。 lang.ref.Reference $ Lock)at java.lang.Object.wait(Object.java:503)at java.lang.ref.Reference $ ReferenceHandler.run(Reference.java:133) - locked < 0x000000078500ee20>(一個java.lang.ref.Reference $ Lock)

Object.wait()方法中使用的java.lang.Thread.State:TIMED_WAITING(在 對象監視器上)

Object.wait()中的「main」prio = 10 tid = 0x00007fbe3c00c000 nid = 0x3523() [0x00007fbe44f01000] ) - 在org.apache.activemq.transport.failover.FailoverTransport.oneway(FailoverTransport.java:516) 等待< 0x00000007d7443208>(一個java.lang.Object中) - 鎖定< 0x00000007d7443208>(一個java.lang.Object中)at org.apache.activemq.transport.MutexTransport.oneway(MutexTransport.java:40) - 鎖定< 0x00000007d75642c8>(org.apache.activemq.transport.ResponseCorrelator.asyncRequest(ResponseCorrelator.java(java.lang.Object)) :81) at org.apache.activemq.transport.Resp onseCorrelator.request(ResponseCorrelator.java:86) 在 org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1284) 在 org.apache.activemq.ActiveMQConnection.ensureConnectionInfoSent(ActiveMQConnection.java:1392) - 鎖定< 0x00000007d75a9aa8>在 test.ProducerConsumer.getInstance(一個java.lang.Object中)在org.apache.activemq.ActiveMQConnection.start(ActiveMQConnection.java:504) 在test.ProducerConsumer。(ProducerConsumer.java:37)( ProducerConsumer.java:16)在 test.ActiveMQTest.main(ActiveMQTest.java:31)

回答

2

你是CRE在監聽只監聽基於VM傳輸的客戶端的代理,但您的客戶端使用默認連接URI「failover:tcp://127.0.0.1」,這意味着您的客戶端將掛起,等待FailoverTransport連接到經紀人。您可能需要將連接工廠配置爲使用「vm:// localhost」或將傳輸連接器配置更改爲:

broker.addConnector("tcp://localhost:61616"); 
+0

謝謝您的快速回復 – Ayush 2014-10-08 11:35:06