Привет! Сложный вопрос для меня: как записать данные приходящие одновременно на RESTful Web-сервер от трех клиентов в 3 разные файла Excel?

Есть сервер и три смартфона, которые ПОЧТИ ОДНОВРЕМЕНО отсылают свои данные (координаты, время, id) на этот сервер. Как мне записывать эти данные в разные файлы, которые имеют названия по своему id телефона? Я догадываюсь, что надо синхронизировать этот процесс, но как? Я Spring boot начал изучать только по причине необходимости создания программы-сервера. Вот код Контроллера:

@RestController
public class GreetingController {
    Logger logger = LoggerFactory.getLogger(GreetingController.class);
    private static final String template = "Hello, %s!";
    private static final String templateMes = "latitude: %s, longitude: %s, altitude: %s, time: %s";
    private final AtomicLong counter = new AtomicLong();

    private int rowNum = 0;
    private String path = "D:\\Tatiana\\Documents\\Magistr\\2semestr\\resultsDatafromAndroid\\";
    private String nameBook;
    File file;

    @GetMapping("/greeting")
    public Greeting greeting(@RequestParam(value = "name", defaultValue = "World") String name) {
        return new Greeting(counter.incrementAndGet(), String.format(template, name));
    }

    @PostMapping(path = "/postmeasurment", consumes="application/json")
    public synchronized Greeting postMeasurment(@RequestBody MeasurmentResult myMes) {
        logger.info("received measurment from " + myMes.getId() + ":" + "\n\r time: " + myMes.getTime() +
                "\n\r latitude: " + myMes.getLatitude() + "\n\r longitude: " + myMes.getLongitude() + "\n\r altitude: " + myMes.getAltitude());

        function(myMes);

        return new Greeting(counter.incrementAndGet(),
                String.format(templateMes,
                        myMes.getLatitude(), myMes.getLongitude(),
                        myMes.getAltitude(), myMes.getTime(), myMes.getId()
                        ));
    }

    public void function(MeasurmentResult myMes){
            if (myMes.getId().equals("1_smartphone")) nameBook = "1_smartphone";
            if (myMes.getId().equals("2_smartphone")) nameBook = "2_smartphone";
            if (myMes.getId().equals("3_smartphone")) nameBook = "3_smartphone";
            file = new File(path + nameBook + ".xls");

            writeToExcel(myMes);
    }

    @SneakyThrows
    public void writeToExcel(MeasurmentResult myMes) {

        HSSFWorkbook wb = readWorkbook();

        if(rowNum == 0) {
            HSSFSheet sheet = wb.createSheet("File_" + myMes.getId()); //cоздаем новый лист в таблице для новой сессии измерений
            HSSFRow row = sheet.createRow(0); //заполняем первую строку
            row.createCell(0).setCellValue("Широта");
            row.createCell(1).setCellValue("Долгота");
            row.createCell(2).setCellValue("Высота над уровнем моря");
            row.createCell(3).setCellValue("Время");
            rowNum++;
        }

        HSSFSheet sheet = wb.getSheetAt(0);

        HSSFRow rowNew = sheet.createRow(rowNum);
        rowNew.createCell(0).setCellValue(myMes.getLatitude());
        rowNew.createCell(1).setCellValue(myMes.getLongitude());
        rowNew.createCell(2).setCellValue(myMes.getAltitude());
        rowNew.createCell(3).setCellValue(myMes.getTime());
        rowNum++;

        writeWorkbook(wb);

    }

    //загрузка data.xls
    public HSSFWorkbook readWorkbook() {
        try {
            HSSFWorkbook wb;
            if(file.exists()) { //если data.xls уже существует
                FileInputStream fs = new FileInputStream(file);
                wb = new HSSFWorkbook(fs); //считываем ее из памяти
            }
            else { //иначе
                wb = new HSSFWorkbook(); //создаем новую
            }
            return wb;
        }
        catch (Exception e) {
            return null;
        }
    }

    public void writeWorkbook(HSSFWorkbook wb) {
        try {
            FileOutputStream fileOut = new FileOutputStream(file);
            wb.write(fileOut);
            fileOut.close();
        }
        catch (Exception e) {
            e.getMessage();
        }
    }
}

В function(myMes) приходит 3 разные myMes и далее должна идти запись параметров каждого объекта myMes в свой Excel. Существуют специальные классы с аннотациями, или можно обойтись созданием потоков? как-то не хочется делать громоздким свой код. Спасибо. Greeting greeting(...) для GET запроса я создал тут https://spring.io/guides/gs/rest-service/. Добавил только свой POST запрос.


Ответы (0 шт):