Исключение в программе для чтения сообщений JMS - PullRequest
0 голосов
/ 03 февраля 2019

Я использую код Java в Eclipse, который должен непрерывно читать сообщения JMS из очереди JMS в Jboss EAP 6.4.Тем не менее, я получаю исключение при запуске этой программы.Я пытался устранить неполадки, но я застрял сейчас

Код, который я использую, как показано ниже (фактический IP-адрес Jboss заменен на #. "Remote: //#.#.#.#: 4447")

import java.util.Hashtable;
import javax.jms.Connection;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueReceiver;
import javax.jms.QueueSession;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import EDU.oswego.cs.dl.util.concurrent.CountDown;

public class GetMessageTriggerResponses
{
    static CountDown done = new CountDown(10);

    QueueConnection conn;
    QueueSession session;
    Queue recvq;

    public static class ExListener implements MessageListener 
    {
        public void onMessage(Message msg) 
        {
            done.release();
            TextMessage tm = (TextMessage) msg;
            try {
                System.out.println("Received message: \n" + tm.getText());
            } catch (Throwable t) {
                t.printStackTrace();
            }
        }
    }

    public void setup(String[] args) throws JMSException, NamingException, InterruptedException
    {
        Hashtable env = new Hashtable();
        env.put(InitialContext.INITIAL_CONTEXT_FACTORY,"org.jboss.naming.remote.client.InitialContextFactory");
        env.put(InitialContext.PROVIDER_URL, "remote://#.#.#.#:4447");  // DEV-ENV

        Context context = new InitialContext(env);
        QueueConnectionFactory connectionFactory = (QueueConnectionFactory) context
                .lookup("jms/RemoteConnectionFactory");

        Connection connection = connectionFactory.createConnection();

        recvq = (Queue) context.lookup(args[0]);

        System.out.println("listening on "+args[0]);

        session = conn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
        conn.start();

        System.out.println("Begin recv message");
        QueueReceiver receiver = session.createReceiver(recvq);
        receiver.setMessageListener(new ExListener());

        done.acquire();
    }

     public void stop()
        throws JMSException
    {
        conn.stop();
        session.close();
        conn.close();
    }

    public static void main(String args[])
        throws Exception
    {
       /*if (args.length < 1) {
            System.err.println("Usage: java prog_name msg-trigger-qname");
            return;
        }*/

        System.out.println("Begin GetMessageTriggerResponses");
        GetMessageTriggerResponses client = new GetMessageTriggerResponses();
        client.setup(args);
        client.stop();
        System.out.println("End GetMessageTriggerResponses");
        System.exit(0);
    }
}

Я получаю исключение:

Begin GetMessageTriggerResponses
Feb 04, 2019 12:49:42 AM org.xnio.Xnio <clinit> INFO: XNIO Version 3.0.17.GA-redhat-1 Feb 04, 2019 12:49:42 AM org.xnio.nio.NioXnio <clinit> INFO: XNIO NIO Implementation Version 3.0.17.GA-redhat-1 
Feb 04, 2019 12:49:42 AM org.jboss.remoting3.EndpointImpl <clinit> INFO: JBoss Remoting version 3.3.12.Final-redhat-2 
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
    at GetMessageTriggerResponses.setup(GetMessageTriggerResponses.java:56)
    at GetMessageTriggerResponses.main(GetMessageTriggerResponses.java:88)

1 Ответ

0 голосов
/ 04 февраля 2019

Проблема в том, что вы передаете массив пусто в метод setup() GetMessageTriggerResponses, а затем пытаетесь использовать значение из этого массива.Это проблемная строка:

recvq = (Queue) context.lookup(args[0]);

Либо, когда вы вызываете setup() или обращаетесь к массиву, вы должны проверить, чтобы убедиться, что он имеет ожидаемое количество значений.Это базовая проверка ввода.На самом деле у вас есть некоторый код для проверки ввода в main(), но вы по какой-то причине прокомментировали его.Я рекомендую вам восстановить этот код, чтобы избежать этого ArrayIndexOutOfBoundsException.

...