【问题标题】:How to make 2 restful apps communicate periodically so that the focus comes back to the calling app each time如何让 2 个 restful 应用程序定期通信,以便每次都将焦点返回到调用应用程序
【发布时间】:2019-04-09 23:56:35
【问题描述】:

我需要知道如何让两个 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);
        }
       }
    }

...在接收(控制)应用程序中,我们还需要从前面的应用程序调用类似的休息方法和端点。所以,在前面的应用程序中,我们有一个开关来打开/关闭生成器设备 - 实际上是通过控制应用程序到设备应用程序进行调解的,明白吗?

我希望这能澄清更多

【问题讨论】:

  • 最简单的方法是让一个 cron 作业代表另一个应用程序调用其中一个应用程序。
  • 这是一个非常不清楚的程序。不能再具体点吗?

标签: java rest spring-boot


【解决方案1】:

我终于自己找到了一个可行的解决方案。该解决方案基于在应用程序和应用程序之间的通信中使用 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。效果很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多