2017-02-10 219 views
1

我正在實現MessageListner類的onMessgae()方法,但它不工作,即使我將調試點放在此方法內但調試器也不在此方法內。消息監聽器onMessage()方法不會衝突來自隊列的消息

使用此方法接收來自隊列的消息。 下面是我收到消息,但它不是給人當我通過發送者類發送消息和它的消息發送到JMS服務器,並顯示像這樣在服務器

名稱服務器DestiCurrent MessagesCurrent MessagesPending MessagesReceived JMSServer-的任何消息代碼0的AdminServer 3 15 1 2

代碼Reciver:

{ 
import java.util.Hashtable; 

import javax.jms.JMSException; 
import javax.jms.Message; 
import javax.jms.MessageListener; 
import javax.jms.Queue; 
import javax.jms.QueueConnection; 
import javax.jms.QueueConnectionFactory; 
import javax.jms.QueueReceiver; 
import javax.jms.QueueSession; 
import javax.jms.Session; 
import javax.jms.TextMessage; 
import javax.naming.Context; 
import javax.naming.InitialContext; 
import javax.naming.NamingException; 


public class QueueReceive implements MessageListener { 
    public final static String Server="t3://localhost:7001"; 
    public final static String JNDI_FACTORY = "weblogic.jndi.WLInitialContextFactory"; 
    public final static String JMS_FACTORY = "CF1"; 
    enter code here 

    public final static String QUEUE = "Queue1"; 
    private QueueConnectionFactory qconFactory; 
    private QueueConnection qcon; 
    private QueueSession qsession; 
    private QueueReceiver qreceiver; 
    private Queue queue; 
    private boolean quit = false; 
    String s1 = "avanish"; 


    public void init(Context ctx, String queueName) throws NamingException, JMSException { 
     qconFactory = (QueueConnectionFactory) ctx.lookup(JMS_FACTORY); 
     qcon = qconFactory.createQueueConnection(); 
     qsession = qcon.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); 
     queue = (Queue) ctx.lookup(queueName); 
     qreceiver = qsession.createReceiver(queue); 
     qreceiver.setMessageListener(this); 
     qcon.start(); 
     System.out.println(qreceiver.receive()); 
    } 

    public void close() throws JMSException { 
     qreceiver.close(); 
     qsession.close(); 
     qcon.close(); 
    } 

    public static void main(String[] args) throws Exception { 
     /*if (args.length != 1) { 
      System.out.println("Usage: java examples.jms.queue.QueueReceive WebLogicURL"); 
      return; 
     }*/ 
     InitialContext ic = getInitialContext(); 
     QueueReceive qr = new QueueReceive(); 
     qr.init(ic, QUEUE); 
     System.out.println("JMS Ready To Receive Messages (To quit, send a \"quit\" message)."); 
     synchronized (qr) { 
      while (!qr.quit) { 
       try { 
        qr.wait(); 
       } catch (InterruptedException ie) { 
       } 
      } 
     } 
     qr.close(); 
    } 


    private static InitialContext getInitialContext() throws NamingException { 
     Hashtable<String, String> env = new Hashtable<String, String>(); 
     env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY); 
     env.put(Context.PROVIDER_URL, Server); 
     return new InitialContext(env); 
    } 

    @Override 
    public void onMessage(Message msg) { 
     try { 
      String msgText; 
      if(msg instanceof TextMessage){ 
        msgText = ((TextMessage) msg).getText(); 
       } 
      else{ 
       msgText = msg.toString(); 
      } 
       System.out.println("reciver msg" + msgText); 

       if(msgText.equalsIgnoreCase("quit")){ 
        synchronized (this) { 
         quit= true; 
         this.notifyAll(); 
        } 
       } 
      } catch (JMSException e) { 
       System.err.println("Exception" + e.getMessage()); 
      } 

     } 


} 

} 

代碼發信人: {

import javax.jms.JMSException; 
import javax.jms.Queue; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.util.Hashtable; 

import javax.jms.*; 
import javax.jms.QueueConnection; 
import javax.jms.QueueConnectionFactory; 
import javax.jms.QueueSender; 
import javax.jms.QueueSession; 
import javax.jms.Session; 
import javax.jms.TextMessage; 
import javax.naming.Context; 
import javax.naming.InitialContext; 
import javax.naming.NamingException; 

public class QueueSend { 
    public final static String Server="t3://localhost:7001"; 
    public final static String JNDI_FACTORY = "weblogic.jndi.WLInitialContextFactory"; 
    public final static String JMS_FACTORY = "CF1"; 
    public final static String QUEUE = "Queue1"; 
// public final static String QUEUE = "DQ"; 
    private QueueConnectionFactory qconFactory; 
    private QueueConnection qcon; 
    private QueueSession qsession; 
    private QueueSender qsender; 
    private Queue queue; 
    private TextMessage msg; 

    public void init(Context ctx, String queueName) throws NamingException, JMSException 

    { 

     qconFactory = (QueueConnectionFactory) ctx.lookup(JMS_FACTORY); 

     qcon = qconFactory.createQueueConnection(); 

     qsession = qcon.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); 

     queue = (Queue) ctx.lookup(queueName); 

     qsender = qsession.createSender(queue); 

     msg = qsession.createTextMessage(); 

     qcon.start(); 

    } 

    public void send(String message) throws JMSException { 

     msg.setText(message); 
     //msg.acknowledge(); 
     qsender.setPriority(9); 
     qsender.send(msg); 

    } 

    public void close() throws JMSException { 

     qsender.close(); 

     qsession.close(); 

     qcon.close(); 

    } 

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


     InitialContext ic = getInitialContext(); 

     QueueSend qs = new QueueSend(); 

     qs.init(ic, QUEUE); 

     readAndSend(qs); 

     qs.close(); 

    } 

    private static void readAndSend(QueueSend qs) throws IOException, JMSException 

    { 

     BufferedReader msgStream = new BufferedReader(new InputStreamReader(System.in)); 

     String line = null; 

     boolean quitNow = false; 

     do { 

      System.out.print("Enter message (\"quit\" to quit): \n"); 

      line = msgStream.readLine(); 

      if (line != null && line.trim().length() != 0) { 

       qs.send(line); 

       System.out.println("JMS Message Sent: " + line + "\n"); 

       quitNow = line.equalsIgnoreCase("quit"); 

      } 

     } while (!quitNow); 

    } 

    private static InitialContext getInitialContext() 

      throws NamingException 

    { 

     Hashtable<String, String> env = new Hashtable<String, String>(); 

     env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY); 

     env.put(Context.PROVIDER_URL, Server); 

     return new InitialContext(env); 

    } 

} 



} 
+0

您應該做的第一件事是確保郵件得到發送。首先逐步通過發送代碼確保它到達發送消息的行。 –

+0

@bremen_matt:是的,無論我發送什麼消息,服務器都收到消息,並且在發送每條消息之後,JMSSERVER會增加計數。 –

+0

對不起,從您的評論中不清楚...因此,您可以驗證服務器是否也發送消息? –

回答

0

使用消息監聽我用下面的代碼行,並從隊列

queue = (Queue) ctx.lookup(queueName); 
    qreceiver = qsession.createReceiver(queue); 

    message = qreceiver.receiveNoWait(); 

得到確切的消息的insted的其成功接收從隊列中的消息。