与JMS简单聊天

时间:2012-04-30 16:24:08

标签: java jms

我正在使用JMS创建一个简单的聊天应用程序,但我的代码无效,我不知道为什么。这是我的代码,我和JBoss一起使用,所以我打开pub并写下这个,当我点击启动Eclipse时给我这个错误信息:

<pre>
Topic or username missingjava.lang.ArrayIndexOutOfBoundsException: 0
    at chat.pub.main(pub.java:105)
</pre>

and this is the code, what is the problem?

    package chat;

    import javax.jms.*;
    import javax.naming.*;
    import java.io.*;
    import java.io.InputStreamReader;
    import java.util.Properties;

    public class pub implements javax.jms.MessageListener{
        private TopicSession pubSession;
        private TopicSession subSession;
        private TopicPublisher publisher;
        private TopicConnection connection;
        private String username;

        /* Constructor. Establish JMS publisher and subscriber */
        public pub(String topicName, String username, String password)
        throws Exception {
            // Obtain a JNDI connection
            Properties env = new Properties( );
            env.put(Context.SECURITY_PRINCIPAL, "guest"); 
            env.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory"); 
            env.setProperty("java.naming.provider.url", "localhost:1099"); 
            env.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming");

            // ... specify the JNDI properties specific to the vendor

            InitialContext jndi = new InitialContext(env);


            // Look up a JMS connection factory
            TopicConnectionFactory conFactory =
            (TopicConnectionFactory)jndi.lookup("TopicConnectionFactory");

            // Create a JMS connection
            TopicConnection connection =
            conFactory.createTopicConnection(username,password);





            // Create two JMS session objects
            TopicSession pubSession =
            connection.createTopicSession(false,
                                          Session.AUTO_ACKNOWLEDGE);
            TopicSession subSession =
            connection.createTopicSession(false,
                                          Session.AUTO_ACKNOWLEDGE);

            // Look up a JMS topic
            Topic chatTopic = (Topic)jndi.lookup(topicName);

            // Create a JMS publisher and subscriber
            TopicPublisher publisher1 = 
                pubSession.createPublisher(chatTopic);
            TopicSubscriber subscriber = 
                subSession.createSubscriber(chatTopic);

            // Set a JMS message listener
            subscriber.setMessageListener(this);

            // Intialize the Chat application
            set(connection, pubSession, subSession, publisher1, username);

            // Start the JMS connection; allows messages to be delivered
            connection.start( );

        }
        /* Initialize the instance variables */
        public void set(TopicConnection con, TopicSession pubSess,
                        TopicSession subSess, TopicPublisher pub, 
                        String username) {
            this.connection = con;
            this.pubSession = pubSess;
            this.subSession = subSess;
            this.publisher = pub;
            this.username = username;
        }
        /* Receive message from topic subscriber */
        public void onMessage(Message message) {
            try {
                TextMessage textMessage = (TextMessage) message;
                String text = textMessage.getText( );
                System.out.println(text);
            } catch (JMSException jmse){ jmse.printStackTrace( ); }
        }
        /* Create and send message using topic publisher */
        protected void writeMessage(String text) throws JMSException {
            TextMessage message = pubSession.createTextMessage( );
            message.setText(username+" : "+text);
            publisher.publish(message);
        }
        /* Close the JMS connection */
        public void close( ) throws JMSException {
            connection.close( );
        }
        /* Run the Chat client */
        public static void main(String [] args){
            try{
                if (args.length!=3)
                    System.out.println("Topic or username missing");

                // args[0]=topicName; args[1]=username; args[2]=password
                pub chat = new pub(args[0],args[1],args[2]);

                // Read from command line
                BufferedReader commandLine = new 
                  java.io.BufferedReader(new InputStreamReader(System.in));

                // Loop until the word "exit" is typed
                while(true){
                    String s = commandLine.readLine( );
                    if (s.equalsIgnoreCase("exit")){
                        chat.close( ); // close down connection
                        System.exit(0);// exit program
                    } else 
                        chat.writeMessage(s);
                }
            } catch (Exception e){ e.printStackTrace( ); }
        }
    }
    i do this ![enter image description here][1]
    and now i get this eroor 
    ![enter image description here][2]
    and i dont no what i do not ok i will be happy for help thanks!!


      [1]: http://i.stack.imgur.com/c04o1.gif
      [2]: http://i.stack.imgur.com/dxCIU.gif

1 个答案:

答案 0 :(得分:2)

java.lang.ArrayIndexOutOfBoundsException: 0 at chat.pub.main(pub.java:105)

这意味着你在没有给出参数的情况下启动了程序

然后在第105行

pub chat = new pub(args[0],args[1],args[2]);

当args为空时,你正在访问args的第0个元素。

重新运行程序并根据需要提供参数(3)。

编辑:

为了在Eclipse中运行提供参数:

运行 - &gt;运行配置 - &gt;选择pub(因为你已经尝试在eclipse中运行它) - &gt;选择参数 - &gt;在Program Argument下,指定由空格分隔的参数

Pictorial View