Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使2个restful应用程序定期通信,以便每次都能将焦点返回到调用应用程序_Java_Rest_Spring Boot - Fatal编程技术网

Java 如何使2个restful应用程序定期通信,以便每次都能将焦点返回到调用应用程序

Java 如何使2个restful应用程序定期通信,以便每次都能将焦点返回到调用应用程序,java,rest,spring-boot,Java,Rest,Spring Boot,我需要知道如何让两个Spring restful应用程序定期通信(比方说每5秒一次),这样每次都会回到调用应用程序上,并且两个应用程序之间的通信会一直持续,直到调用特定的rest端点停止为止 因此,目前我有两个独立的spring boot restful应用程序,都在本地主机中,但配置为具有不同的端口。因此,我如何制作第一个应用程序,其中restapi调用该方法来启动与另一个应用程序(接收和保存实体数据)的通信(并发送实体数据)。事实上,重要的是周期性通信的持续性,直到在第一个应用程序中被对剩余

我需要知道如何让两个Spring restful应用程序定期通信(比方说每5秒一次),这样每次都会回到调用应用程序上,并且两个应用程序之间的通信会一直持续,直到调用特定的rest端点停止为止

因此,目前我有两个独立的spring boot restful应用程序,都在本地主机中,但配置为具有不同的端口。因此,我如何制作第一个应用程序,其中restapi调用该方法来启动与另一个应用程序(接收和保存实体数据)的通信(并发送实体数据)。事实上,重要的是周期性通信的持续性,直到在第一个应用程序中被对剩余端点的特殊调用停止


好的,我会再详细阐述一下。让我们尽可能简单。 另一个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秒将数据发送到另一个接收应用程序(在本地端口8080中运行)中的rest api,该应用程序显然也需要具有相同的数据模型。在接收应用程序中,我们可能需要以下内容来捕获生成的数据:

@RequestMapping(value = "/plugindata", method = RequestMethod.POST)
public ResponseEntity<DeviceData> getDeviceData(@RequestBody DeviceData deviceData) {
    ... save to db ....
    return new ResponseEntity<>(deviceData, HttpStatus.OK);
}
@RequestMapping(value=“/plugindata”,method=RequestMethod.POST)
公共响应getDeviceData(@RequestBody DeviceData DeviceData){
…保存到数据库。。。。
返回新的响应状态(deviceData、HttpStatus.OK);
}
此外,从接收(也就是控制)应用程序,我们需要打开/关闭生成传感器数据的设备应用程序。显然,我们也需要RESTAPI,它位于两个应用程序的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);
        }
       }
    }
@RequestMapping(value=“/devices/{deviceid}/onOff/{onOffval}”,method=RequestMethod.GET)
公共响应性TurnDeviceNoff(@PathVariable String deviceid,
@路径变量布尔值(onOffval){
if(onOffval==false){
this.isdevicon=false;
返回新的响应状态(false,HttpStatus.OK);
}否则{
试一试{
this.isdevicon=true;
返回新的ResponseEntity(true,HttpStatus.OK);
}捕获(例外e){
返回新的ResponseEntity(false,HttpStatus.NOT_FOUND);
}
}
}
。。。在接收(控制)应用程序中,我们还需要从前面的应用程序调用类似的rest方法和端点。因此,在前端应用程序中,我们有一个开关来打开/关闭发电机设备-实际上,通过控制应用程序到设备应用程序,请参见


我希望这能更清楚一点

我终于自己找到了一个可行的解决方案。该解决方案基于在两个应用程序中使用RestTemplate,因此应用程序之间的通信直接通过RESTAPI进行。循环数据由定时器产生:


在这里,生成的设备数据被发回接收(控制)应用程序,在那里我有api来获取数据并将其保存到db。很好地工作。

最简单的方法是使用cron作业代表另一个应用程序调用其中一个应用程序。这是一个非常不明确的过程。你不能更具体一点吗?
 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);

    }
    ...