Uso de Apache Camel, Smooks y Flatpack
-
30-10-2019 - |
Pregunta
Estoy escribiendo una ruta usando Camel y Smooks, con el productor como un repositorio JPA que produce una lista de objetos JPA, que necesito enviar a un servidor SFTP como un archivo de ancho fijo.
Esto es lo que creo que se requiere para que esto ocurra
- El repositorio que usa JPA para producir una lista de objetos (tengo esto)
- Un mapeo Smooks to Flatpack que toma la versión XML de la lista mencionada anteriormente, y la transforma en un archivo de ancho fijo
- Una ruta de camello que comienza con el repositorio y termina con el archivo que se envía a través de SFTP:
Aquí está el código que tengo para esto:
public class RetirementRoute extends RouteBuilder {
@Override
public void configure() throws Exception {
onException(Throwable.class)
.maximumRedeliveries(3)
.useExponentialBackOff()
.backOffMultiplier(4)
.logRetryAttempted(true)
.handled(true)
.log(LoggingLevel.ERROR, "Error transmitting file to miliman")
.to("log:org.fuwt?level=ERROR&showAll=true");
//define the fixed width mapping
FlatpackDataFormat df = new FlatpackDataFormat();
df.setDefinition(new ClassPathResource("META-INF/smooks/fuintegration/retirement-fixed-width-mapping.xml"));
df.setFixed(true);
df.setIgnoreFirstRecord(false);
from("bean:retirementRepository?method=getRetirementMembers")
.to("log:org.fuwt?level=INFO")
.transacted("CRM_PROPAGATION_REQUIRED")
.routeId("retirement_member_exchange")
.aggregate(property("CamelCreatedTimestamp"), new RetirementAggregationStrategy()).completionFromBatchConsumer()
.marshal(df).log("log:org.fuwt?level=ERROR&showAll=true")
.to("file://Users/smohamed/tests/?fileName=marshal.test.txt");
}
}
Sin embargo, cuando ejecuto una prueba unitaria, recibo el siguiente error:
ArrayList cannot be converted to RetirementMember
Lo que creo que significa que Flatpack no sabe qué hacer con la lista, y necesita trabajar por objeto por objeto.
Por lo tanto, lo que estoy buscando es un mapeo de Smooks similar a la plantilla de Freemaker, pero en lugar de una plantilla Freemaker, quiero usar las definiciones de columnas de Flatpack:
<?xml version='1.0'?>
<!DOCTYPE PZMAP SYSTEM "flatpack.dtd" >
<PZMAP>
<COLUMN name="ssn" length="11" />
<COLUMN name="lastName" length="20" />
<COLUMN name="firstName" length="15" />
</PZMAP>
¿Cuál es la mejor manera de hacerlo? No hay mucha documentación disponible y he estado buscando semanas
Gracias
Sam
No hay solución correcta