由于lettuce没办法实现stream的消费者实时监听,要在tomcat启动后,执行一个while(true)作为消费者的监听。
1、自定义监听,实现ServletContextListener接口,重写contextInitialized方法
- public class ZtsRedisStreamListener implements ServletContextListener , ApplicationContextAware {
-
- private ApplicationContext applicationContext;
-
- @Override
- public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
- // 保存Spring容器的上下文
- this.applicationContext = applicationContext;
- }
- @Override
- public void contextInitialized(ServletContextEvent servletContextEvent) {
- // 获取Spring容器的上下文
- applicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContextEvent.getServletContext());
- // 通过上下文获取Bean对象
- MessageSubscriber messageSubscriber = applicationContext.getBean(MessageSubscriber.class);
-
- }
-
- @Override
- public void contextDestroyed(ServletContextEvent servletContextEvent) {
-
- }
- }
setApplicationContext,为什么要使用这个方法,因为在执行初始化方法时,spring的bean没有被完全加载,如果直接使用@Autowired注入bean,会报错。需要等应用完全记载后,才能成功获取到bean的对象和属性内容。
2、可以使用注解@PostConstruct
- import javax.annotation.PostConstruct;
- import org.springframework.stereotype.Component;
-
- @Component
- public class MyComponent {
-
- @PostConstruct
- public void init() {
- // 在Tomcat启动时执行的初始化逻辑
- // ...
- }
- }