Pasos de Migración para IPF-2024.2.0

Pasos de Migración

MPS

Todos los proyectos que utilizan MPS los scripts de construcción deberán ser actualizados. Para hacer esto, abra el script de construcción en MPS al hacer clic en el archivo apropiado en el navegador:

2024 2 0 mps 1

Luego presione Ctrl+R y asegúrese de que 'incluir stub y modelos no relacionados con el proyecto seleccionados. Luego, ingrese 'icon dsl' en el menú desplegable y seleccione 'com.iconsolutions.dsl.dependencies'

2024 2 0 mps 2

Cuando se le solicite, acepte la importación del módulo.

2024 2 0 mps 3

Repita el proceso para 'com.iconsolutions.dsl.languages.

A continuación, en la sección de dependencias, añada una nueva línea (presione ENTER) y luego seleccione de 'com.iconsolutions.dsl.dependencies' en la autocompletación (presione Ctrl+Space).

2024 2 0 mps 4

En la sección de ubicación, utilice la función de autocompletar (presione Ctrl+Space) para seleccionar '$plugin_home', luego presione / y después seleccione nuevamente 'com.iconsolutions.dsl.dependencies' de la función de autocompletar.

2024 2 0 mps 5

Repita el proceso para 'com.iconsolutions.dsl.languages'. Entonces, sus dependencias deberían verse así:

2024 2 0 mps 6

Ahora, debería ver un error en su sección de solución para la compilación:

2024 2 0 mps 7

Para resolver, haga clic en el texto subrayado y presione Alt+Enter para abrir el popup de intenciones y seleccione 'Recargar Módulos Desde Disco'.

2024 2 0 mps 8

Eso debería resolver el error. Finalmente, debe regenerar el script de construcción. Para hacer esto, simplemente haga clic derecho en la solución de construcción en el navegador y seleccione 'Rebuild Solution'.

Ahora debería poder construir su proyecto a través de maven como de costumbre.

Actualizar pacs. 003 versión

El soportado pacs. 003 message type dentro de la IPF ISO20022 Modelo ha sido actualizado de pacs. 003.001.07 to pacs. 003.001.08.

Si su IPF solution incluye pacs. 003 mensajes, deberá realizar los siguientes cambios de tipo:

Versión 7 Tipo Versión 8 Tipo

com.iconsolutions.iso20022.datatypes. Address Type2Code

com.iconsolutions.iso20022.message.components.technical.address_type3_choice. Address Type3Choice

com.iconsolutions.iso20022.message.components.direct_debit_mandate.amendment_information_details11.Información Sobre La Modificación11

com.iconsolutions.iso20022.message.components.direct_debit_mandate.amendment_information_details13.Información Sobre La Modificación13

com.iconsolutions.iso20022.message.components.organisation.branch_and_financial_institution_identification5.Branch And Financial Institution Identification5

com.iconsolutions.iso20022.message.components.organisation.branch_and_financial_institution_identification6.Branch And Financial Institution Identification6

com.iconsolutions.iso20022.message.components.organisation_identification.branch_data2.Branch Data2

com.iconsolutions.iso20022.message.components.organisation_identification.branch_data3Branch Data3

com.iconsolutions.iso20022.message.components.cash_account.cash_account24.Cash Account24

com.iconsolutions.iso20022.message.components.cash_account.cash_account38.Cuenta De Efectivo38

com.iconsolutions.iso20022.message.components.charges.charges2.Charges2

com.iconsolutions.iso20022.message.components.charges.charges7.Cargos7

com.iconsolutions.iso20022.message.components.person_identification.contact_details2.Contact Details2

com.iconsolutions.iso20022.mensaje.componentes.identificación_personal.contacto4.Contacto4

com.iconsolutions.iso20022.message.components.person.date_and_place_of_birth. DateAndPlaceOfBirth

com.iconsolutions.iso20022.message.components.person.date_and_place_of_birth1.Fecha YLugar De Nacimiento1

com.iconsolutions.iso20022.message.components.date_time_period.date_period_details. DatePeriodDetails

com.iconsolutions.iso20022.message.components.technical.date_period2.Date Period2

com.iconsolutions.iso20022.message.components.direct_debit.direct_debit_transaction9.Direct Debit Transaction9

com.iconsolutions.iso20022.message.components.direct_debit.direct_debit_transaction10.Direct Debit Transaction10

com.iconsolutions.iso20022.message.components.direct_debit.información_transacción_debito_directo21.Información Transacción Debito Directo21

com.iconsolutions.iso20022.message.components.direct_debit.información_de_transacción_de_débito_directo24.Información De Transacción De Débito Directo24

com.iconsolutions.iso20022.message.components.organisation_identification.financial_institution_identification8.Financial Institution Identification8

com.iconsolutions.iso20022.message.components.organisation_identification.financial_institution_identification18.Identificación De Institución Financiera18

com.iconsolutions.iso20022.message.definitions.payments_clearing_and_settlement.pacs003.FITo FICustomer Direct Debit V07

com.iconsolutions.iso20022.message.definitions.payments_clearing_and_settlement.pacs003.FITo FICustomer Direct Debit V08

com.iconsolutions.iso20022.message.components.garnishment.garnishment1.Garnishment1

com.iconsolutions.iso20022.message.components.garnishment.garnishment3.Garnishment3

com.iconsolutions.iso20022.message.components.payment.group_header50.Group Header50

com.iconsolutions.iso20022.mensaje.componentes.pago.encabezado_grupo94Encabezado Grupo94

com.iconsolutions.iso20022.message.components.direct_debit_mandate.mandate_related_information11.Mandate Related Information11

com.iconsolutions.iso20022.message.components.direct_debit_mandate.mandate_related_information14.Mandate Related Information14

com.iconsolutions.iso20022.message.components.party_identification_information.name_and_address10.Nombre YDirección10

com.iconsolutions.iso20022.message.components.party_identification_information.name_and_address16.Nombre YDirección16

com.iconsolutions.iso20022.datatypes. Name Prefix1Code

com.iconsolutions.iso20022.datatypes. Name Prefix2Code

com.iconsolutions.iso20022.message.components.organisation_identification.organisation_identification8.Organisation Identification8

com.iconsolutions.iso20022.message.components.organisation_identification.organisation_identification29. Organisation Identification29

com.iconsolutions.iso20022.message.components.party_identification_information.party11_choice. Party11Choice

com.iconsolutions.iso20022.message.components.party_identification_information.party38_choice. Party38Choice

com.iconsolutions.iso20022.message.components.party_identification_information.party_identification43.Party Identification43

com.iconsolutions.iso20022.message.components.party_identification_information.party_identification135.Party Identification135

com.iconsolutions.iso20022.message.components.payment_identification.payment_identification3.Payment Identification3

com.iconsolutions.iso20022.message.components.payment_identification.payment_identification7.Payment Identification7

com.iconsolutions.iso20022.message.components.payment_processing.payment_type_information25.Payment Type Information25

com.iconsolutions.iso20022.message.components.payment_processing.payment_type_information27.Payment Type Information27

com.iconsolutions.iso20022.message.components.person_identification.person_identification5.Person Identification5

com.iconsolutions.iso20022.message.components.person_identification.person_identification13.Person Identification13

com.iconsolutions.iso20022.message.components.postal_address.postal_address6.Postal Address6

com.iconsolutions.iso20022.message.components.postal_address.postal_address24Postal Address24

com.iconsolutions.iso20022.message.components.document.remittance_information11.Remittance Information11

com.iconsolutions.iso20022.message.components.document.remittance_information16.Remittance Information16

com.iconsolutions.iso20022.message.components.contact_point.remittance_location4.Remittance Location4

com.iconsolutions.iso20022.message.components.contact_point.remittance_location7.Remittance Location7

com.iconsolutions.iso20022.message.components.contact_point.remittance_location_details1.Remittance Location Details1

com.iconsolutions.iso20022.message.components.contact_point.remittance_location_data1.Remittance Location Data1

com.iconsolutions.iso20022.message.components.cash_settlement.settlement_instruction2.Settlement Instruction2

com.iconsolutions.iso20022.message.components.cash_settlement.settlement_instruction8.Settlement Instruction8

com.iconsolutions.iso20022.message.components.document.structured_remittance_information13.Información De Remesa Estructurada13

com.iconsolutions.iso20022.message.components.document.structured_remittance_information16.Información De Remesas Estructurada16

com.iconsolutions.iso20022.message.components.tax.tax_amount1.Tax Amount1

com.iconsolutions.iso20022.message.components.tax.tax_amount2.Tax Amount2

com.iconsolutions.iso20022.message.components.tax.tax_information4.Tax Information4

com.iconsolutions.iso20022.message.components.tax.tax_information7.Tax Information7

com.iconsolutions.iso20022.message.components.tax_period.tax_period1.Tax Period1

com.iconsolutions.iso20022.message.components.tax_period.tax_period2.Tax Period2

com.iconsolutions.iso20022.message.components.tax_record.tax_record1.Tax Record1

com.iconsolutions.iso20022.message.components.tax_record.tax_record2.Tax Record2

com.iconsolutions.iso20022.message.components.tax.tax_record_details1.Tax Record Details1

com.iconsolutions.iso20022.message.components.tax.tax_record_details2.Tax Record Details2

Al comparar el pacs. 003.001.07 y pacs. 008.001.08 En los XSD, usted notará que se han añadido o eliminado un pequeño número de campos. Como resultado, puede que necesite realizar cambios en su código más allá de los cambios de tipo mencionados anteriormente. Por ejemplo, si anteriormente pobló un campo que ahora ha sido eliminado.

Migrando a EVENT_STREAM_PER_FLOW flujos

Para apoyar el despliegue de nuevas versiones de flujo a través de rolling upgrades de sus servicios de orquestación, todos los journal processor s definidos por el servicio deben ser cambiados para utilizar EVENT_STREAM_PER_FLOW como su event-streaming-type.

Antes de que pueda realizar el cambio de configuración, sin embargo, deberá reducir su implementación de servicio a cero y ejecutar una migración similar a la que se especifica a continuación.

// all the unique flows in your service, as indicated by the
// `ipf.behaviour.event-processor.flows` configuration property
let flows = [
    "moduleA. FlowAV1",
    "moduleA. FlowAV2",
    "moduleB. FlowBV5",
    "moduleC. FlowBV10"
]

db.getCollection("mongoOffset")
    .find({"_id.tag": /tag-.+/})
    .forEach(doc => {
        flows.forEach(flow => {
            let flowTag = JSON.parse(JSON.stringify(doc));
            flowTag.offset.objectId = doc.offset.objectId;
            flowTag._id.tag = doc._id.tag.replace("tag", flow);

            try {
                db.getCollection("mongoOffset").insertOne(flowTag);
            } catch (e) {
                console.log(e)
            }
        });
    });
Es imperativo que usted liste todos los flujos presentes en la versión actual de su servicio de orquestación. Cualquier flujo que se pierda tendrá todos sus events reprocesado por el journal processor, que puede causar duplicados notifications a ser enviado a la customers, métricas incorrectas que aparecen en los paneles de control o simplemente causan una desaceleración masiva en el procesamiento de nuevos domain events ya que el procesador comenzará desde el principio del diario.

Para obtener la lista correcta de flujos activos, puede ejecutar el siguiente comando curl contra una instancia de su servicio de orquestación:

curl your_service_host:port/actuator/info | jq | grep "ipf.behaviour.event-processor.flows"

Alternativamente, puede ejecutar el siguiente fragmento de prueba desde dentro del módulo que contiene el servicio de su SpringBootApplication-- la salida será el script de migración que debe ejecutar contra su base de datos.

import com.typesafe.config. ConfigFactory;
import org.junit.jupiter.api. Test;
import java.util.stream. Collectors;

public class MigrationGenerator {

    @Test
    void generateMigration() {
        var flowsAsJsArray = ConfigFactory.parseResources("ipf-impl.conf")
                .withFallback(ConfigFactory.parseResources("ipf.conf"))
                .withFallback(ConfigFactory.defaultReference())
                .resolve()
                .getStringList("ipf.behaviour.event-processor.flows")
                .stream().distinct()
                .map("\"%s\""::formatted)
                .collect(Collectors.joining(",\n ", "let flows = [\n ", "\n]\n"));

        var migrationScriptWithoutFlows = """
                db.getCollection("mongoOffset")
                    .find({"_id.tag": /tag-.+/})
                    .forEach(doc => {
                        flows.forEach(flow => {
                            let flowTag = JSON.parse(JSON.stringify(doc));
                            flowTag.offset.objectId = doc.offset.objectId;
                            flowTag._id.tag = doc._id.tag.replace("tag", flow);
                            try {
                                db.getCollection("mongoOffset").insertOne(flowTag);
                            } catch (e) {
                                console.log(e)
                            }
                        });
                    });
                """;

        System.out.println(flowsAsJsArray);
        System.out.println(migrationScriptWithoutFlows);
    }
}

Migrando a ODS Inquiry API V2

  • Detalles de versiones y la V2 completa ODS Inquiry API La guía de migración se puede encontrar en el ODS API versioning visión general página

    Es importante señalar que un cambio de configuración DEBE aplicarse si ya está utilizando los conectores de cliente V1 y no desea migrar inmediatamente a los conectores de cliente V2. Su configuración debe actualizarse para anular la configuración de la versión del conector de cliente de la siguiente manera:`ods.inquiry.client.version=1`
    Esto asegurará que sus conectores de cliente V1 actuales permanezcan habilitados y no será necesario un cambio de código. Consulte Consulta V1 API documentación del cliente para más información sobre el cliente V1 APIs que se puede habilitar.

Migrando a la última test framework

Ha habido cambios menores en las estructuras de los paquetes en el test framework. 'ipf-test-fw-core' ahora se ha trasladado a 'ipf-test-fw-caja blanca'.
El test-fw-extensions-xxx han sido eliminados del paquete principal para asegurar que las extensiones no requeridas no se carguen siempre. Como consecuencia, las implementaciones de prueba que dependían de estas dependencias ahora deberán declararlas explícitamente. Estas se enumeran a continuación y generalmente son requeridas al utilizar uno de los proporcionados.message transport ers:
  • test-fw-extensiones-http

  • test-fw-extensiones-kafka

  • test-fw-extensiones-jms

Jackson cambio en el comportamiento de serialización

Tenga en cuenta que como resultado de la actualización Jackson to 2.17.x (actualizando Spring Boot 3.3.x), Jackson ya no está serializando objetos cuyos miembros son todos nulos. Por ejemplo, en IPF 2024.1 y más viejo un objeto que se ve así:

{
    "myObject": {
        "someKey": "someValue",
        "someBlankParent": {}
    }
}

Ahora se serializará (y deserializará) de la siguiente manera:

{
    "myObject": {
        "someKey": "someValue"
    }
}

(i.e.someBlankParent ahora está totalmente ausente en lugar de ser una cáscara vacía)

Esto podría presentarse como un NullPointerException donde las comprobaciones nulas asumían que había una estructura vacía como un objeto padre, cuando uno ya no existe. La solución es agregar una verificación nula al objeto padre también.

Tenga en cuenta que no se está perdiendo ningún dato, ya que los objetos que no se están serializando estaban vacíos desde el principio. Cualquier padre el objeto que contiene al menos un valor será serializado junto con sus miembros portadores de datos.

Colección de TransactionCacheEntry-cambio en los nombres de índice

Hubo un cambio en los nombres de índice que deben ser creados para transactionCacheEntry.mongodb colección (si no se crean y la creación de índices está habilitada).

  • findByTypeAndHashIndex se renombra a hash_1_type_1

  • findByTypeAndHashAndMessageIdIndex se renombra a hash_1_type_1_message Id_1.

Si su mongodb ya tiene esos índices con nombres antiguos, usted obtendrá este error en el registro:

TransactionCacheIndexInitialiser.accept - Failed to ensure index on TransactionCacheEntry
org.springframework.data.mongodb. UncategorizedMongoDbException: Command failed with error 85 (IndexOptionsConflict): 'Index already exists with a different name: findByTypeAndHashIndex' on server

Si desea corregir este error, renombre los índices existentes con nuevos nombres.