# JMS ActiveMQ Verständnisproblem



## BuckRogers (23. Nov 2012)

Moin erstmal,

habe da ein ein Problem in Sachen JMS. Sicherlich liegt es nicht am code, sondern eher an der Konfiguration.

- activeMQ läuft
- jndi.properties sind vorhanden im classpath des projekts
- 2 Klassen sind vorhanden die kommunizieren sollen 

EchoServer.java:


```
package rrJMS;

import java.util.Properties;

import javax.jms.*;
import javax.naming.*;


public class EchoServer {
	private static final String DESTINATION = "queue/myQueue1";
	private static final String USER = "guest";
	private static final String PASSWORD = "guest";
	private QueueConnectionFactory factory;
	private Queue queue;

	public EchoServer() throws NamingException, JMSException {
//		Properties env = new Properties();
//		env.put(Context.SECURITY_PRINCIPAL, "guest");  
//		env.put(Context.SECURITY_CREDENTIALS, "guest");
//		env.put(Context.INITIAL_CONTEXT_FACTORY,
//		    "org.apache.activemq.jndi.ActiveMQInitialContextFactory");
//		env.put(Context.PROVIDER_URL,
//		     "tcp://localhost:61616");
		Context ctx = new InitialContext();
		factory = (QueueConnectionFactory) ctx.lookup("ConnectionFactory");
		queue = (Queue) ctx.lookup("queue/myQueue1");
	}

	public static void main(String[] args) throws Exception {
		EchoServer server = new EchoServer();
		server.process();
	}

	public void process() throws JMSException {
		QueueConnection connection = factory.createQueueConnection(USER,
				PASSWORD);
		QueueSession session = connection.createQueueSession(false,
				Session.AUTO_ACKNOWLEDGE);
		QueueReceiver receiver = session.createReceiver(queue);
		connection.start();
		System.out.println("EchoServer gestartet ...");
		while (true) {
			TextMessage request = (TextMessage) receiver.receive();
			String text = request.getText();
			Queue tempQueue = (Queue) request.getJMSReplyTo();
			TextMessage response = session.createTextMessage();
			response.setText(text);
			QueueSender sender = session.createSender(tempQueue);
			sender.send(response);
		}
	}
}
```

EchoClient.java:


```
package rrJMS;

import java.util.Properties;

import javax.jms.*;
import javax.naming.*;

public class EchoClient {
	private static final String DESTINATION = "queue/myQueue1";
	private static final String USER = "guest";
	private static final String PASSWORD = "guest";
	private String text;
	private QueueConnectionFactory factory;
	private Queue queue;
	
	
	

	public EchoClient(String text) throws NamingException, JMSException {
//		Properties env = new Properties();
//		env.put(Context.SECURITY_PRINCIPAL, "guest");  
//		env.put(Context.SECURITY_CREDENTIALS, "guest");
//		env.put(Context.INITIAL_CONTEXT_FACTORY,
//		    "org.apache.activemq.jndi.ActiveMQInitialContextFactory");
//		env.put(Context.PROVIDER_URL,
//		     "tcp://localhost:61616");
		this.text = text;
		Context ctx = new InitialContext();
		factory = (QueueConnectionFactory) ctx.lookup("ConnectionFactory");
		queue = (Queue) ctx.lookup("queue/myQueue1");
	}

	public static void main(String[] args) throws Exception {
		String text = "Hallo";
		EchoClient client = new EchoClient(text);
		client.process();
	}

	public void process() throws JMSException {
		TemporaryQueue tempQueue = null;
		QueueSender sender = null;
		QueueReceiver receiver = null;
		QueueSession session = null;
		QueueConnection connection = null;
		try {
			connection = factory.createQueueConnection(USER,
					PASSWORD);
			session = connection.createQueueSession(false,
					Session.AUTO_ACKNOWLEDGE);
			// temporäre Queue für die Antwort erzeugen
			tempQueue = session.createTemporaryQueue();
			sender = session.createSender(queue);
			receiver = session.createReceiver(tempQueue);
			connection.start();
			TextMessage request = session.createTextMessage();
			request.setText(text);
			request.setJMSReplyTo(tempQueue);
			sender.send(request);
			// auf Antwort warten
			TextMessage response = (TextMessage) receiver.receive();
			System.out.println(response.getText());
		} finally {
			sender.close();
			receiver.close();
			tempQueue.delete();
			session.close();
			connection.close();
		}
	}
}
```

jndi.properties:


```
java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory
java.naming.provider.url=tcp://localhost:61616
# queue.[jndiName]= [physicalName]
queue.queue/myQueue1 = myQueue1
```


Das Problem liegt an der Initialisierung der 
	
	
	
	





```
queue
```
 da der 
	
	
	
	





```
InitialContext
```
 nichterzeugt werden kann.
Die Properties stimmen, die activeMQ läuft auch. der Code ist soweit auch korrekt.
Habe bisher verschiedene Möcglichkeiten ausprobiert, auch das direkte setzen der Properties(mittlerweile auskommentiert).

Ich vermute, dass die jndi.properties erst garnicht gelesen wird. 
Im Grunde verstehe ich auch garnicht was activeMQ macht und wie es angesteuert wird. 

Vielen dank für hilfreiche Vorschläge im Voraus.


----------



## BuckRogers (23. Nov 2012)

Also, habe weiter konfiguriert und immerhin startet der Server problemlos und wartet auf eingehende Nachricht. 

Der Client startet und schmeisst ne Exception an der Stelle 

[JAVA=58] sender.send(request);[/code]

Und zwar 

```
Exception in thread "main" java.lang.NoSuchMethodError: org.apache.activemq.ActiveMQMessageProducerS
upport.getDestination()Ljavax/jms/Destination;
	at org.apache.activemq.ActiveMQMessageProducerSupport.send(ActiveMQMessageProducerSupport.java:241)
	at rrJMS.EchoClient.process(EchoClient.java:61)
	at rrJMS.EchoClient.main(EchoClient.java:36)
```

Nun habe ich in verschiedenen Foren gelesen dass es an Versionsinkompatibilität liegen soll.
Habe andere Versionen probiert. Gleiches Problem.
Habe andere PRogrammbeispiele mit verschiedenen activeMQ-Versionen probiert. 
Gleicher Stand, gleiches Problem.

Muss ich irgendwas in der activeMQ-Konfiguration ändern? 
Am webMonitor kommen auch keine queues an.
Habe im classpath des Programms die
- activeMQ-all-5.7.0.jar
- jndi.properties (momentan ohne Gebreuch)
- log4j.properties

Bin für jeden Ratschag dankbar


----------



## FArt (26. Nov 2012)

Bist du sicher, dass sowohl Client als auch Server im Klassenpfad die selbe Version zuerst finden?


----------



## FArt (26. Nov 2012)

Erledigt?


----------



## BuckRogers (30. Nov 2012)

JA erledigt. Ich habe einfach selber ein Programm geschrieben und nicht das vom Prof aus den Folien genommen.
Und siehe da, es hat funktioniert. Lag wohl doch am code


----------



## FArt (30. Nov 2012)

OSI-Layer-8 Fehler...


----------



## BuckRogers (30. Nov 2012)

Danke, sehr nett. -.-


----------

