JMS не может найти очередь - PullRequest
0 голосов
/ 06 февраля 2019

Я установил Glassfish5 и запустил его с помощью eclipse.Я также вошел в консоль администратора Glassfish и создал две очереди, а именно Queue01 и Queue02 в опции JMS Resources \ Destination Resources.Код не делает, но когда я запускаю его, последнее, что он выполняет, - это оператор print перед командой lookup.Вот мой код:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Properties;
import javax.jms.ConnectionFactory;
import javax.jms.JMSContext;
import javax.jms.JMSException;
import javax.jms.JMSProducer;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.Queue;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class Main implements MessageListener{


public static void main(String[] args) throws JMSException,NamingException, IOException{

    if(args.length!=3) System.out.println("usage: username subscribe-to-queue publish-to-queue");
    else {
        String username = args[0];
        System.out.println("username: " + username + " | subscribe-to-queue-name " + args[1] + " | publish-to-queue-name " + args[2]);
        Context initialContext = Main.getInitialContext();
        Main myMain = new Main();
        System.out.println("Before Queue");
        Queue queue01 = (Queue) initialContext.lookup(args[1]);
        Queue queue02 = (Queue) initialContext.lookup(args[2]);
        //java:comp/DefaultJMSConnectionFactory is the default conection at the JMS app server (no need to define it)
        System.out.println("Before ConnectionFactory");
        JMSContext jmsContext = ((ConnectionFactory) initialContext.lookup("java:comp/DefaultJMSConnectionFactory")).createContext();
        //we use jms context to pickup jms consumer and assign it our own class (Main)
        System.out.println("Before createConsumer");
        jmsContext.createConsumer(queue01).setMessageListener(myMain);
        System.out.println("Before jmsProducer");
        JMSProducer jmsProducer = jmsContext.createProducer();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        String msgToSend = null;

        System.out.println("Before while");
        while(true) {
            System.out.println("Please enter msg:");
            msgToSend = bufferedReader.readLine();
            if(msgToSend.equalsIgnoreCase("exit")) {
                jmsContext.close();
                System.exit(0);
            }else {
                System.out.println("Before send");
                jmsProducer.send(queue02, "["+username+": "+msgToSend+"]");
                System.out.println("after send");
            }
        }
    }
}

@Override
public void onMessage(Message message) {
    try{System.out.println(message.getBody(String.class));}
    catch (JMSException e) {e.printStackTrace();}
}

public static Context getInitialContext () throws JMSException,NamingException
{
     Properties prop = new Properties();
     prop.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
     prop.setProperty("java.naming.factory.url.pkgs", "org.jnp.interfaces");
     prop.setProperty("java.naming.provider.url", "jnp://localhost:3700");
     Context context = new InitialContext(prop);


    //Context context = new InitialContext();

return context;
}

}

Любой намек на то, что не так с моим кодом, что приводит к невозможности выполнить команду поиска?Проблема в том, что я не вижу сообщений об ошибках, которые бы подсказали мне, что не так.Я попытался изменить URL провайдера без удачи.

...