使用 java Swing 向 JMS 队列发送消息
Send a Message to JMS queue using java Swing
我已经使用 Oracle Glass-fish server 4.1 版本成功开发和 JMS 队列,然后我可以使用 java EE 应用程序成功发送和读取消息,但我需要将 Sender 代码实现到 Swing 应用程序,我使用了与 Java EE 应用程序相同的代码,但它运行不正常,请参考下面的代码
public class SenderSwing {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
try {
new SenderSwing().sendJMSMessageToDefaultQueue("Hi "+System.currentTimeMillis());
}catch(Exception e){
e.printStackTrace();
}
}
private void sendJMSMessageToDefaultQueue(Object messageData) throws JMSException, NamingException {
Context c = new InitialContext();
ConnectionFactory cf = (ConnectionFactory) c.lookup("java:comp/DefaultJMSConnectionFactory");
Connection conn = null;
Session s = null;
try {
conn = cf.createConnection();
s = conn.createSession(false, s.AUTO_ACKNOWLEDGE);
Destination destination = (Destination) c.lookup("jms/defaultQueue");
MessageProducer mp = s.createProducer(destination);
mp.send(createJMSMessageForjmsDefaultQueue(s, messageData));
} finally {
if (s != null) {
try {
s.close();
} catch (JMSException e) {
Logger.getLogger(this.getClass().getName()).log(Level.WARNING, "Cannot close session", e);
}
}
if (conn != null) {
conn.close();
}
}
}
private Message createJMSMessageForjmsDefaultQueue(Session session, Object messageData) throws JMSException {
// TODO create and populate message to send
TextMessage tm = session.createTextMessage();
tm.setText(messageData.toString());
return tm;
}
}
上面的代码给我一个例外,如下所示,
javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:662)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:313)
at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:350)
at javax.naming.InitialContext.lookup(InitialContext.java:417)
at senderswing.SenderSwing.sendJMSMessageToDefaultQueue(SenderSwing.java:43)
at senderswing.SenderSwing.main(SenderSwing.java:35)
谁能帮忙解决这个问题。
在服务器上下文之外,没有默认的初始上下文工厂class。
一开始试试这个:
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.enterprise.naming.SerialInitContextFactory");
Context c = new InitialContext(env);
您将需要 glassfish-naming(或 embedded-all)jar 作为依赖项。
我已经使用 Oracle Glass-fish server 4.1 版本成功开发和 JMS 队列,然后我可以使用 java EE 应用程序成功发送和读取消息,但我需要将 Sender 代码实现到 Swing 应用程序,我使用了与 Java EE 应用程序相同的代码,但它运行不正常,请参考下面的代码
public class SenderSwing {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
try {
new SenderSwing().sendJMSMessageToDefaultQueue("Hi "+System.currentTimeMillis());
}catch(Exception e){
e.printStackTrace();
}
}
private void sendJMSMessageToDefaultQueue(Object messageData) throws JMSException, NamingException {
Context c = new InitialContext();
ConnectionFactory cf = (ConnectionFactory) c.lookup("java:comp/DefaultJMSConnectionFactory");
Connection conn = null;
Session s = null;
try {
conn = cf.createConnection();
s = conn.createSession(false, s.AUTO_ACKNOWLEDGE);
Destination destination = (Destination) c.lookup("jms/defaultQueue");
MessageProducer mp = s.createProducer(destination);
mp.send(createJMSMessageForjmsDefaultQueue(s, messageData));
} finally {
if (s != null) {
try {
s.close();
} catch (JMSException e) {
Logger.getLogger(this.getClass().getName()).log(Level.WARNING, "Cannot close session", e);
}
}
if (conn != null) {
conn.close();
}
}
}
private Message createJMSMessageForjmsDefaultQueue(Session session, Object messageData) throws JMSException {
// TODO create and populate message to send
TextMessage tm = session.createTextMessage();
tm.setText(messageData.toString());
return tm;
}
}
上面的代码给我一个例外,如下所示,
javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:662)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:313)
at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:350)
at javax.naming.InitialContext.lookup(InitialContext.java:417)
at senderswing.SenderSwing.sendJMSMessageToDefaultQueue(SenderSwing.java:43)
at senderswing.SenderSwing.main(SenderSwing.java:35)
谁能帮忙解决这个问题。
在服务器上下文之外,没有默认的初始上下文工厂class。
一开始试试这个:
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.enterprise.naming.SerialInitContextFactory");
Context c = new InitialContext(env);
您将需要 glassfish-naming(或 embedded-all)jar 作为依赖项。