Skip to content

QBit that provides tables and processes to support user-defined SFTP imports and exports (via bulk-load reports)

Notifications You must be signed in to change notification settings

Kingsrook/qbit-sftp-data-integration

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

QBit: SFTP Data Integration

Overview

Note: This is one of the original QBit implementations - so, some of the mechanics of how it is loaded and used by an application are not exactly fully defined at the time of its creation... Please excuse any dust or not-quite-round wheels you find here!

This QBit provides tables and processes to implement an SFTP-based data integration, using QQQ's Bulk Load mechanism to allow users to define file import mappings, and user-defined Reports to define file exports.

The architecture of such an integration looks like:

  • Shared by both imports and exports:
    • User-defined records in an SFTPConnection table which define connection credentials
  • For imports:
    • User-defined records in an SFTPImportConfig table, which reference an SFTPConnection as the source of files to import and a BulkLoadProfile as the instructions on how and where to load file contents.
    • A table built on the QQQ SFTP-backend module, using the SFTPImportConfig table as its variant-options table, to serve as the source for files to be imported.
    • A process that syncs files from the file-source table to a file staging table, along with rows in the ImportFile table to track their status.
    • A process that executes the bulk load process, using the selected bulk load profile, against records in the ImportFile table, accessing file contents from the staging file-table.
  • For exports:
    • User-defined records in an SFTPExportConfig table, which reference an SFTPConnection as the destination to write files to, whose contents are generated by rendering a SavedReport (referencing data from any table in the application)
    • A table built on the QQQ SFTP-backend module, using the SFTPExportConfig table as its variant-options table, to serve as the destination for files to be imported.
    • A process that renders saved reports, writing their contents to the destination SFTP backend.

Usage

Pom dependency

<dependency>
    <groupId>com.kingsrook.qbits</groupId>
    <artifactId>qbit-sftp-data-integration</artifactId>
    <version>${TODO}</version>
</dependency>

Setup

Using this QBit follows the (evolving, but as of this time, standard) QBit Config + Produce pattern.

Required configs here are:

  • For your SFTP source file table:
    • Whether you want this QBit to define this table and its SFTP Backend, in which case, you would call this method on the Config object:
      • .withSourceFileTableConfig(ProvidedOrSuppliedTableConfig.provideTableUsingBackendNamed(SFTPImportSourceFileBackendMetaDataProducer.NAME))
    • Or if you want to define that table yourself and supply it to this QBit:
      • .withSourceFileTableConfig(ProvidedOrSuppliedTableConfig.useSuppliedTaleNamed("mySftpSourceFileTableName"))
  • Similarly, for Staging file table:
    • If you want this QBit to define this table - note that you will need to always supply your own backend name:
      • .withStagingFileTableConfig(ProvidedOrSuppliedTableConfig.provideTableUsingBackendNamed("myStagingFileBackendName"))
    • Or if you want to define that table yourself and supply it to this QBit:
      • .withStagingFileTableConfig(ProvidedOrSuppliedTableConfig.useSuppliedTaleNamed("myStagingFileTableName"))
  • For your SFTP destination file table:
    • Whether you want this QBit to define this table and its SFTP Backend, in which case, you would call this method on the Config object:
      • .withDestinationFileTableConfig(ProvidedOrSuppliedTableConfig.provideTableUsingBackendNamed(SFTPExportDestinationFileBackendMetaDataProducer.NAME))
    • Or if you want to define that table yourself and supply it to this QBit:
      • .withDestinationFileTableConfig(ProvidedOrSuppliedTableConfig.useSuppliedTaleNamed("mySftpDestinationFileTableName"))
  • The name of your instance's scheduler:
    • .withSchedulerName("myScheduler")

Optional configs include:

  • To enable public-key authentication to SFTP servers, you can load a private key into your application server's sftp-backend, loading it through an environment variable, whose name you can set in the config field: sftpPrivateKeyEnvVarName.
    • By convention, you may wish to set this config value to: SFTP_PRIVATE_KEY_PEM.
    • If this field is not set, then all SFTP connections will require password authentication.
  • A MetaDataCustomizerInterface<QTableMetaData> can be run against all tables produced by this QBit: .withTableMetaDataCustomizer(tableMetaDataCustomizer)
  • A ProcessTracerCodeReference, which will be used on scheduled jobs ran by this QBit, as in:
    • .withProcessTracerCodeReference(new QCodeReference(StandardProcessTracer.class))
  • If you add additional fields to the SFTPImportConfig and ImportFile tables (e.g., for record security locks), you need to tell the QBit to copy values from SFTPImportConfig records ImportFile records as they are built:
    • .withAdditionalFieldsToCopyFromSftpImportConfigToImportFile(Map.of("clientId", "clientId"))

A full Config & Produce flow then, in a MetaDataProducer<MetaDataProducerMultiOutput>, may look like:

public class ImportFileBulkLoadQBitMetaDataLoader extends MetaDataProducer<MetaDataProducerMultiOutput>
{
   @Override
   public MetaDataProducerMultiOutput produce(QInstance qInstance) throws QException
   {
      MetaDataProducerMultiOutput rs = new MetaDataProducerMultiOutput();

      MetaDataCustomizerInterface<QTableMetaData> tableMetaDataCustomizer = (instance, table) ->
      {
         // any customizations you may want on all tables
         return (table);
      };

      ImportFileBulkLoadQBitConfig SFTPDataIntegrationQBitConfig = new ImportFileBulkLoadQBitConfig()
         .withSourceFileTableConfig(ProvidedOrSuppliedTableConfig.provideTableUsingBackendNamed(SFTPImportSourceFileBackendMetaDataProducer.NAME))
         .withDestinationFileTableConfig(ProvidedOrSuppliedTableConfig.provideTableUsingBackendNamed(SFTPExportDestinationFileBackendMetaDataProducer.NAME))
         .withStagingFileTableConfig(ProvidedOrSuppliedTableConfig.provideTableUsingBackendNamed(SFTPImportStagingFileBackendMetaDataProducer.NAME))
         .withSchedulerName(QuartzSchedulerMetaDataProducer.NAME)
         .withTableMetaDataCustomizer(tableMetaDataCustomizer)
         .withProcessTracerCodeReference(new QCodeReference(StandardProcessTracer.class))
         .withAdditionalFieldsToCopyFromSftpImportConfigToImportFile(Map.of("clientId", "clientId"));

      new ImportFileBulkLoadQBitProducer()
         .withImportFileBulkLoadQBitConfig(SFTPDataIntegrationQBitConfig)
         .produce(qInstance);

      // any additional customizations you may want

      return (rs);
   }
}

Provides

Tables

  • sftpConnection - Defines a connection to an SFTP server.
  • sftpImportConfig - Defines the usage of an SFTP Server and a Bulk Load Config for loading files into records.
  • sftpExportConfig - Defines the usage of an SFTP Server and a saved Report for exporting data.
  • importFile - Records which track files imported from an SFTP server, as they are bulk loaded.
  • SFTPImportSourceFileTable - If so configured - SFTP-backed file-table, where files to be sync'ed and bulk-loaded come from.
  • SFTPExportDestinationFileTable - If so configured - SFTP-backed file-table, where exported reports are written to.
  • SFTPImportStagingFileTable - If so configured - Filesystem table, where files imported from an SFTP Import source are stored.

Processes

  • SFTPConnectionTester - Used to validate the setup of SFTP Connection records.
  • syncSFTPImportConfigScheduledJob - Table Sync process that manages Scheduled Job records for SFTPImportConfig records with a cron schedule.
  • SFTPImportFileSyncProcess - Sync files from an SFTP server source file table (as defined in an SFTP Import Config) to the staging table.
  • ImportFileBulkLoadProcess - Run the Bulk Load Process against ImportFile records and their corresponding file data.
  • RenderReportForSFTPExportProcess - Render a report, writing it to an SFTP server as specified in an SFTPExportConfig, on a cron schedule.

Dependencies

  • qqq-backend-module-filesystem >= 0.24.0 (for SFTP support)
  • An active Quartz scheduler in your QQQ instance, for running scheduled cron jobs, along with Scheduled Jobs table.
  • Meta-data objects produced by SavedBulkLoadProfileMetaDataProvider from qqq-backend-core.
  • Meta-data objects produced by SavedReportsMetaDataProvider from qqq-backend-core.

About

QBit that provides tables and processes to support user-defined SFTP imports and exports (via bulk-load reports)

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages