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:
Luego presione Ctrl+R y asegúrese de que la opción 'incluir modelos de stub y no pertenecientes al proyecto' esté seleccionada. Luego ingrese 'DSL from Icon' en el menú desplegable y seleccione 'com.iconsolutions.dsl.dependencies'.
Cuando se le solicite, acepte la importación del módulo.
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).
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.
Repita el proceso para 'com.iconsolutions.dsl.languages'. Entonces, sus dependencias deberían verse así:
Ahora, debería ver un error en la sección de su solución para la compilación:
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'.
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 debe poder construir su proyecto a través de maven como de costumbre.
Actualizar pacs.003 versión
El soportado pacs.003 tipo de mensaje dentro del IPF ISO20022 Modelo ha sido actualizado de pacs.003.001.07 a 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. Amendment Information Details11 |
com.iconsolutions.iso20022.message.components.direct_debit_mandate.amendment_information_details13. Amendment Information Details13 |
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. Cash Account38 |
com.iconsolutions.iso20022.message.components.charges.charges2. Charges2 |
com.iconsolutions.iso20022.message.components.charges.charges7. Charges7 |
com.iconsolutions.iso20022.message.components.person_identification.contact_details2. Contact Details2 |
com.iconsolutions.iso20022.message.components.person_identification.contact4. Contact4 |
com.iconsolutions.iso20022.message.components.person.date_and_place_of_birth. DateAndPlaceOfBirth |
com.iconsolutions.iso20022.message.components.person.date_and_place_of_birth1. Date And Place Of Birth1 |
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.direct_debit_transaction_information21. Direct Debit Transaction Information21 |
com.iconsolutions.iso20022.message.components.direct_debit.direct_debit_transaction_information24. Direct Debit Transaction Information24 |
com.iconsolutions.iso20022.message.components.organisation_identification.financial_institution_identification8. Financial Institution Identification8 |
com.iconsolutions.iso20022.message.components.organisation_identification.financial_institution_identification18. Financial Institution Identification18 |
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.message.components.payment.group_header94Group Header94 |
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. Name And Address10 |
com.iconsolutions.iso20022.message.components.party_identification_information.name_and_address16. Name And Address16 |
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. Structured Remittance Information13 |
com.iconsolutions.iso20022.message.components.document.structured_remittance_information16. Structured Remittance Information16 |
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 XSDs, usted notará que un pequeño número de campos han sido añadidos o eliminados. Como resultado, puede que deba 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 actualizaciones progresivas de sus servicios de orquestación, todos los procesadores de diario 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 eventos reprocesados por el procesador de registros, lo que puede causar que se envíen notificaciones duplicadas al customers, métricas incorrectas que aparecen en los paneles 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 visión general de versionado 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 al último marco de pruebas
| Ha habido cambios menores en las estructuras de paquetes en el marco de pruebas. 'ipf-test-fw-core' ahora se ha trasladado a 'ipf-test-fw-whitebox'. |
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 transportadores de mensajes proporcionados:
|
Jackson cambio en el comportamiento de serialización
Tenga en cuenta que como resultado de la actualización Jackson a 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 versiones anteriores, 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 que portan datos.
Colección de TransactionCacheEntry-cambio en los nombres de índice
Hubo un cambio en los nombres de los índices que deben ser creados para la colección transactionCacheEntry de mongodb (si no están creados 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 recibirá 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.