2016-05-03 34 views
0

JMSを初めて使用し、JdeveloperとWeblogic 12cで作業していますが、コードは正常ですが、Consumer onMessage()メソッドはProducerからメッセージを受け取りません。私がonMessage()を使用しなかったときに私はメッセージを得ることができますが。すべてのファイルを動作させる前に設定する必要がありますか?ここで JMSキュークライアントonMessage()が送信者からメッセージを受信して​​いません

は私が onMessageメソッドが呼び出される前に、メインスレッドが終了しているため、問題がある疑いがあるメッセージコンシューマコード

package com.soap_jms; 



import javax.jms.ExceptionListener; 
import java.util.*; 
import javax.jms.Connection; 
import javax.jms.ConnectionFactory; 
import javax.jms.JMSException; 
import javax.jms.Message; 
import javax.jms.MessageConsumer; 
import javax.jms.MessageListener; 
import javax.jms.Queue; 
import javax.jms.Session; 
import javax.jms.TextMessage; 

import javax.naming.InitialContext; 
import javax.naming.NamingException; 
import javax.naming.Context; 

import utils.system; 


public class QueueConsume implements MessageListener, ExceptionListener{ 

     private final static String JMS_FACTORY="jms/ThesisConnectionFactory"; 
     private final static String QUEUE="jms/ThesisJMSQueue"; 
     private static Connection mConnection; 
     private static ConnectionFactory mConnectionFactory; 
     private static Queue mQueue; 
     private static MessageConsumer mConsumer; 
     private static Session mSession; 


     public static void main (String [] args) throws JMSException, NamingException { 
     mConnection=null; 
     MessageListener listener = null; 
     System.out.println("Entering into JMS Queue Consumer........"); 
     Context ctx = QueueConsume.getInitialContext(); 
     mConnectionFactory=(javax.jms.ConnectionFactory)ctx.lookup(JMS_FACTORY); 
     mQueue=(javax.jms.Queue)ctx.lookup(QUEUE); 
     mConnection=mConnectionFactory.createConnection(); 
     mSession=mConnection.createSession(false,Session.AUTO_ACKNOWLEDGE); 
     mConsumer=mSession.createConsumer(mQueue); 
     QueueConsume mConsume = new QueueConsume(); 
     mConsumer.setMessageListener(mConsume); 
     mConnection.setExceptionListener(mConsume); 
     mConnection.start(); 

     System.out.println("JMS is set to accept sent message....."); 
     System.out.println("Exiting from JMS Queue Consumer ........"); 
     close(); 
     } // closes main method 


    @SuppressWarnings("oracle.jdeveloper.java.insufficient-catch-block") 
    public void onMessage(Message message) { 
     try { 
      System.out.println("Message is " + ((TextMessage) message).getText()); 
     } catch (JMSException e) { 
     } 
    } 
     @SuppressWarnings("oracle.jdeveloper.java.unchecked-conversion-or-cast") 
    public static Context getInitialContext() throws JMSException, NamingException { 
      Hashtable htb = new Hashtable(); 
      htb.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory"); 
      htb.put(Context.PROVIDER_URL,"t3://localhost:7101"); 
      Context ctx= new InitialContext(htb); 
     return ctx; 
     }  


    public static void close() throws JMSException { 
     mSession.close(); 
     mConnection.close(); 
     mConsumer.close(); 
    } 



    public void onException(JMSException exception) 
     { 
      System.err.println("an error occurred: " + exception); 
     } 

} 
+0

onMessageメッセージリスナーをコンシューマに添付しましたか? – Shashi

+0

はいシャーシ。私はそれを付けました。上記のコードを参照してください。ありがとう。 – TheGood

答えて

1

です。 Connection.start()メソッドが呼び出された後は、closeと呼んでいます。通常、setMessageListenerは非同期操作であるため、呼び出しはすぐに戻りますが、実際に開始するのはonMessageスレッドの並行処理です。 onMessageスレッドがメッセージを受信して​​いる間に、メインスレッドを待機させるために何らかのスリープや他の方法を使用することをお勧めします。

+0

ありがとうございました。それはそのように機能します。 – TheGood

+0

私の答えを受け入れることはできますか?私は貪欲:) – Shashi

関連する問題