2012-02-06 18 views
5

Sto provando un progetto per la scuola che utilizza JMS e ActiveMQ.Eccezione JMS e ActiveMQ

Ho copiato il blocco di codice dai libri di O'Reilly "Java Message Service 2nd Edition Jun 2009". Utilizza il metodo di pubblicazione e sottoscrizione ed è in effetti una piccola chat in cui tutti gli utenti connessi all'argomento possono inviare messaggi a tutti e tutti possono vedere i messaggi di tutti gli altri. Compilo il programma e tutto è ok, provo a farlo funzionare e mi dà la seguente eccezione:

Exception in thread "main" javax.naming.NoInitialContextException: Cannot instantiate class: org.apache.activemq.jndi.ActiveMQInitialContextFactory [Root exception is java.lang.ClassNotFoundException: org.apache.activemq.jndi.ActiveMQInitialContextFactory] 

ho trovato che questo problema potrebbe essere a causa di 2 motivi:

  1. activemq-all -5.2.0.jar non viene aggiunto a classpath.
    MA ha aggiunto il classpath (EnvironmentVariables-> selezionare ClassPath-> Modifica e aggiungere quanto segue: "D: \ Programming \ JMS \ ActiveMQ \ apache-activemq-5.2.0" (QUESTO È COME LO AGGIUNGI NO?!? !)
  2. file di jndi.properties non è definito correttamente o non è stato aggiunto al classpath
    ma mi ha creato e ha aggiunto che è la cartella al classpath Ecco cosa contiene:..

    java.naming.factory.initial = org.apache.activemq.jndi.ActiveMQInitialContextFactory 
    java.naming.provider.url = tcp://localhost:61616 
    java.naming.security.principal=system 
    java.naming.security.credentials=manager 
    connectionFactoryNames = TopicCF 
    topic.topic1 = jms.topic1 
    

Qual è il problema? Ho cercato per anni di farlo funzionare. Sto facendo qualcosa di sbagliato? :(

Il percorso del file jndi.properties è importante? o deve solo essere collocato in classpath e da qui può essere trovato?

Inoltre ho fatto funzionare l'activemq.bat dalla cartella bin D: \ Programmazione \ JMS \ ActiveMQ \ apache-5.2.0-activemq \ bin \

[Edit] --------- ------------ Quindi funziona in Eclipse, MA Ora ho aggiunto correttamente il file .jar nelle variabili di ambiente e ho eseguito il client dal cmd di Windows. Non dà errori, quando scrivo in console di Eclipse, appare in console cmd, tutto ok, ma quando provo a scrivere in cmd dà un errore in questa linea:

publisher.publish(message); 

e dice

java.lang.NoSuchMethodError: org.apache.activemq.ActiveMQMessageProducerSupport.getDestination()Ljavax/jms/Destination; 

Qualche idea? Mi piacerebbe davvero essere in grado di eseguirlo in CMD. :(

--------------------- [/ Modifica]

risposta

2

Beh, io sono su Linux in questo momento, ma scommetto che deve essere:

D: \ Programmazione \ JMS \ ActiveMQ \ apache-5.2.0-activemq vaso

Inoltre, se lo si esegue con Eclipse e andare a Progetto -> costruire il percorso e questo vaso poi. non dovrebbero esserci problemi. In ogni caso è possibile pubblicare la variabile CLASSPATH?

E DIT

Non posso aiutarti se non puoi aiutarmi. Questo è legato a qualsiasi altra domanda futura o lavoro in generale, fornire dettagli - è sempre utile.Sarà molto utile se si fornirà il comando ESATTO che si sta eseguendo in CMD e il codice della classe in cui ciò accade.

java.lang.NoSuchMethodError

generalmente significa che il vaso è a posto, anche classe, ma il metodo non è. Succede quando si compila con una versione del jar e in fase di esecuzione si fornisce un jar in cui questo metodo è stato rimosso, quindi JRE non riesce a trovare l'errore.

Ho appena provato sul mio computer

Non capisco il motivo per cui non funziona per voi, ma lo fa per me. Qui è la mia classe:

package com.test; 
public class Publisher { 
public static void main(String[] args) { 
try{ 

     ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616"); 
     Connection connection = factory.createConnection(); 
     ActiveMQSession session = (ActiveMQSession) connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 

     Topic destination = session.createTopic("FOO.TEST");  
     TextMessage textMessage = session.createTextMessage("Sample Payload"); 

     TopicPublisher publisher = session.createPublisher(destination); 

     publisher.publish(textMessage); 

     session.close(); 
     connection.close(); 

     } catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 
} 

Tutto va bene se l'eseguo da Eclipse con un unico dipendenza nel Maven:

<groupId>org.apache.activemq</groupId> 
<artifactId>activemq-core</artifactId> 
<version>5.2.0</version> 

Poi lo faccio con java e javac

javac -classpath /home/eugen/.m2/repository/org/apache/activemq/activemq-core/5.2.0/activemq-core-5.2.0.jar:/home/eugen/.m2/repository/javax/jms/jms/1.1/jms-1.1.jar Publisher.java 

Si noti che l'unica cosa che ho aggiunto sono i due vasi.

Poi java:

java -classpath /home/eugen/.m2/repository/org/apache/activemq/activemq-core/5.2.0/activemq-core-5.2.0.jar:/home/eugen/.m2/repository/commons-logging/commons-logging-api/1.1/commons-logging-api-1.1.jar:/home/eugen/.m2/repository/org/apache/camel/camel-core/1.5.0/camel-core-1.5.0.jar:/home/eugen/workspace/t/src/main/java/:/home/eugen/.m2/repository/javax/jms/jms/1.1/jms-1.1.jar:/home/eugen/.m2/repository/org/apache/geronimo/specs/geronimo-j2ee-management_1.0_spec/1.0/geronimo-j2ee-management_1.0_spec-1.0.jar com.test.Publisher 

ho aggiunto un paio di vasetti necessari al classpath ed eseguirlo - funziona perfettamente.

Cheers, Eugene.

+1

Hoooooly merda. Funziona in Eclipse. Alla fine: ((. Mi fa venir voglia di piangere, non hai idea di quanto tempo ho sprecato con questo. Grazie mille – AndreiBogdan

+1

Puoi guardarmi da Modifica? Se potessi aiutarmi ancora una volta sarebbe eccellente. :) – AndreiBogdan

+1

@AndreiBogdan vedere il mio aggiornamento e fornire maggiori dettagli se si ottiene ancora l'errore. – Eugene

0

Mi sono imbattuto nello stesso problema ed era uno spazio (o quello che sembrava essere uno spazio) alla fine della mia configurazione di proprietà.

java.naming.factory.initial = org.apache.activemq.jndi.ActiveMQInitialContextFactory 

Si noti inoltre che non devono necessariamente incorporare il file jar nel codice del client. Funzionerà anche semplicemente l'activemq-all come dipendenza da esperto.