Problem mit Apache ActiveMQ

sYsChOs
Windoof-User
Windoof-User
Beiträge: 28
Registriert: 9. Aug 2005 12:15

Problem mit Apache ActiveMQ

Beitrag von sYsChOs »

Hallo,

wir haben mit der aktuellen praktischen Aufgabe Probleme:

Wir können einen Client starten, doch sobald ein zweiter Client versucht eine Verbindung zum MessageBroker aufzubauen, bekommen wir die Fehlermeldung:
05.12.2007 18:05:27 org.apache.activemq.store.DefaultPersistenceAdapterFactory createJournal
INFO: Journal is locked... waiting 10 seconds for the journal to be unlocked.
Es scheint, dass bei jeder neuen Verbindung auch ein neuer Broker gestartet wird. Wie können wir im Java-Programm einen vorhandenen (laufenden) Broker referenzieren???

Gruß,
Seb

rico
Windoof-User
Windoof-User
Beiträge: 37
Registriert: 25. Aug 2006 12:10

Beitrag von rico »

steh vor demselben Berg.
Kommentierung wäre nett, Tutorials super. Aber da siehts ja eher finster aus

Benutzeravatar
viktor
Windoof-User
Windoof-User
Beiträge: 26
Registriert: 7. Nov 2004 23:44

Beitrag von viktor »

als ich dieses problem hatte, habe ich den broker-transport von vm://localhost auf tcp://localhost:61616 oder so umgestellt und dann ging es.

Speedy
Windoof-User
Windoof-User
Beiträge: 36
Registriert: 13. Okt 2004 16:39

Beitrag von Speedy »

Ich habe auch noch zwei Fragen zu ActiveMQ:

1. Reicht es aus, wenn ich die jndi.properties im Projektverzeichnis anlege?

2. Meine TopicConnectionFactory sucht nach einen bestimmten Context:

Code: Alles auswählen

Context ctx = new InitialContext();
TopicConnectionFactory tcf = (TopicConnectionFactory) ctx
.lookup("Beispieltopic"); 
Kann mir jemand weiterhelfen, wie ich die Angabe "topic.[jndiName]=[physicalName]" in den properteis definiere? Der jndiName ist ja jetzt "Beispieltopic", aber was genau soll ich beim Phsyikalischen Namen angeben? Stehe irgendwie auf dem Schlauch

sYsChOs
Windoof-User
Windoof-User
Beiträge: 28
Registriert: 9. Aug 2005 12:15

Beitrag von sYsChOs »

Speedy hat geschrieben:Ich habe auch noch zwei Fragen zu ActiveMQ:

1. Reicht es aus, wenn ich die jndi.properties im Projektverzeichnis anlege?
Ja.
Speedy hat geschrieben: 2. Meine TopicConnectionFactory sucht nach einen bestimmten Context:

Code: Alles auswählen

Context ctx = new InitialContext();
TopicConnectionFactory tcf = (TopicConnectionFactory) ctx
.lookup("Beispieltopic"); 
Kann mir jemand weiterhelfen, wie ich die Angabe "topic.[jndiName]=[physicalName]" in den properteis definiere? Der jndiName ist ja jetzt "Beispieltopic", aber was genau soll ich beim Phsyikalischen Namen angeben? Stehe irgendwie auf dem Schlauch
Dieser lookup wird fehlschlagen. In der jndi.properties gibt es auch ein Feld "ConnectionFactory", den dort eingetragenen Namen musst du suchen.

Sowohl jndiName als auch physicalName kannst du beliebig wählen.


Grüße
Seb

Speedy
Windoof-User
Windoof-User
Beiträge: 36
Registriert: 13. Okt 2004 16:39

Beitrag von Speedy »

Danke erstmal! Das hilft auf jedenfall weiter.

Allerdings bekomme ich trotzdem immernoch ne "NameNotFoundException".
Die jndi.properties Datei befindet sich bei mir in dem Verzeichnis, von dem aus meine Anwendung gestartet wird und ist nun folgendermaßen konfiguriert.

Code: Alles auswählen

java.naming.provider.url=tcp://localhost:61616

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

connectionFactoryNames = Beispieltopic, queueConnectionFactory, topicConnectionFactry


# register some queues in JNDI using the form
# queue.[jndiName] = [physicalName]
queue.jms.Queue = PhysicalQueue


# register some topics in JNDI using the form
# topic.[jndiName] = [physicalName]
jms.Topic = PhysicalTopic 
 

ActiveMQ hatte ich auch immer gestartet. Trotzdem scheint die properties-Datei irgendwie ignoriert zu werden.
Kann mir da jemand weiterhelfen?

Benutzeravatar
viktor
Windoof-User
Windoof-User
Beiträge: 26
Registriert: 7. Nov 2004 23:44

Beitrag von viktor »

Die properties kannst Du auch ohne zusaetzliches file einstellen:

Code: Alles auswählen

Properties env = new Properties();
env.setProperty("java.naming.factory.initial", "org.apache.activemq.jndi.ActiveMQInitialContextFactory");
env.setProperty("topic.whiteboard", "whiteboard");
InitialContext jndi = new InitialContext(env);
und spaeter holt sich jeder subscriber/publisher den topic:

Code: Alles auswählen

Topic whiteboard = (Topic)jndi.lookup("whiteboard");
Gruesse,
vik

rico
Windoof-User
Windoof-User
Beiträge: 37
Registriert: 25. Aug 2006 12:10

Beitrag von rico »

danke für die tipps.

bin jetz auch soweit, dass ein client ein topic kriegt. wie komm ich dann an die nachrichten ran? dazu brauchs ja irgendwie noch eine connection, aber da kommt dann entweder scheme vm not recognized und mit tcp klappts auch nicht, da kommt ein connectexception wenn ich die factory starte

AlexRW
Neuling
Neuling
Beiträge: 5
Registriert: 27. Mär 2007 20:58

Beitrag von AlexRW »

Hallo,
ich bekomme immer die gleiche Fehlermeldung:

Code: Alles auswählen

 
Exception in thread "main" java.lang.NoClassDefFoundError: edu/emory/mathcs/backport/java/util/concurrent/ConcurrentHashMap
        at org.apache.activemq.jndi.ActiveMQInitialContextFactory.getInitialContext(ActiveMQInitialContextFactory.java:63)
        at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:667)
        at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
        at javax.naming.InitialContext.init(InitialContext.java:223)
        at javax.naming.InitialContext.<init>(InitialContext.java:175)
        at Client.JMSClient.<init>(JMSClient.java:32)
        at tk1ex7.Tk1ex7App.main(Tk1ex7App.java:44)
Java Result: 1
obwohl ich alles so gemacht habe wie es in Dokumentation stand. Hier ist mein Code, kann mir jemand sagen was ich falsche mache?

Code: Alles auswählen

try {
            /*
            * Create a JNDI API InitialContext object.
            */
            
            Properties props = new Properties();
            props.setProperty(Context.INITIAL_CONTEXT_FACTORY,"org.apache.activemq.jndi.ActiveMQInitialContextFactory");
            props.setProperty(Context.PROVIDER_URL,"tcp://localhost:61616");
            jndiContext = new InitialContext(props);
            
           // lookup the connection factory
            javax.jms.TopicConnectionFactory factory = (javax.jms.TopicConnectionFactory)jndiContext.lookup("dynamicQueues/FOO.BAR");
            // create a new TopicConnection for pub/sub messaging
            javax.jms.TopicConnection conn = factory.createTopicConnection();
            // lookup an existing topic
            javax.jms.Topic mytopic = (javax.jms.Topic)jndiContext.lookup("whiteboard");
            // create a new TopicSession for the client
            javax.jms.TopicSession session = conn.createTopicSession(false,TopicSession.AUTO_ACKNOWLEDGE);
            // create a new subscriber to receive messages
            javax.jms.TopicSubscriber subscriber = session.createSubscriber(mytopic);
        } catch (Exception e) {
            System.out.println("Could not create JNDI API " +
            "context: " + e.toString());
            System.exit(0);
        }

Benutzeravatar
viktor
Windoof-User
Windoof-User
Beiträge: 26
Registriert: 7. Nov 2004 23:44

Beitrag von viktor »

es waere hilfreich wenn du genau Tk1ex7App.java:44 pastest :) NoClassDefFoundError ist ziemlich eindeutig - der class loader findet irgendeine klasse nicht.
sonst sieht der factory lookup komisch aus. probier es so:

Code: Alles auswählen

TopicConnectionFactory conFactory = (TopicConnectionFactory)jndi.lookup("TopicConnectionFactory");

AlexRW
Neuling
Neuling
Beiträge: 5
Registriert: 27. Mär 2007 20:58

Beitrag von AlexRW »

viktor

Ich bekomme diese Fehlermeldung wenn ich

Code: Alles auswählen

jndiContext = new InitialContext(props); 
ausführe. Bis Topik komme ich nicht weiter.

rico
Windoof-User
Windoof-User
Beiträge: 37
Registriert: 25. Aug 2006 12:10

Beitrag von rico »

kannst du mal posten, wie du dann von der connectionfactory auf den producer/consumer bzw publisher/subscriber kommst?

wenn ich connFact.createConnection() mache bin ich wieder bei dem Problem mit dem locked journal :-/

Benutzeravatar
klospatz
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 230
Registriert: 16. Dez 2003 14:01
Wohnort: Darmstadt
Kontaktdaten:

Beitrag von klospatz »

ist vielleicht ein wenig spaet, aber ich habe die aktuelle aufgabe auch erst gestern gemacht. zum schnellen einstieg hat mir google's erster treffer nach 'jms example' geholfen. deren codeschnipsel auf activemq zugeschneidert ergibt:

Code: Alles auswählen

package de.tud.tk1.p7;

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

import org.apache.activemq.ActiveMQConnectionFactory;

import java.io.*;
import java.util.Properties;

public class Test implements javax.jms.MessageListener {
	private TopicSession pubSession;
	private TopicSession subSession;
	private TopicPublisher publisher;
	private TopicConnection connection;
	private String username;

	public Test(String topicName, String username, String password)
			throws Exception {
		ActiveMQConnectionFactory conFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
		TopicConnection connection = conFactory.createTopicConnection(username,
				password);
		TopicSession pubSession = connection.createTopicSession(false,
				Session.AUTO_ACKNOWLEDGE);
		TopicSession subSession = connection.createTopicSession(false,
				Session.AUTO_ACKNOWLEDGE);
		Topic chatTopic = pubSession.createTopic(topicName);
		TopicPublisher publisher = pubSession.createPublisher(chatTopic);
		TopicSubscriber subscriber = subSession.createSubscriber(chatTopic);
		subscriber.setMessageListener(this);
		set(connection, pubSession, subSession, publisher, username);
		connection.start();
	}

	public void set(TopicConnection con, TopicSession pubSess,
			TopicSession subSess, TopicPublisher pub, String username) {
		this.connection = con;
		this.pubSession = pubSess;
		this.subSession = subSess;
		this.publisher = pub;
		this.username = username;
	}

	public void onMessage(Message message) {
		try {
			TextMessage textMessage = (TextMessage) message;
			String text = textMessage.getText();
			System.out.println(text);
		} catch (JMSException jmse) {
			jmse.printStackTrace();
		}
	}

	protected void writeMessage(String text) throws JMSException {
		TextMessage message = pubSession.createTextMessage();
		message.setText(username + " : " + text);
		publisher.publish(message);
	}

	public void close() throws JMSException {
		connection.close();
	}

	public static void main(String[] args) {
		try {
			Test chat = new Test("coolTopic", "someUser", "somePass");
			BufferedReader commandLine = new java.io.BufferedReader(
					new InputStreamReader(System.in));
			while (true) {
				String s = commandLine.readLine();
				if (s.equalsIgnoreCase("exit")) {
					chat.close();
					System.exit(0);
				} else
					chat.writeMessage(s);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
hth,
klospatz

Antworten

Zurück zu „Archiv“