官术网_书友最值得收藏!

Implementing business logic

We may now outline the design of our system in the following diagram:

Diagram 2.5 Events flow from a temperature sensor to a user

In this use case, the domain model will consist only of the Temperature class with the only double value inside. For simplicity purposes, it is also used as an event object, as shown in the following code:

final class Temperature {
private final double value;
// constructor & getter...
}

To simulate the sensor, let's implement the TemperatureSensor class and decorate it with a @Component annotation to register the Spring bean, as follows:

@Component
public class TemperatureSensor {
private final ApplicationEventPublisher publisher; // (1)
private final Random rnd = new Random(); // (2)
private final ScheduledExecutorService executor = // (3)
Executors.newSingleThreadScheduledExecutor();

public TemperatureSensor(ApplicationEventPublisher publisher) {
this.publisher = publisher;
}

@PostConstruct
public void startProcessing() { // (4)
this.executor.schedule(this::probe, 1, SECONDS);
}

private void probe() { // (5)
double temperature = 16 + rnd.nextGaussian() * 10;
publisher.publishEvent(new Temperature(temperature));

// schedule the next read after some random delay (0-5 seconds)
executor
.schedule(this::probe, rnd.nextInt(5000), MILLISECONDS); // (5.1)
}
}

So, our simulated temperature sensor only depends on the ApplicationEventPublisher class (1), provided by Spring Framework. This class makes it possible to publish events to the system. It is a requirement to have a random generator (2) to contrive temperatures with some random intervals. An event generation process happens in a separate ScheduledExecutorService (3), where each event's generation schedules the next round of an event's generation with a random delay (5.1). All that logic is defined in the probe() method (5).  In turn, the mentioned class has the startProcessing() method annotated with @PostConstruct (4), which is called by Spring Framework when the bean is ready and triggers the whole sequence of random temperature values.

主站蜘蛛池模板: 手机| 长乐市| 邹平县| 南平市| 吉首市| 阿尔山市| 潮州市| 鹤山市| 双江| 阿瓦提县| 巴楚县| 卢湾区| 黑山县| 秦安县| 佛教| 东台市| 奇台县| 盐源县| 资源县| 辽宁省| 区。| 政和县| 黄平县| 丹巴县| 扎兰屯市| 衡阳县| 绵阳市| 札达县| 明溪县| 土默特左旗| 静乐县| 隆德县| 新龙县| 逊克县| 禄劝| 梅州市| 扬中市| 乌兰察布市| 边坝县| 阿拉善盟| 蓝田县|