Привет! Сложный вопрос для меня: как записать данные приходящие одновременно на 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 запрос.