Как сделать так, чтобы 2 успокаивающих приложения периодически общались, чтобы фокус снова возвращался к вызывающему приложению - PullRequest
0 голосов
/ 06 ноября 2018

Мне нужно знать, как заставить два успокаивающих приложения Spring периодически обмениваться данными (скажем, каждые 5 секунд), чтобы фокус всегда возвращался к вызову приложения каждый раз, а связь между двумя приложениями продолжалась до тех пор, пока не прекратится вызовом конкретная конечная точка отдыха?

Итак, на данный момент у меня есть два независимых весенних загрузочных отдыхающих приложения, оба на локальном хосте, но настроены на разные порты. Таким образом, как я могу создать первое приложение, в котором метод вызывается оставшимся API для запуска связи (и отправки данных объекта) с другим приложением (получения и сохранения данных объекта). И действительно, существенным является продолжение периодического общения до тех пор, пока оно не прервано специальным вызовом конечной точки отдыха в первом приложении.


Хорошо, я попытаюсь уточнить немного больше. И давайте сделаем это как можно проще. Другое приложение отдыха должно быть похоже на устройство или приложение, которое имитирует устройство, генерирующее данные датчика каждые 5 секунд, и отправляет его другому приложению отдыха, которое получает его и сохраняет его в базе данных. Модель для данных очень проста:

@Entity
@JsonIgnoreProperties(ignoreUnknown = true)
public class DeviceData implements Serializable {

@JsonIgnore
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @NotNull
    private LocalDateTime timestamp;

    @NotNull
    private integer sensorId;

    @Column(precision = 21, scale = 2)
    private BigDecimal value;
 ...
}

Эти данные датчика, основанные на этой модели, будут сгенерированы / смоделированы (например, с использованием случайных чисел и метки времени) в приложении, которое запускается, скажем, через локальный порт 8090. Затем данные должны отправляться каждые 5 секунд на оставьте api в другом, получая приложение (работающее в локальном порту 8080), которое, очевидно, должно иметь ту же модель для данных. В получающем приложении нам, вероятно, понадобится что-то вроде следующего для захвата сгенерированных данных:

@RequestMapping(value = "/plugindata", method = RequestMethod.POST)
public ResponseEntity<DeviceData> getDeviceData(@RequestBody DeviceData deviceData) {
    ... save to db ....
    return new ResponseEntity<>(deviceData, HttpStatus.OK);
}

Кроме того, из принимающего (и, следовательно, управляющего) приложения, каким-то образом, нам нужно включить / выключить приложение устройства, которое генерирует данные датчика. Очевидно, что для этого тоже нужен api rest, который находится в остальных контроллерах обоих приложений. В приложении устройства что-то вроде:

@RequestMapping(value = "/devices/{deviceid}/onOff/{onOffval}", method = RequestMethod.GET)
    public ResponseEntity<Boolean> turnDeviceOnOff(@PathVariable String deviceid,
                                                   @PathVariable boolean onOffval) {
        if (onOffval == false) {
            this.isDeviceOn = false;
            return new ResponseEntity<>(false, HttpStatus.OK);
        } else {
        try {
            this.isDeviceOn = true;
            return new ResponseEntity<>(true, HttpStatus.OK);
        } catch (Exception e) {
            return new ResponseEntity<>(false, HttpStatus.NOT_FOUND);
        }
       }
    }

... и в принимающем (контролирующем) приложении нам также необходим метод и конечная точка подобного рода, которые будут вызываться из приложения на передней панели. Итак, во фронтальном приложении у нас есть переключатель для включения / выключения генераторного устройства - действительно, опосредовано через управляющее приложение до приложения устройства, понимаете?

Надеюсь, это прояснит еще немного

1 Ответ

0 голосов
/ 08 ноября 2018

Наконец-то я нашел рабочее решение самостоятельно. Решение основано на использовании RestTemplate как в приложениях, так и связь между приложениями происходит непосредственно через остальные API. И циклические данные генерируются с таймером:

...

 this.timer = new Timer();
 this.timer.schedule(new CreateDeviceData(deviceid), 0, 5000);

class CreateDeviceData extends TimerTask {

    public DeviceData device_data;
    private String deviceId;

    CreateDeviceData(String deviceid) {
       this.deviceId = deviceId;
    }

    @Override
    public void run() {

        int sensor_id = (int) (Math.random() * (3 - 1)) + 1;
        double sensor_value = (double) (Math.random() * (1000 - 1)) + 1;
        LocalDateTime timestamp = LocalDateTime.now();
        DeviceData deviceData = new DeviceData(timestamp, sensor_id, sensor_value);

        RestTemplate restTemplate = new RestTemplate();
        String url = "http://localhost:8080/plugindata";            
        DeviceData devicedata = restTemplate.postForObject(url, deviceData, DeviceData.class);

    }
    ...

Здесь сгенерированные данные устройства отправляются обратно в приемное (управляющее) приложение, где у меня есть api, чтобы получить данные и сохранить их в БД. Работает красиво.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...