JMS mit activemq

Status
Nicht offen für weitere Antworten.

Fabian030

Mitglied
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:
Java:
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:
 
Zuletzt bearbeitet:
G

Gelöschtes Mitglied 5909

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

Fabian030

Mitglied
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

Mitglied
machen wir's mal einfacher. :)

Java:
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:
Java:
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? :oops:
 
Zuletzt bearbeitet:
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben