2012-02-06 20 views
5

Estoy intentando un proyecto para la escuela usando JMS y ActiveMQ.Excepción JMS y ActiveMQ

He copiado el bloque de código de los libros de O'Reilly "Java Message Service 2nd Edition Jun 2009". Utiliza el método de publicar y suscribir, y de hecho es un chat pequeño donde todos los que están conectados al tema pueden enviar mensajes a todos y todos pueden ver los mensajes de los demás. Puedo compilar el programa y todo está bien, trato de ejecutarlo y me da la siguiente excepción:

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] 

He encontrado que este problema puede ser debido a 2 razones:

  1. activemq-todo -5.2.0.jar no se agrega a classpath.
    PERO lo agregó el classpath (EnvironmentVariables-> select ClassPath-> Edit y agrega lo siguiente: "D: \ Programming \ JMS \ ActiveMQ \ apache-activemq-5.2.0" (ESTO ES CÓMO LO AÑADE NO?!? !)
  2. archivo jndi.properties no está definido correctamente o no se ha añadido a la ruta de clase
    pero yo lo creó y ha añadido que es la carpeta a la ruta de clase Aquí es lo que 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 
    

¿Cuál es el problema? He intentado durante años para que funcione. ¿Estoy haciendo algo mal? :(

¿Importa la ruta del archivo jndi.properties? o solo tiene que ser colocado en classpath y desde aquí se puede encontrar?

También corrió la activemq.bat de la carpeta bin D: \ Programación \ JMS \ ActiveMQ \ apache-activemq-5.2.0 \ bin \

[Editar] --------- ------------ Así que funciona en Eclipse, PERO Ahora he agregado correctamente el archivo .jar en variables de entorno y he ejecutado el cliente desde el cmd de Windows. No da ningún error, cuando escribo en la consola de Eclipse, aparece en la consola cmd, todo bien, pero cuando intento escribir cmd da un error en esta línea:

publisher.publish(message); 

y dice

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

¿Alguna idea? Realmente me gustaría poder ejecutarlo en CMD. :(

--------------------- [/ editar]

Respuesta

2

Bueno, yo estoy en Linux en este momento, pero apuesto a que tiene que ser:

D: \ Programación \ JMS \ ActiveMQ \ apache-5.2.0-activemq frasco

Además, si se ejecuta con Eclipse y vaya a Project -> Build Path y este frasco a continuación. no debería haber ningún problema. De todos modos, ¿puede publicar la variable CLASSPATH?

E DIT

No puedo ayudarte si no puedes ayudarme. Esto está relacionado con cualquier otra pregunta futura o trabajo en general, proporciona detalles; siempre es útil.Será muy útil si proporcionas el comando EXACTO que estás ejecutando en CMD y el código de la clase donde sucede esto.

java.lang.NoSuchMethodError

generalmente significa que el frasco está en su lugar, clase también, pero el método no es. Sucede cuando compila con una versión del jar y en el tiempo de ejecución proporciona un jar donde se eliminó este método, por lo que el JRE no puede encontrarlo lanzando el error.

Acabo de probar en mi equipo

No entiendo por qué no funciona para usted, pero lo hace por mí. Aquí está mi clase:

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(); 
     } 
    } 
} 

Todo está bien si lo ejecuto desde Eclipse con una sola dependencia de Maven:

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

entonces lo hago con java y 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 

Observe que lo único que agregué son los dos frascos.

Entonces 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 

he añadido un par de frascos necesarios a la ruta de clase y ejecutarlo - que funciona perfectamente.

Cheers, Eugene.

+1

Hoooooly mierda. Funciona en Eclipse. Por fin: ((. Me hace querer llorar, no tienes idea de cuánto tiempo perdí con esto. Muchas gracias. – AndreiBogdan

+1

¿Podrías mirar por Editar? Si pudieras ayudarme una vez más sería excelente. :) – AndreiBogdan

+1

@AndreiBogdan mira mi actualización y proporciona más detalles si sigues recibiendo el error. – Eugene

0

Me encontré con el mismo problema y era un espacio (o lo que parecía ser un espacio) al final de la configuración de mi propiedad.

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

También tenga en cuenta que no necesariamente tiene que incrustar el archivo jar en su código de cliente. Simplemente incluir el activemq-all como una dependencia de maven también funcionará.