2015-10-07 2 views
0

Пожалуйста, помогите. Это убивает меня в течение двух недель.Простой пример JMS не извлекает сообщение JMS. Зачем?

Мне просто нужен простой автономный java-клиент, который отправляет JMS-сообщение в очередь JMS на сервере Glassfish, работающем на localhost. И получает его обратно. Я просто не могу сделать эту работу. Код ниже. Вслед за выходом Console я получаю, когда запускаю его из инструментария Eclipse.

Сообщение отправляется без ошибок. (см. последнюю строку в консоли). Но слушатель никогда не извлекает его. Может кто-нибудь помочь. Это был бы хороший пример для следующего человека, который пытается опереться на JMS - если он когда-либо работал. Может ли кто-нибудь предложить помощь?

[Примечание: я использую тонну операторов печати для вывода на консоль вывода ниже, но я удалил их из кода для удобочитаемости. И я запустил журнал сервера Glassfish перед его запуском. После его выполнения, журнал не добавлено ни одной строки]

Код:.

public class JMSTest implements MessageListener { 

    public static void main(String[] args) { 
    JMSTest messageCenter = new JMSTest(); 
    messageCenter.sendMessage(); 
    } 

    static final Properties JNDI_PROPERTIES = new Properties() { 
    private static final long serialVersionUID = 1L; 
     {this.put ("java.naming.factory.initial", "com.sun.jndi.fscontext.RefFSContextFactory"); 
     this.put ("java.naming.provider.url","file:///C:/glassfish4/mq/opt/java/my_broker"); 
     } 
    }; 

    String   QUEUE_NAME   = "jms/JMSSendToTestQueue"; 
    MessageConsumer msgConsumer   = null; 
    MessageProducer msgProducer   = null; 
    ObjectMessage  msg     = null; 
    Connection  connection   = null; 

    //constructor 
    public JMSTest() { 
    try { 
/*1*/ Context jndiContext = (Context) new InitialContext(JNDI_PROPERTIES); 
/*2*/ ConnectionFactory factory = (ConnectionFactory) jndiContext.lookup("jms/goConnectionFactory"); 
/*3*/ connection = factory.createConnection(); 
/*4*/ Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
/*5*/ Destination receiveFromDestination = (Destination) jndiContext.lookup(QUEUE_NAME); 
/*6*/ this.msgConsumer = session.createConsumer(receiveFromDestination); 
/*7*/ this.msgConsumer.setMessageListener(this); 
/*8*/ Destination sendToDestination = (Destination) jndiContext.lookup(QUEUE_NAME); 
/*9*/ msgProducer = session.createProducer(sendToDestination); 
/*10*/this.msg = session.createObjectMessage(); 
     this.msg.setObject("Hi There. I'm a Test Object."); 
    } catch (Exception e) { 
     System.out.println(" " + iAmM + "msg: " + e.getMessage()); 
     e.printStackTrace(); 
    } 
    } 

    public void sendMessage() { 
    try { 
     this.msgProducer.send(this.msg); 
     System.out.println("Message Was Sent"); 
    } catch (JMSException e) { 
     System.out.println("Attempt to send message failed."); 
     e.printStackTrace(); 
    } 
    } 

    public void onMessage(Message msg) { 
    System.out.println("TEST MESSAGE RECEIVED"); 
    if(this.connection!=null) { 
     try { 
     this.connection.close(); 
     } catch (Exception e) { 
     e.printStackTrace(); 
     } 
    } 
    try { 
     ObjectMessage objMsg = (ObjectMessage) msg; 
     System.out.println((String) objMsg.getObject()); 
    } catch (JMSException e) { 
     e.printStackTrace(); 
    } 
    } 

консоли:

JMSTest.<init>()     beg 
    Line 1: InitialContext ok: 
      [email protected] 

    Line 2: factory is not null: 
     Sun Java System MQ ConnectionFactory 
     Class:   com.sun.messaging.ConnectionFactory 
     getVERSION():  3.0 
     isReadonly():  true 
     getProperties(): 
     imqOverrideJMSPriority    = false 
     imqConsumerFlowLimit    = 1000 
     imqOverrideJMSExpiration   = false 
     imqAddressListIterations   = 1 
     imqLoadMaxToServerSession   = true 
     imqConnectionType     = TCP 
     imqPingInterval      = 30 
     imqSetJMSXUserID     = false 
     imqConfiguredClientID    = 
     imqSSLProviderClassname    = com.sun.net.ssl.internal.ssl.Provider 
     imqJMSDeliveryMode     = PERSISTENT 
     imqConnectionFlowLimit    = 1000 
     imqConnectionURL     = http://localhost/imq/tunnel 
     imqBrokerServiceName    = 
     imqJMSPriority      = 4 
     imqBrokerHostName     = localhost 
     imqJMSExpiration     = 0 
     imqAckOnProduce      = 
     imqEnableSharedClientID    = false 
     imqAckTimeout      = 0 
     imqAckOnAcknowledge     = 
     imqConsumerFlowThreshold   = 50 
     imqDefaultPassword     = guest 
     imqQueueBrowserMaxMessagesPerRetrieve = 1000 
     imqDefaultUsername     = guest 
     imqReconnectEnabled     = false 
     imqConnectionFlowCount    = 100 
     imqAddressListBehavior    = PRIORITY 
     imqReconnectAttempts    = 0 
     imqSetJMSXAppID      = false 
     imqConnectionHandler    = com.sun.messaging.jmq.jmsclient.protocol.tcp.TCPStreamHandler 
     imqSetJMSXRcvTimestamp    = false 
     imqBrokerServicePort    = 0 
     imqDisableSetClientID    = false 
     imqSetJMSXConsumerTXID    = false 
     imqOverrideJMSDeliveryMode   = false 
     imqBrokerHostPort     = 7676 
     imqQueueBrowserRetrieveTimeout  = 60000 
     imqSetJMSXProducerTXID    = false 
     imqSSLIsHostTrusted     = false 
     imqConnectionFlowLimitEnabled  = false 
     imqReconnectInterval    = 3000 
     imqAddressList      = 
     imqOverrideJMSHeadersToTemporaryDestinations=false} 

    JMSTest.<init>()     Line 3: connection is not null: 
     BrokerAddress=localhost:7676(60325) 
     ConnectionID=967799204788496640 
     ReconnectEnabled: false 
     IsConnectedToHABroker: false 

    JMSTest.<init>()     Line 4: session is not null: 
     ConnectionID      = 967799204788496640 
     SessionID       = 967799204788508160 

    JMSTest.<init>()     Line 5: receiveFromDestination not null: 
     Sun Java System MQ Destination 
     getName():  JMSSendToTestQueue 
     Class:   com.sun.messaging.Queue 
     getVERSION():  3.0 
     isReadonly():  false 
     getProperties(): 
     imqDestinationName     = JMSSendToTestQueue 
     imqDestinationDescription   = A Description for the Destination Object} 

    JMSTest.<init>()     Line : msgConsumer not null: 
     ConnectionID      = 967799204788496640 
     SessionID       = 967799204788508160 
     ConsumerID       = 967799204788511232 
     DestName       = JMSSendToTestQueue 

    JMSTest.<init>()     Line 7: listener set to this: 

    JMSTest.<init>()     Line 8: sendToDestination not null: 
     Sun Java System MQ Destination 
     getName():  JMSSendToTestQueue 
     Class:   com.sun.messaging.Queue 
     getVERSION():  3.0 
     isReadonly():  false 
     getProperties(): 
     imqDestinationName     = JMSSendToTestQueue 
     imqDestinationDescription   = A Description for the Destination Object} 

    JMSTest.<init>()     Line : msgProducer not null: 
     ConnectionID      = 967799204788496640 
     SessionID       = 967799204788508160 
     ProducerID       = 967799204788513792 
     DestName       = JMSSendToTestQueue 

    JMSTest.<init>()     Line 10: ObjectMessage created. 
               Object is String: Hi There. I'm a Test Object. 
Message Was Sent 

ответ

2

Вы должны вызвать начало() вашего соединения для того, чтобы в MessageConsumer иметь отправку сообщения. Вы можете отправлять сообщения без запуска соединения, но вы ничего не можете получить до его запуска.

+0

спасибо. Очевидно, правильно. Очевидно, смущающе. Но в то же время я попробовал обновить свою стеклянную рыбку ... и когда я попытался перенастроить ресурсы, которые он использует (пул соединений JDBC - не связанный с этой проблемой), он бросил «java.lang.IllegalStateException: getOutputStream() уже вызван этот ответ ». это похоже на зверя, чтобы вылечить. Но как только я снова заработаю, я подтвержу это, обновить код и щелкнуть разрешенный флажок. Еще раз спасибо glb – George

Смежные вопросы