Может быть, вы можете попробовать декларативное потоковое сопоставление (DSM) библиотека. Это очень хорошо для обработки больших или сложных документов XML и JSON. Необходимо определить соответствие между данными класса end XML в файле YAML.
Например, допустим, у вас есть файл xml ниже:
<root>
<item >
<id>1</id>
<name>Item 1</name>
</item>
<item >
<id>2</id>
<name>Item 2</name>
<date>13/06/2019</date>
</item>
<item >
<id>3</id>
<name>Item 3</name>
<date>11/06/2019</date>
</item>
<!--
.........
-->
</root>
Определите отображение для данных, которые вы хотите обработать
result:
type: object // it will only store one item in memory.
path: /root/item # path is regex can be writen as "/.+item".
function: processData # call processData function for every item.
filter: self.index%params.threadCount==params.threadNo // you can write script to filter data.
fields:
id: long # id dataType long
name: # default dataType string
registerDate:
path: date
dataType: date # data type is date
dataTypeParams:
dateFormat: dd/MM/yyyy # date format
Напишите функцию для выполнения вашего данные и зарегистрируйте их в файле сопоставления, как показано выше.
FunctionExecutor processData = new FunctionExecutor() {
@Override
public void execute(Params params) {
System.out.println(params.getCurrentNode().getData());
}
};
// java 8+
//FunctionExecutor processData = params->System.out.println(params.getCurrentNode().getData());
Вот код java. Вы можете установить threadNo для каждого потока. Я предполагаю, что вы будете запускать код в 10 потоке. Для этого примера поток не равен 1. Это означает, что вы будете обрабатывать только элемент, который соответствует фильтр поле в файле отображения.
DSMBuilder builder = new DSMBuilder("path/to/mapping.yaml");
builder.registerFunction("processData ", processData); // register function
builder.getParams().put("threadCount", 10);
builder.getParams().put("threadNo", 1); // run for first thread
DSM dsm = builder.create();
// process json data
Object object = dsm.toObject("path/to/data.xml");