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
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
Ob Überwachungsinformationen in jconsole
broker.setUseJmx(true)
Legen Sie den Benutzernamen und das Passwort für die Verbindung fest, wie Sie das Verifizierungs-Plug-in verwenden
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();
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
Stellen Sie eine Verbindung her, verwenden Sie die failover:()
-Methode, trennen Sie die Verbindung automatisch und stellen Sie die Verbindung wieder her
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
Bringen Sie den Produzenten oder Verbraucher durch Session
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
Es ist ersichtlich, dass die 10 von unserem Produzenten generierten Nachrichten vom Verbraucher erfolgreich verarbeitet wurden.
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.
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“
. 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.
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
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!