es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

“Programador de tareas Quartz con múltiples inquilinos”

Tengo una aplicación backend de Spring Boot que tiene un programador de Quartz con múltiples activadores de trabajos funcionando correctamente, pero ahora tenemos un nuevo cliente que desea la misma solución exacta. Para brindarle soporte, elegimos multiinquilino mediante el enfoque de ESQUEMA SEPARADO, por lo que cada cliente/inquilino ahora tendrá su propio esquema. Sin embargo, no estoy seguro de cómo hacer que Quartz funcione en cada esquema de forma individual.

Cualquier ayuda será muy apreciada.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para tener Quartz funcionando en cada esquema individualmente, puedes configurar Quartz para que use una conexión de base de datos diferente por inquilino. Esto se puede hacer creando un nuevo origen de datos para cada inquilino, y configurando Quartz para que use el origen de datos relevante según el inquilino actual.

    En tu aplicación Spring Boot, puedes usar la clase AbstractRoutingDataSource de Spring para administrar los diferentes orígenes de datos. Esta clase te permite dirigir las solicitudes de base de datos al origen de datos correcto según una clave que establezcas para cada inquilino.

    Para implementar esto, puedes crear una implementación personalizada de AbstractRoutingDataSource que establezca la clave del origen de datos según el inquilino actual. Luego puedes usar este origen de datos en tu configuración de Quartz para asegurarte de que cada inquilino tenga su propio planificador de Quartz funcionando en su propio esquema.

    Aquí tienes un ejemplo aproximado de cómo podría verse:

    public class MultiTenantDataSource extends AbstractRoutingDataSource {
      @Override
      protected Object determineCurrentLookupKey() {
        // Devuelve la clave del origen de datos para el inquilino actual
        return TenantContext.getCurrentTenant();
      }
    }
    
    @Configuration
    public class QuartzConfig {
      @Autowired
      private DataSourceProperties dataSourceProperties;
    
      @Bean
      public SchedulerFactoryBean scheduler() throws IOException {
        SchedulerFactoryBean factory = new SchedulerFactoryBean();
        factory.setDataSource(quartzMultiTenantDataSource());
        factory.setAutoStartup(true);
        factory.setSchedulerName("multiTenantScheduler");
        // Otra configuración de Quartz
        return factory;
      }
    
      @Bean
      public DataSource quartzMultiTenantDataSource() {
        // Crea un nuevo origen de datos para cada inquilino
        Map<object, object=""> targetDataSources = new HashMap<>();
        for (Tenant tenant : tenants) {
          DataSourceProperties properties = new DataSourceProperties();
          properties.setUrl(tenant.getDatabaseUrl());
          properties.setUsername(tenant.getUsername());
          properties.setPassword(tenant.getPassword());
          targetDataSources.put(tenant.getId(), properties.initializeDataSourceBuilder().build());
        }
        MultiTenantDataSource dataSource = new MultiTenantDataSource();
        dataSource.setTargetDataSources(targetDataSources);
        return dataSource;
      }
    }
    

    En este ejemplo, creamos un nuevo origen de datos para cada inquilino y configuramos Quartz para que use el origen de datos multi-inquilino. La clave del origen de datos se establece según el inquilino actual utilizando una variable de contexto ligada al hilo (TenantContext). Esto nos permite cambiar fácilmente entre inquilinos al procesar trabajos de Quartz.

    Ten en cuenta que este es solo un ejemplo aproximado y deberás adaptarlo a tus necesidades específicas. También deberás asegurarte de que el esquema de tu base de datos esté configurado correctamente para el multiinquilino, y que cada inquilino tenga los permisos correctos para acceder a su propio esquema.</object,>

Comments are closed.