java - 使用 java Swing 向 JMS 队列发送消息

标签 java swing jms glassfish-4

我已经使用Oracle Glass-fish服务器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)

任何人都可以帮忙解决这个问题吗?

最佳答案

在服务器上下文之外,没有默认的初始上下文工厂类。

从一开始就尝试这个:

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 作为依赖项。

关于java - 使用 java Swing 向 JMS 队列发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42317768/

相关文章:

java - ThroughputConnectionFactory、ConnectionFactory、XAConnectionFactory 和 XAConnectionThroughputConnectionFactory 之间有什么区别

java - 解释 java.lang.NoSuchMethodError 消息

java - 找出两棵树是否有相似的叶子(从左到右)?

java - GWT 多分页(最好/最简单的方法)

android - 为什么大多数 UI 框架都是单线程的?

intellij-idea - 使用 IntelliJ 监控 JMS 队列

java - 使用 startsWith 比较两个字符串时出现编译错误

java - 在 JPanel 中实例化 JApplet 实例?

Java菜单问题

java - JMS关闭客户端资源(MessageConsumer、Session、Connection)