如何使2个宁静的应用程序定期进行通信,以使焦点每次都回到调用应用程序上

时间:2018-11-06 15:00:08

标签: java rest spring-boot

我将需要知道如何使两个Spring Restful应用程序定期进行通信(假设每5秒进行一次),以便每次焦点始终回到调用应用程序,并且两个应用程序之间的通信一直持续到被呼叫停止为止。一个特定的休息终点?

因此,目前,我在本地主机中有两个独立的spring boot restful应用程序,但配置为具有不同的端口。因此,我该如何制作第一个应用程序,在该应用程序中,REST API会调用该方法以开始与其他应用程序的通信(并发送实体数据)(接收和保存实体数据)。的确,持续进行定期通信至关重要,直到被第一个应用程序中的其余端点特意调用而停止为止。


好的,我会尝试详细说明。让我们保持尽可能简单。 另一个rest应用程序就像是一个设备或应用程序,它每5秒模拟一个生成传感器数据的设备,然后将其发送到另一个rest应用程序,后者再接收该数据并将其保存到数据库中。数据模型非常简单:

@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);
}

此外,从接收(也就是控制)应用程序中,我们需要一些方法来打开/关闭生成传感器数据的设备应用程序。显然,我们需要位于两个应用程序的rest控制器中的too rest api。在设备应用中,例如:

@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);
        }
       }
    }

...,并且在接收(控制)应用程序中,我们还需要类似的rest方法和终结点才能从前端的应用程序中调用。因此,在前端应用程序中,我们有一个开关来打开/关闭生成器设备-实际上是通过控制应用程序介导到设备应用程序的,参见?

我希望这可以澄清更多

1 个答案:

答案 0 :(得分:0)

我终于找到了可行的解决方案。该解决方案基于在两个应用程序中都使用RestTemplate,因此应用程序之间的通信直接在其余api上进行。然后使用Timer生成循环数据:

...

 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来获取数据并将其保存到db。效果很好。