2010-02-23 29 views
7

Ich kann nicht verstehen, wie ActiveMQ nicht lokal verwendet wird.
Angenommen, ich habe 2 Maschinen, die einige Nachrichten austauschen müssen.
Auf die auf der Maschine starten ich ActiveMQ Broker:Wie kann activemq nicht lokal verwendet werden?

> ~/bin/activemq 

und verwenden Sie so etwas wie:

javax.naming.Context ctx = new InitialContext(); 

    TopicConnectionFactory factory = (TopicConnectionFactory)ctx.lookup("connectionFactory"); 
    conn = factory.createTopicConnection(); 

    TopicSession session = conn.createTopicSession(false,TopicSession.AUTO_ACKNOWLEDGE); 
    Topic topic = null; 
    try{ 
     topic = (Topic)ctx.lookup("MyTopic"); 
     System.out.println("MyTopic was found"); 
    }catch(NameNotFoundException nnfe){ 
     topic = session.createTopic("MyTopic"); 
     System.out.println("MyTopic was created"); 
    } 
    TextMessage textMessage = session.createTextMessage(); 
    TopicPublisher publisher = session.createPublisher(topic); 
    conn.start(); 

    textMessage.setText("My topic message number"); 
    publisher.publish(textMessage); 
    System.out.println("sendMessage2topic"); 

wo in jndi.properties ich habe:

java.naming.factory.initial = org.apache.activemq.jndi.ActiveMQInitialContextFactory 
java.naming.provider.url = tcp://localhost:61616 

Aber was soll ich erstellen auf der anderen Maschine zu diesem Thema abonnieren? Shoul Ich erstelle einen zweiten lokalen ActiveMQ-Broker auf der zweiten Maschine und wie abonniere ich das Remote-Thema auf der ersten Maschine?

Antwort

6

Diese Linie ...

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

... sagt Ihr connectionFactory mit der Loopback-Schnittstelle zu verbinden. Sie können hier die Adresse des entfernten Brokers angeben.

In diesem Fall wird Ihr Snippet eine Nachricht an den Remote Broker senden. Jetzt ist es Sache des Maklers, die Nachricht über die registrierten Teilnehmer (sowohl lokale als auch entfernte) zu verteilen.

In diesem Szenario kein Broker erstellt (weder lokal oder remote). Sie verbinden sich einfach mit dem bestehenden Broker. Natürlich können Sie auch einen lokalen Broker erstellen und ihn für das Weiterleiten von Nachrichten an den Remote-Broker konfigurieren (z. B. über den statischen/dynamischen Netzwerktransport oder das Peer-Netzwerktransportprotokoll). ActiveMQ bietet Ihnen viel von Integrationstopologien und Mustern - aber zuerst müssen Sie definieren, was Sie eigentlich erreichen möchten.

+0

Ist das nicht die URL, die die JNDI-Verbindung durchführt? Wäre die URL zur Verbindung mit dem Broker nicht in das ConnectionFactory-Objekt eingebettet? –

6

localhost: 61616 wird activeMQ nur auf der Loopback-Schnittstelle (127.0.0.1) abhören. Verwenden Sie stattdessen die IP des Geräts oder 0.0.0.0.

+0

ok, auf dem auf der Maschine verwenden, möchte ich die IP der ersten Maschine verwenden, aber Problem ist das gleiche wie zuvor: auf der zweiten Maschine, was soll ich verwenden? – rauch

+1

@rauch: Was ich meinte ist, dass in ActiveMQ ** Broker ** Konfigurationsdatei, im TransportConnector-Element tcp verwenden. URI-Attribut von TransportConnector sollte IP anstelle von localhost verwenden – Elister

+0

Nice one !! Ich habe "0.0.0.0" komplett vergessen. Auf diese Weise können Sie localhost auf dem Server verwenden und Sie können sich auch extern mit der IP des Servers verbinden! –

1

Sie müssen etwas wie unten verwenden. ersetzen Sie die IP-Adresse mit dem Ziel-IP Sie

java.naming.provider.url = tcp://172.16.202.168:61616 
Verwandte Themen