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