我有一个弹簧启动应用程序。
我已经实施了SmartLifecycle我的 bean 中的接口启动了异步 snmp 服务器start
方法并将其停止在其中stop
method.
一切工作正常,除了主应用程序上下文在启动后立即停止,因此我的服务器 bean 也在启动后立即停止。
我所需要的只是使 spring 上下文仅在关闭钩子被触发时停止。
这不是一个网络应用程序,所以我不需要spring-boot-starter-web
,它通过启动 Web 服务器来解决此问题,从而防止上下文停止,直到 Web 服务器停止为止。
我可以使用类似的东西CountDownLatch
并等待我的它为零main
上下文启动后立即执行的方法。像这样的事情:
public static void main(String[] args) throws InterruptedException {
ConfigurableApplicationContext ctx = SpringApplication.run(SnmpTrapRetranslatorApplication.class, args);
CountDownLatch snmpServerCloseLatch = ctx.getBean("snmpServerCloseLatch", CountDownLatch.class);
snmpServerCloseLatch.await();
}
还有我的服务器 beanstart
方法将创建带有计数的锁存器1
, while stop
方法将调用snmpServerCloseLatch.countDown()
.
该技术被描述为here.
但这有什么问题是我的main
方法负责等待我的自定义服务器 bean 停止。我觉得这是不对的。
举例来说如何spring-boot-starter-web
做这个?当启动tomcat时,它会一直运行直到收到关闭钩子,并且不需要在tomcat中有任何管理代码main
方法。仅当上下文接收到shoutdown信号时它才会停止。
例如,当我有相同的行为时@Scheduled
我的 bean 中的方法。 Spring 也不会自动停止上下文。仅在CTRL-C
.
我想达到类似的效果。我的main
方法应该只有一行:启动上下文。上下文应该在启动或停止时启动和停止我的异步服务器(已通过SmartLifecycle
)并且在请求关闭之前不应停止(CTRL-C、SIGINT 等)。