Introducción a ActiveMQ (3) -Soluciones integradas y de persistencia de mensajes

Uso avanzado de ActiveMQ uno, MQ integrado

En el desarrollo real, si el proyecto no proporciona demasiados recursos y ahora la empresa necesita usar MQ, puede considerar MQ integrado, MQ integrado no necesita instalar ActiveMQ, solo necesita importar dependencias relacionadas.

1. El archivo pom necesita importar la dependencia: (importe esta dependencia sobre la base de la dependencia de MQ en los dos artículos anteriores)

            <dependency>
	            <groupId>org.apache.activemq</groupId>
	            <artifactId>activemq-all</artifactId>
	            <version>5.14.5</version>
            </dependency>

2. Primero inicie un servicio MQ integrado, el código es el siguiente:

public class EmbedMQ {
	
	public static void main(String[] args) throws Exception {
		
        BrokerService brokerService = new BrokerService();
        brokerService.setBrokerName("EmbedMQ");
        brokerService.addConnector("tcp://localhost:62000");
        brokerService.setManagementContext(new ManagementContext());
        brokerService.start();
	}
}

3. Lado del productor:

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;

public class EmbedJmsProducter {
		//默认连接用户名
	    private static final String USERNAME= ActiveMQConnection.DEFAULT_USER;
	    //默认连接密码
	    private static final String PASSWORD= ActiveMQConnection.DEFAULT_PASSWORD;
	    //默认连接地址
	    private static final String BROKEURL= "tcp://localhost:62000";
	    //发送的消息数量
	    private static final int SENDNUM = 10;

	    public static void main(String[] args) {
	        ConnectionFactory connectionFactory;
	        Connection connection = null;
	        Session session;
	        Destination destination;
	        MessageProducer messageProducer;

	      connectionFactory= new ActiveMQConnectionFactory(USERNAME, PASSWORD, BROKEURL);
	        try {
	            connection = connectionFactory.createConnection();
	            connection.start();
	            session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
	            //destination = session.createQueue("HelloWAM");
	            destination = session.createTopic("EmbedMQ");
	            messageProducer = session.createProducer(destination);
	            for (int i = 0; i < SENDNUM; i++) {
	                String msg = "内置MQ" + i + " " + System.currentTimeMillis();
	                TextMessage message = session.createTextMessage(msg);
	                System.out.println("发送消息:" + msg);
	                messageProducer.send(message);
	            }
	            session.commit();
	        } catch (JMSException e) {
	            e.printStackTrace();
	        } finally {
	            if (connection != null) {
	                try {
	                    connection.close();
	                } catch (JMSException e) {
	                    e.printStackTrace();
	                }
	            }
	        }
	    }
}

Final del consumidor:

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;

public class EmbedJmsConsumer {
	
	 private static final String USERNAME = ActiveMQConnection.DEFAULT_USER;
     private static final String PASSWORD = ActiveMQConnection.DEFAULT_PASSWORD;
     private static final String BROKEURL = "tcp://localhost:62000";

     public static void main(String[] args) {
    	 ConnectionFactory connectionFactory;//连接工厂
    	 Connection connection = null;//连接
    	 Session session;//会话 接受或者发送消息的线程
    	 Destination destination;//消息的目的地
    	 MessageConsumer messageConsumer;//消息的消费者
    	 //实例化连接工厂
    	 connectionFactory = new ActiveMQConnectionFactory(USERNAME,PASSWORD, BROKEURL);
    	 try {
    		 //通过连接工厂获取连接
    		 connection = connectionFactory.createConnection();
    		 //启动连接
    		 connection.start();
    		 //创建session
    		 session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
    		 //创建一个连接HelloWorld的消息队列
    		 destination = session.createTopic("EmbedMQ");

    		 //创建消息消费者
    		 messageConsumer = session.createConsumer(destination);
    		 messageConsumer.setMessageListener(new MessageListener() {
    		   public void onMessage(Message message) {
    			 try {
    			System.out.println("Accept msg : "+ ((TextMessage) message).getText());
    				 } catch (JMSException e) {
    					 e.printStackTrace();
    				 }
    			 }
    		 });
    	 } catch (JMSException e) {
    		 e.printStackTrace();
    	 }
     }
}

4. Prueba

Primero inicie el servicio, inicie el consumidor y finalmente inicie el productor para enviar mensajes.

Uso avanzado de ActiveMQ dos, esquema de persistencia de mensajes:

En un entorno de producción, ActiveMQ puede bloquearse. Para garantizar que el mensaje no se pierda después de colgar, el mensaje debe persistir. ActiveMQ ofrece varias soluciones.

1. AMQ: Basado en el almacenamiento de archivos, tiene las características de velocidad de escritura rápida y fácil recuperación. Los mensajes se almacenan en archivos. El tamaño predeterminado del archivo es 32 M. Si el tamaño de un mensaje supera los 32 MB, este valor se debe establecer más grande. Cuando se hayan consumido todos los mensajes de un archivo almacenado, este archivo se marcará como borrable. En la siguiente fase de borrado, este archivo se borrará. AMQ se aplica a versiones anteriores a ActiveMQ5.3.

2. Almacenamiento de mensajes KahaDB: mejora la capacidad y capacidades de recuperación, y ahora es el método de almacenamiento predeterminado; KahaDB es un formulario de almacenamiento de base de datos local basado en archivos. Aunque no es tan rápido como AMQ, tiene una gran escalabilidad y el tiempo de recuperación es más rápido. que AMQ es corto, y KahaDB es el método de persistencia predeterminado desde la versión 5.4. Debido a que es el esquema de almacenamiento predeterminado, KahaDB se iniciará cuando se inicie ActiveMQ incluso sin ninguna configuración. En este caso, la ubicación del archivo es el subdirectorio / data / KahaDB en la ruta de instalación de ActiveMQ

3. Los mensajes de almacenamiento de mensajes JDBC se almacenan en base a JDBC, y los datos se almacenan en la base de datos; esta no es la configuración predeterminada, si desea usarla, debe configurar lo siguiente                                

修改配置文件  conf/ActiveMQ.xml 
1.将:  
      <persistenceAdapter>
	      <kahaDB directory="${activemq.base}/data/kahadb"/>
      </persistenceAdapter>
修改为:
      <persistenceAdapter>
          <jdbcPersistenceAdapter  dataSource="#mysql-ds "/>
      </persistenceAdapter>

2.在</broker>标签后,增加数据源的配置:

 <bean id="mysql-ds" class="org.apache.commons.dbcp2.BasicDataSource" 
   destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/activemq?relaxAutoCommit=true&amp;useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=UTC"/>
        <property name="username" value="****"/>
        <property name="password" value="****"/>
        <property name="poolPreparedStatements" value="true"/>
    </bean>
其中数据库名activemq需要在mysql中提前创建好,relaxAutoCommit=true这个属性必须要有,其他属性根据自身数据库信息及业务配置

放入必须的jar包
将 mysql 的驱动包放到ActiveMQ/lib 包下,启动ActiveMQ,如果报错,查看data/activemq.log 文件,可能是缺少其他jar包,我启动时报错,根据启动日志显示缺少commons-dbcp2-2.5.0.jar和commons-pool2-2.5.0.jar这两个包,同样导入到ActiveMQ/lib目录下,再次启动,启动成功

Verifique la base de datos y descubrió que hay tres tablas más

activemq_acks : se utiliza para almacenar relaciones de suscripción. Si es un tema persistente, la relación de suscripción entre el suscriptor y el servidor se almacena en esta tabla. Los campos principales de la base de datos son los siguientes: contenedor: el destino del mensaje sub_dest: si se usa un clúster estático, este campo contendrá información sobre otros sistemas en el clúster client_id: cada suscripción Cada usuario debe tener un id de cliente único para distinguir sub_name: suscriptor name selector: selector, puede elegir consumir solo mensajes que cumplan con las condiciones. Las condiciones se pueden implementar con atributos personalizados, que pueden admitir operaciones de múltiples atributos yyo last_acked_id: registre la identificación del mensaje consumido

activemq_lock : Solo es útil en un entorno de clúster. Solo un Broker puede obtener mensajes, llamado Master Broker. Los otros solo pueden usarse como copias de seguridad y esperar a que el Master Broker deje de estar disponible antes de convertirse en el próximo Master Broker. Esta tabla se utiliza para registrar qué Broker es el Master Broker actual.

activemq_msgs : se utiliza para almacenar mensajes, la cola y el tema se almacenan en esta tabla. Los campos de la base de datos principal son los siguientes: id: contenedor de clave primaria de base de datos autoincrementada: el destino del mensaje msgid_prod: la clave principal del cliente remitente del mensaje msg_seq: el orden de envío de mensajes, msgid_prod + msg_seq puede formar el id de mensaje de jms

 

Supongo que te gusta

Origin blog.csdn.net/csdnbeyoung/article/details/91345548
Recomendado
Clasificación