Warum ist mein JNDI-lookup für eine QueueConnectionFactory null zurückgeben?
Ich versuche zu schauen, eine QueueConnectionFactory
und Queue
über Geronimo ' s-JNDI -. Die Queue
wird zurückgegeben in Ordnung, aber die QueueConnectionFactory
lookup immer null zurück. Es nicht werfen NamingException
, das ist, was ich erwarten würde, wenn der JNDI-name war falsch.
Kann jemand sehen, was ich falsch mache? Der test code unten Ausgänge:
wahr false
import javax.jms.Queue;
import javax.jms.QueueConnectionFactory;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class JndiTest
{
private final static String QUEUE_NAME = "jca:/org.apache.geronimo.configs/activemq-ra/JCAAdminObject/SendReceiveQueue";
private final static String FACTORY_NAME = "jca:/org.apache.geronimo.configs/activemq-ra/JCAManagedConnectionFactory/DefaultActiveMQConnectionFactory";
public static void main(String[] args) throws NamingException
{
InitialContext ctx = new InitialContext();
QueueConnectionFactory factory = (QueueConnectionFactory) ctx.lookup(FACTORY_NAME);
Queue queue = (Queue)ctx.lookup(QUEUE_NAME);
System.out.println(factory == null);
System.out.println(queue == null);
}
}
Falls es einen Unterschied macht: habe ich Hinzugefügt openejb-client-3.0.1.jar, geronimo-ejb_3.0_spec-1.0.1.jar und activemq-core-4.1.2-G20090207.jar zu meiner Klasse Weg, und mein jndi.properties-Datei hat die folgenden Eigenschaften:
java.die Benennung.factory.initial = org.apache.openejb.client.RemoteInitialContextFactory java.die Benennung.Anbieter.url = ejbd://127.0.0.1:4201
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Grund, warum es nicht eine Ausnahme ist, dass - es ist eine ClassLoadException kommt, dass, wenn die Ressource zugegriffen wird.
Und der Grund, warum das passiert ist, weil Sie die Klasse : com.Sonne.jndi.url.jca.jcaURLContextFactory gesucht werden, indem der ClassLoader aufgerufen ResourceManager.
Wenn Sie die Fabrik-Namen zu einem anderen Namen, dann sehen Sie die NamingException - aber in dem Fall von lookup , für Ausnahmen wie ClassNotFound/IllegalState - keine Ausnahmen ausgelöst werden.
Die Abhängigkeiten von ActiveMQ so müssen analysiert werden.
Update1: Eine der möglichen Gründe dafür ist, dass das factory-Objekt kann nur instanziiert werden, die in einer verwalteten Umgebung. Sind Sie Ihren code ausführen, wie eine client-Anwendung?.
Update2: Einige weitere Hinweise für die Ursache dieses Verhaltens:
Fand diese auf einer ActiveMQ-Website:
Mehr sehen, wie Verbinden mit JNDI:
Die initial context factory in der Erklärung ist: org.apache.activemq.jndi.ActiveMQInitialContextFactory
Einige Beispiel-code zum testen mit JNDI gefunden werden kann hier
Ich schrieb ein einfaches java-client - Hinweis: unterhalb der Anbieter-url ist die brokerURL, der verwendet wird.
Dieses Programm gibt die Ausgabe:
conn ist : org.apache.activemq.ActiveMQConnectionFactory
Warteschlange ist : org.apache.geronimo.configs/activemq-ra/JCAAdminObject/Warteschlange "SendReceiveQueue"
Habe ich eine etwas gleichwertigen Konfiguration von Tomcat/Geronimo J2EE jar /Geronimo-JMS-Jar /ActiveMQ 4
Und ich bin ein bisschen verwirrt über Ihren jndi.propertie-Datei.
Mine sieht wie folgt aus :
java.naming.factory.initial = org.apache.activemq.jndi.ActiveMQInitialContextFactory
java.naming.provider.url = tcp://localhost:61616
connectionFactoryNames = connectionFactory , TopicConnectionFactory
Der große Unterschied ist offensichtlich, dass Ihre erste Kontext ist die Fernbedienung. Neben, dass, ich muss einen connectionFactoryNames, oder bekomme ich eine NamingException.
Ich weiß nicht, warum, aber für mich, mit einem Kontext, der nicht funktioniert hat. Es scheint, dass die Nachricht gesendet wird, aber die onMessage meiner Verbraucher nicht genannt.
Mit einem Kontext, der nicht throw exception, aber nicht arbeiten :
Mithilfe des folgenden Codes ( ohne Rahmen ) funktioniert gut :
Gibt es zwei Teilnehmer hier suchen Sie in der JNDI-für etwas. Jemand anderes hatte, um es dort. Ich weiß nicht, die Besonderheiten Ihrer Umgebung an, aber mein Ansatz für solche Probleme ist