Spring SmartLifeCycle 顺序行为?
Spring SmartLifeCycle sequential behavior?
我有一个分为几个模块的应用程序。我创建了一个 class ,它的工作是以正确的顺序启动它们并给每个模块足够的时间来启动。我过去曾多次使用 SmartLifeCycle,但我想知道更多关于如果我将它用于我的模块而不是需要一个单独的 class 来处理每个模块的启动和关闭,它会如何表现。
例如,模块 A 需要花费相当多的时间才能启动,因为它需要初始化与其他系统的多个 TCP 连接。模块 B 依赖于模块 A 被完全初始化,因为它向这些客户端发送各种消息。如果我让每个模块实现 SmartLifeCycle 并为它们提供正确的阶段以便它们以正确的顺序开始,我可以假设 Spring 将在移动到下一个之前完全初始化一个吗?我们可以控制这种行为吗?
IMO 最好使用事件驱动的方式来控制您的 "modules"。如果我在每个模块中正确理解你,你有一些服务应该相互依赖地完成一些工作。所以在这种情况下,您可以发布必要的事件并实现一些对这些事件做出反应的侦听器并调用这些服务器的相应方法,然后发布触发下一部分侦听器的其他事件等。
例如:
@Component
public class FirstHandler {
@Autoware private FirstService service;
@EventListener(ApplicationReadyEvent.class) // start when App is ready
public FirstWorkCompleted onAppReady() {
service.doWork();
return new FirstWorkCompleted(); // send FirstWorkCompleted event
}
}
@Component
public class SecondHandler {
@Autoware private SecondService service;
@EventListener(FirstWorkCompleted.class) // start when First work is completed
public SecondWorkCompleted onFirstWorkCompleted() {
service.doWork();
return new SecondWorkCompleted(); // send SecondWorkCompleted event
}
}
您还可以使用 ApplicationEventPublisher
发送事件 - 只需将其注入您的组件即可。
@EventListener
方法可以异步工作 - 只需向此类方法添加 @Async
注释(不要忘记将 @EnableAsync
注释应用于您的配置或应用程序 class 作为嗯)。
@EventListener
方法可以排序 - 只需按所需顺序向它们添加 @Order
注释即可。
关于申请事件的更多信息:
我有一个分为几个模块的应用程序。我创建了一个 class ,它的工作是以正确的顺序启动它们并给每个模块足够的时间来启动。我过去曾多次使用 SmartLifeCycle,但我想知道更多关于如果我将它用于我的模块而不是需要一个单独的 class 来处理每个模块的启动和关闭,它会如何表现。
例如,模块 A 需要花费相当多的时间才能启动,因为它需要初始化与其他系统的多个 TCP 连接。模块 B 依赖于模块 A 被完全初始化,因为它向这些客户端发送各种消息。如果我让每个模块实现 SmartLifeCycle 并为它们提供正确的阶段以便它们以正确的顺序开始,我可以假设 Spring 将在移动到下一个之前完全初始化一个吗?我们可以控制这种行为吗?
IMO 最好使用事件驱动的方式来控制您的 "modules"。如果我在每个模块中正确理解你,你有一些服务应该相互依赖地完成一些工作。所以在这种情况下,您可以发布必要的事件并实现一些对这些事件做出反应的侦听器并调用这些服务器的相应方法,然后发布触发下一部分侦听器的其他事件等。
例如:
@Component
public class FirstHandler {
@Autoware private FirstService service;
@EventListener(ApplicationReadyEvent.class) // start when App is ready
public FirstWorkCompleted onAppReady() {
service.doWork();
return new FirstWorkCompleted(); // send FirstWorkCompleted event
}
}
@Component
public class SecondHandler {
@Autoware private SecondService service;
@EventListener(FirstWorkCompleted.class) // start when First work is completed
public SecondWorkCompleted onFirstWorkCompleted() {
service.doWork();
return new SecondWorkCompleted(); // send SecondWorkCompleted event
}
}
您还可以使用 ApplicationEventPublisher
发送事件 - 只需将其注入您的组件即可。
@EventListener
方法可以异步工作 - 只需向此类方法添加 @Async
注释(不要忘记将 @EnableAsync
注释应用于您的配置或应用程序 class 作为嗯)。
@EventListener
方法可以排序 - 只需按所需顺序向它们添加 @Order
注释即可。
关于申请事件的更多信息: