Heim  >  Artikel  >  Java  >  ActiveMQ in Tomcat einbetten: Drei wichtige Wissenspunkte müssen beherrscht werden

ActiveMQ in Tomcat einbetten: Drei wichtige Wissenspunkte müssen beherrscht werden

php是最好的语言
php是最好的语言Original
2018-08-03 14:34:172376Durchsuche

ActiveMQ eingebettet in Tomcat

In manchen Projekten ist das separate Öffnen eines ActiveMQ für die Projektumsetzung manchmal etwas umständlich. Also betten wir ActiveMQ in Tomcat ein und ActiveMQ wird gleichzeitig mit Tomcat gestartet. Daraus müssen wir drei wichtige Wissenspunkte beherrschen
  • BrokerService in ActiveMQ

  • Automatisch startende Servlet-Konfiguration

  • Verwenden Sie jconsole, um den Ausführungsstatus von eingebettetem ActiveMQ zu verstehen

1. Aktivieren Sie BrokerService

Fügen Sie eine ActiveMQ-Abhängigkeit in pom.xml hinzu , Denken Sie daran: activemq-core reicht aus.

<dependency>
    <groupId>org.apache.activemq</groupId>
    <artifactId>activemq-core</artifactId>
    <version>5.7.0</version>
</dependency>

Achten Sie beim Schreiben des BrokerService-Codes auf drei Hauptpunkte

  1. Ob Überwachungsinformationen in jconsolebroker.setUseJmx(true)

    angezeigt werden müssen
  2. Legen Sie den Benutzernamen und das Passwort für die Verbindung fest, wie Sie das Verifizierungs-Plug-in verwenden

  3. Ob beibehalten werden soll, Speicherorteinstellungen, Persistenzkonfiguration

Sie müssen also eine Verbindungsadresse tcp://localhost:61616 starten, der Benutzername ist admin, das Passwort ist admin, es muss beibehalten werden, die Speicheradresse der persistenten Datendatei ist /activemq, und Sie müssen den von jconsole überwachten Code von BrokerService wie folgt starten:

    // author:herbert qq:464884492
    BrokerService broker = new BrokerService();
    broker.setUseJmx(true); // 开启监控
    broker.setPersistent(true); // 持久化
    broker.setBrokerName("Test");
    SimpleAuthenticationPlugin sap = new SimpleAuthenticationPlugin();
    AuthenticationUser au = new AuthenticationUser("admin", "admin","users");
    ArrayList<AuthenticationUser> d = new ArrayList<AuthenticationUser>();
    d.add(au);
    sap.setUsers(d); // 用户验证
    broker.setPlugins(new BrokerPlugin[] { sap });
    String mqDataPath = "/activemq"; // 存储位置 
    broker.getPersistenceAdapter().setDirectory(new File(mqDataPath));
    broker.addConnector("tcp://localhost:61616"); // 连接地址
    broker.start();

2. Produzenten und Konsumenten

In ActiveMQ gibt es zwei allgemeine Nachrichtenübermittlungsmethoden

  • Warteschlange, die die Persistenz von Nachrichten unterstützt, nicht verbrauchte Nachrichten sind nach dem Neustart weiterhin vorhanden. Wenn mehrere Verbraucher vorhanden sind, teilen sich alle Verbraucher die Nachricht

  • gleichermaßen in der Warteschlange. Die Nachrichtenpersistenz wird nicht unterstützt und nicht verbrauchte Nachrichten wird sein. Nachrichten gehen nach dem Neustart verloren. Wenn mehrere Verbraucher vorhanden sind, verbraucht jeder Verbraucher nacheinander alle Nachrichten im Thema

Unabhängig davon, ob sie vom Produzenten- oder Verbrauchercode geschrieben wurden, gibt es hauptsächlich 4 Schritte

  1. Stellen Sie eine Verbindung her, verwenden Sie die failover:()-Methode, trennen Sie die Verbindung automatisch und stellen Sie die Verbindung wieder her

  2. Herstellen Session, erhalten Sie das Senden oder Empfangen ZielDestination , geben Sie an, ob es sich um eine Warteschlange (session.createQueue(queueName)) oder ein Thema (session.createTopic(topicName)) handelt

  3. Bringen Sie den Produzenten oder Verbraucher durch Session

  4. Nachrichten produzieren oder konsumieren

Wir schreiben jetzt einen Produzentencode und eine Schleife, um 10 Nachrichten zu generieren

 // author:herbert qq:464884492
String mqConnUrl = "tcp://localhost:61616";
String connUrl = "failover:(" + mqConnUrl.trim()+ ")?initialReconnectDelay=1000&maxReconnectDelay=30000";
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("admin","admin", connUrl);
javax.jms.Connection connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue("system");
MessageProducer messageProducer = session.createProducer(destination);

for (int i = 0; i < 10; i++) {
 javax.jms.TextMessage message = session.createTextMessage("ActiveMQ 发送的消息" + i);
 System.out.println("发送消息:" + "ActiveMQ 发送的消息" + i);
 messageProducer.send(message);
}

Schreiben Sie einen Verbraucher, der die 10 Nachrichten konsumiert oben

 // author:herbert qq:464884492
String mqConnUrl = "tcp://localhost:61616";
String connUrl = "failover:(" + mqConnUrl.trim()+ ")?initialReconnectDelay=1000&maxReconnectDelay=30000";
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("admin", "admin", connUrl);
javax.jms.Connection connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue("system");
MessageConsumer messageConsumer = session.createConsumer(destination);
messageConsumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(javax.jms.Message message) {
   ActiveMQTextMessage m = (ActiveMQTextMessage) message;
    try {
          System.out.println("接收到:" + m.getText());
         } catch (JMSException e) {
         e.printStackTrace();
        }
     }
});

Betriebseffekt

ActiveMQ in Tomcat einbetten: Drei wichtige Wissenspunkte müssen beherrscht werden

Es ist ersichtlich, dass die 10 von unserem Produzenten generierten Nachrichten vom Verbraucher erfolgreich verarbeitet wurden.

3. Überwachen Sie eingebettetes ActiveMQ

Für eingebettetes ActiveMQ müssen Sie „broker.setUseJmx(true)“ festlegen, bevor Sie BrokerService starten. Suchen Sie dann Ihr JAVA_HOME, wechseln Sie zu „bin“ und geben Sie den Befehl „jconsole“ ein.

ActiveMQ in Tomcat einbetten: Drei wichtige Wissenspunkte müssen beherrscht werden

Wählen Sie nach dem Start von jconsole den Prozess aus, in dem sich ActiveMQ befindet. Wählen Sie nach dem Herstellen der Verbindung die Registerkarte „Mbean“

ActiveMQ in Tomcat einbetten: Drei wichtige Wissenspunkte müssen beherrscht werden

. Die roten Kästchen zeigen die Anzahl der verbrauchten bzw. in MQ eingegebenen Nachrichten an. Wählen Sie den Vorgang aus, suchen Sie nach SendTextMessage und Sie können auch Nachrichten an diese Warteschlange senden.

4. Selvelt startet mit Tomcat

Für Tomcat- und Selvelt-Versionen nach Tomcat7 bedeutet der Wert >=0, dass ein Selbststart erforderlich ist loadOnStartup

 // author:herbert qq:464884492
@WebServlet(urlPatterns = "/initmq", loadOnStartup = 1)
public class InitMqServlet extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
        super.init(config);
        // 这里编写启动ActiveMQ代码
 }
}

5. Zusammenfassung

Dieses Mal wird ActiveMQ als Einstiegspunkt für die Verwendung der Nachrichtenwarteschlange verwendet. Das einzige Problem besteht darin, dass es sich zu sehr auf activeMQ und zu sehr auf jar

verlässt, was dazu führt, dass Nachrichten verbunden, aber nicht gesendet werden. Später habe ich es direkt in activemq-broker geändert und es gab einen SLF4J-Protokollkonflikt. Die Verwendung von activemq-all konnte das Problem immer noch nicht lösen. Am Ende löst nur das Verlassen auf exclusions alle Probleme perfekt. activemq-core

Verwandte Artikel:

Verwandte Artikel:


JMS-Nachrichtenpersistenz, ActiveMQ-Nachrichten in der MySQL-Datenbank beibehalten

Verstehen der Sitzungseinstellungen in ActiveMQ

Das obige ist der detaillierte Inhalt vonActiveMQ in Tomcat einbetten: Drei wichtige Wissenspunkte müssen beherrscht werden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn