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