#java #json #vert.x
Вопрос:
В настоящее время я создаю приложение Java Vertx, которое периодически выполняет задачу.
Это приложение выполняет определенную логику и должно возвращать значение в формате Json.
Логика, кажется, работает, и у меня нет проблем с получением желаемого значения в журнале, но у меня проблемы с возвратом этого значения.
public void getNum(RoutingContext context){ Timer time = new Timer(); ScheduledTask st = new ScheduledTask(); time.schedule(st, 0, 500); JsonObject jo = st.getJo(); if(!jo.toString().equals("{}")){ log.info("print json" jo); context.response().putHeader("content-type", "application/json").setStatusCode(200).end(jo.encodePrettily()); }
И код для запланированной задачи выглядит примерно так.
public class ScheduledTask extends TimerTask { JsonObject jo = new JsonObject(); public void run() { try { //logic jo.put("file", split[0]); jo.put("recogTime", split[1]); jo.put("number", split[2]); log.info(jo.encodePrettily()); }catch (Exception e){ e.printStackTrace(); log.info("Error.Running.1stCMD"); } } }
Если я удалю оператор if в своем методе GetNum, он, похоже, вернет пустой json, поэтому я предполагаю, что он возвращает инициализированное значение jo.
Будет ли у меня способ вернуть желаемое значение?
Заранее благодарю вас!!
Ответ №1:
Первым делом:
time.расписание(st, 0, 500); -gt; Это будет только расписание, но будет выполняться где-то в будущем.
JSONObject jo = st.getJo(); -gt; Сразу после возврата с предыдущего вызова вы выполняете get(). Функция расписания не работала бы до тех пор.
Второй:
Если вы используете Vert.x, не используйте таймер java. Вы можете использовать функции, предоставляемые Vertx
setPeriodic() -gt; Для запуска снова и снова с запланированным интервалом. SetTimer() -gt; Выполняется один раз с запланированным интервалом.
Комментарии:
1. Спасибо за ваши отзывы!! Если я использую setPeriodic(), поскольку он запланирован на будущее, не вернет ли он также нулевое значение, когда я получу Json?
2. В этом прелесть асинхронного программирования, ничто не возвращается, всякий раз, когда происходит событие, вы применяете логику для этого события. Например: Когда вызывается ваша функция внутри setPeriodic (), в этом случае вы создаете свой json и реагируете на контекст маршрутизации. Надеюсь, это будет полезно.
Ответ №2:
установите некоторые значения в JSONObject и попробуйте приведенный ниже код, я не знаю, что такое функция encodePrettily ()!
routingContext.response() .putHeader("content-type", "application/json; charset=utf-8") .end(Json.encodePrettily(jo.encodePrettily());
Комментарии:
1. Я установил значения для объекта Json, но поскольку моя java-программа выполняет задание по расписанию каждые 0,5 секунды, кажется, что она инициализирует объект Json и возвращает нулевой объект Json. Как я уже упоминал выше, я действительно получаю желаемое значение в журнале. encodePrettily () — это просто функция, которая помогает преобразовать объект json в строковый формат