# JMS mit activemq



## Fabian030 (29. Mai 2009)

heyho,
ich mal wieder 

ich hab nu activemq gestartet
will dann einen producer starten

und schon kommt folgende fehlermeldung:
Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial

für die zeile:

```
QueueConnectionFactory factory = (QueueConnectionFactory) ctx.lookup("ConnectionFactory");
```

sollte der sich jetzt nicht mit dem gestarteten activemq broker verbinden? das dingen läuft und ich kann den auch iwie über ServerCon administrieren ...

:rtfm:

die jndi.properties hab ich im lib-verzeichnis vom JAVA_HOME
sollte doch so eigentlich funktionieren? ???:L

edit: ok ok. der classpath der anwendung war's. :bahnhof:


----------



## Gelöschtes Mitglied 5909 (29. Mai 2009)

ich rate mal und sag du hast den JNDI Context bzw die Factory nicht gesetzt


----------



## Fabian030 (2. Jun 2009)

die fac war gesetzt

es war die jndi.properties, die ich nicht im class verzeichnis des projektes hatte.
auf der javadoc (oder die doku-seite von activemq?) stand nur was vom java_home-verzeichnis, wo die liegen müsse ...

aber am verzweifeln bin ich trotzdem gerade noch. :/


----------



## Fabian030 (3. Jun 2009)

machen wir's mal einfacher. 


```
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 {
		Context ctx = new InitialContext();
		factory = (QueueConnectionFactory) ctx.lookup("ConnectionFactory");
		queue = (Queue) ctx.lookup(DESTINATION);
	}
	
	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);
		}
	}
}
```

Client:

```
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() throws NamingException, JMSException {
		Context ctx = new InitialContext();
		factory = (QueueConnectionFactory) ctx.lookup("ConnectionFactory");
		queue = (Queue) ctx.lookup(DESTINATION);
	}

	public static void main(String[] args) throws Exception {
		EchoClient client = new EchoClient();
		client.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);
		TemporaryQueue tempQueue = null;
		QueueSender sender = null;
		connection = factory.createQueueConnection(USER, PASSWORD);
		session = connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
		while(true){
			String text = Tastatur.liesString();
			//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());
		}
	}
}
```


und jetzt möchte ich solange wie ich will zwischen client und server nachrichten transportieren, sprich zum server senden, wieder empfangen und ausgeben.
klappt aber nicht, da er mir nach der zweiten eingabe halt diesen fehler ausspuckt. und ich hab schon einiges probiert, wie ich die connections und queues in einer schleife behalte (oder sonstwas ...)



> 03.06.2009 22:43:51 org.apache.activemq.ActiveMQSessionExecutor execute
> WARNUNG: Received a message on a connection which is not yet started. Have you forgotten to call Connection.start()? Connection: ActiveMQConnection {id=ID:Leviathan-52198-1244061826136-0:0,clientId=ID:Leviathan-52198-1244061826136-1:0,started=false} Received: MessageDispatch {commandId = 0, responseRequired = false, consumerId = ID:Leviathan-52198-1244061826136-0:0:1:1, destination = queue://myQueue1, message = ActiveMQTextMessage {commandId = 12, responseRequired = true, messageId = ID:Leviathan-52198-1244061826136-0:1:1:2:1, originalDestination = null, originalTransactionId = null, producerId = ID:Leviathan-52198-1244061826136-0:1:1:2, destination = queue://myQueue1, transactionId = null, expiration = 0, timestamp = 1244061831084, arrival = 0, brokerInTime = 1244061831084, brokerOutTime = 1244061831085, correlationId = null, replyTo = temp-queue://ID:Leviathan-52198-1244061826136-0:1:2, persistent = true, type = null, priority = 4, groupID = null, groupSequence = 0, targetConsumerId = null, compressed = false, userID = null, content = null, marshalledProperties = null, dataStructure = null, redeliveryCounter = 0, size = 0, properties = null, readOnlyProperties = true, readOnlyBody = true, droppable = false, text = bla}, redeliveryCounter = 0}



???:L ???:L ???:L

hat jemand ne idee woran das liegt?


----------

