Dans certains projets, ouvrir un ActiveMQ séparément est parfois un peu fastidieux pour la mise en œuvre du projet. Nous intégrons donc ActiveMQ dans Tomcat, et ActiveMQ est démarré en même temps que Tomcat. À partir de là, nous devons maîtriser trois points de connaissances importants
BrokerService dans ActiveMQ
Configuration du servlet à démarrage automatique
Utilisez jconsole pour comprendre l'état d'exécution d'ActiveMQ intégré
Ajouter une dépendance ActiveMQ dans pom.xml. , N'oubliez pas que activemq-core
suffit.
<dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-core</artifactId> <version>5.7.0</version> </dependency>
Lors de l'écriture du code BrokerService
, faites attention à trois points principaux
Si les informations de surveillance doivent être affichées dans jconsole
broker.setUseJmx(true)
Définir le nom d'utilisateur et le mot de passe de connexion, comment utiliser le plug-in de vérification
S'il faut persister, paramètres d'emplacement de stockage, configuration de persistance
Vous devez donc démarrer une adresse de connexion tcp://localhost:61616
, le nom d'utilisateur est admin
, le mot de passe est admin
, il doit être conservé, l'adresse de stockage du persistant Le fichier de données est /activemq
, et vous devez démarrer le BrokerService surveillé par jconsole
Le code est le suivant :
// 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();
Dans ActiveMQ, il y a deux méthodes générales de livraison des messages
Queue , prend en charge la persistance des messages et les messages non consommés existeront toujours après le redémarrage. S'il y a plusieurs consommateurs, en partant du principe d'extraire un message à la fois, tous les consommateurs partageront les sujets du message
dans la file d'attente de la même manière. La persistance des messages n'est pas prise en charge de manière égale, et les messages non consommés. sera Les messages sont perdus après le redémarrage. S'il y a plusieurs consommateurs, chaque consommateur consomme à tour de rôle tous les messages du sujet
Que ce soit écrit par le producteur ou le code du consommateur, il y en a principalement 4 étapes
Établir une connexion, utiliser la méthode failover:()
, se déconnecter et se reconnecter automatiquement
Établir Session
, obtenir l'envoi ou cible de réceptionDestination
, précisez s'il s'agit d'une file d'attente (session.createQueue(queueName)
) ou d'un sujet (session.createTopic(topicName)
)
Obtenez le producteur ou le consommateur via Session
Produire ou consommer des messages
Nous écrivons maintenant un code producteur et une boucle pour générer 10 messages
// 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); }
Écrire un consommateur pour consommer les 10 messages ci-dessus Message
// 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(); } } });
Effet de l'opération
On peut voir que les 10 messages générés par notre producteur ont été traités avec succès par le consommateur .
Pour ActiveMQ intégré, vous devez définir broker.setUseJmx(true) avant de démarrer BrokerService ; puis recherchez votre JAVA_HOME, passez à bin et entrez la commande jconsole.
Après le démarrage de jconsole, sélectionnez le processus où se trouve ActiveMQ. Après la connexion, sélectionnez l'onglet Mbean
Les cases rouges indiquent respectivement le nombre de messages qui ont été consommés et ceux qui sont entrés dans MQ. Sélectionnez l'opération, recherchez le SendTextMessage et vous pouvez également envoyer des messages à cette file d'attente.
Pour Tomcat et Selvelt après Tomcat7, la valeur >=0 signifie que plus la valeur est petite, plus la priorité est élevée 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代码 } }
, et il y a eu un conflit de journal slf4j. L'utilisation de activemq-broker
n'a toujours pas résolu le problème. En fin de compte, s'appuyer uniquement sur activemq-all
résout parfaitement tous les problèmes. exclusions
activemq-core
Articles associés :
Articles associés :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!