由于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启动时执行的初始化逻辑
// ...
}
}