Как сохранить экземпляр Thread в базе данных с помощью java

Это требование SAP PI,

  • Исходная система: XY_Client
  • Промежуточное ПО: PI System
  • Целевая система: SAP

XML-файлы передаются в систему PI, для каждого XML-файла создается внутренний файл для отслеживания store_number и количества xml-файлов.

Как это работает: предположим, что если XML_FILE_1 достигает PI, создается внутренний файл с именем sequence_gen. файл содержит номер магазина, представленный в файле XML, и счетчик будет инициализирован равным 1. поэтому в первый раз

sequence_gen file contains Store: 1001 Count:1
(после некоторого интервала времени)Если XML_FILE_2 достигает PI, второй раз,

sequence_gen file contains Store: 1001 Count:2 и так далее..

У меня такой вопрос: если в систему PI одновременно поступает 'n' файлов, первый файл заблокирует файл sequence_gen. так как же второй файл обновит значение в файле sequence_gen? Итак, как решить эту проблему?

Я подумал о создании экземпляра потока для каждого вызова и сохранении его в базе данных. и извлечение каждого экземпляра, выполнение функции, возврат результата в вызов xml и удаление этого экземпляра. Возможно ли это? Как продвигаться в этом?


person madhu    schedule 25.06.2015    source источник
comment
В чем именно проблема? Насколько я понимаю, после того, как файл 1 закончит обработку, система просто перейдет к файлу 2 (или тому, что пришло за это время). Это основы асинхронной обработки и блокировок.   -  person Buurman    schedule 25.06.2015
comment
@Buurman- предположим, если 100 файлов появятся одновременно, «t0».. Все 100 файлов будут пытаться получить доступ к файлу sequence_gen. так он не перейдет в состояние блокировки? останется ли обновленное значение в файле sequence_gen?   -  person madhu    schedule 25.06.2015
comment
Я ничего не знаю о конкретных приложениях, которые вы используете, поэтому я не могу комментировать их поведение, но: В общем, если у вас есть какой-то объект/последовательность/что-то, что является потокобезопасным, тогда да, он будет блокироваться при модификации и разблокируется после успешной модификации. Затем он будет содержать новое состояние, и появится следующий файл, который может продолжить обработку с новым состоянием для вашей последовательности. Это базовый параллелизм. Вы на самом деле пробовали свой сценарий, чтобы увидеть, правильно ли он работает?   -  person Buurman    schedule 25.06.2015
comment
@Buurman- Спасибо .. Итак, с помощью потока я могу заблокировать файл? и отпустите его. Я не пробовал этот сценарий, я могу проверить, только когда он идет в прямом эфире.   -  person madhu    schedule 25.06.2015


Ответы (1)


Вместо того, чтобы отслеживать все потоки, которые блокируют и разблокируют файл, вы можете иметь один поток, отвечающий за его изменение. Пусть каждый поток поместит запрос на изменение файла в параллельную очередь, которая затем уведомит поток Sequence_Gen о необходимости записи в свой собственный файл. По сути:

Поток Sequence_Gen:

@Override
public synchronized void Run(){
    while(true){ //Some condition
        while(queue.isEmpty()) { 
            this.wait();

        }
        Object obj = queue.pop();
        //Open file
        file.write(obj);
        //Close file
    }
}

Затем в любом другом потоке просто встаньте в очередь и уведомите, что есть что написать.

public synchronized void AddItem(Object item) {
    queue.put(item);
    this.notifyAll();
}
person rmcn96    schedule 25.06.2015