2011-09-13 26 views
5

Estoy creando un archivo XML muy grande (700mb +) que procesa grandes cantidades de datos por lotes. El programa sirve como una interfaz entre una base de datos sybase extremadamente grande y una aplicación. Actualmente tengo el esquema xsd vinculado a las clases. Necesito una forma de poder escribir el XML con la lógica de reinicio en mente.Java JAXB - Escritura de archivos XML con lógica de reinicio

I.E. poder saber dónde lo dejé. O en otras palabras, si el programa falla, necesito poder ver lo que fue la última vez que escribí en el archivo XML para que pueda reanudar donde lo dejé. Aquí hay un ejemplo.

<root> 
    <WorkSet> 
    <Work> 
     <Customer> 
    <Work> 
     <Customer> 
    <WorkSet> 
    <Work> 
     ..... 
<root> 

Digamos que el programa falla después de escribir un nodo de escritura de 'trabajo' o 'workset'. ¿Hay alguna manera de retomar el procesamiento donde lo dejé? Estoy intentando evitar volver a leer el archivo XML en la memoria debido al tamaño de corte del archivo XML (Digamos que termina 500 MB de XML y falla).

Gracias por la ayuda.

Respuesta

3

Si puede dividir sus datos en elementos WorkSet independientes, puede escribirlos de uno en uno con el modo de fragmento JAXB (cuando JAXB no escribe los encabezados). Más tarde, simplemente concatenar los archivos y agregar la declaración XML faltante, abriendo las etiquetas de cierre.

Es posible que tenga que modificar sus clases generadas para esto. Me refiero a agregar @XmlRootElement a la clase Java WorkSet. Si un WorkSet todavía es grande para un paso, también puede hacerlo con Work, pero debe generar de alguna manera las etiquetas que faltan.

+0

+1 - Iba a sugerir algo en esta línea. –

+0

¿Agregaría la etiqueta @XmlRootElement a la clase Java WorkSet afecta la funcionalidad de un archivo XML grande después de la concatenación de múltiples WorkSets? Soy un poco nuevo JAXB, así que avíseme si no lo estoy entendiendo correctamente. – TyC

+1

No creo que agregar un '@ XmlRootElement' afecte su funcionalidad anterior. Sin agregar el '@ XmlRootElement' el' Marshaller.marshal() 'arroja la siguiente excepción:' com.sun.istack.SAXException2: no se puede ordenar el tipo "org.package.MyWorkSet" como un elemento porque le falta un @ Anotación XmlRootElement'. – palacsint

2

No creo JAXB es la herramienta adecuada para este trabajo, pero ...

Se podría escribir una aplicación personalizada Marshaller que realiza un seguimiento de lo que los objetos han sido movilizados y utilizar el modo de fragmento para escribir objetos individuales

+0

+1 JAXB no suena como la herramienta correcta aquí. ¿Por qué no utilizar simplemente utilizar un analizador SAX y puede rastrear dónde se encuentra en el archivo usted mismo. Eche un vistazo a StAX por ejemplo ... http://stax.codehaus.org/Home – Brad