SpringBoot中无法加载webSocket 资源如何解决
创始人
2024-11-20 17:02:18
0次

问题描述:

1. 项目集成WebSocket,且打包发布tomcat时出现websocket is already in CLOSING or CLOSE state这样的问题,建议参考“解决方法二”,但是“解决方法一”请要了解查看 ,因为解决方法二是在一的基础上进行更正

2. 如果出现javax.websocket.server.ServerContainer not available这样的错误,请参考“解决方法一”中步骤3

解决方法一:(常规解决、不推荐)

步骤1:在BootApplication中修改:

public static void main(String[] args) {
		SpringApplication springApplication = new SpringApplication(BootApplication.class);
		springApplication.addListeners(new ApplicationPidFileWriter());
		ConfigurableApplicationContext applicationContext = springApplication.run(args);
		WebSocketServer.setApplicationContext(applicationContext);	

注:这里的WebSocketServer是指你自定义的websocket接受消息的服务类

步骤2:修改WebSocketServer

private static ManageUserMapper manageUserMapper;
 
 public static void setApplicationContext(ConfigurableApplicationContext   applicationContext) {
  WebSocketServer.manageUserMapper = applicationContext.getBean(ManageUserMapper.class);
 }

步骤3: 修改pom.xml

由于我们在开发过程中,如果按照以上步骤1、2进行修改,一般不会出现问题,

但是如果我们打包发布tomcat,就会出现:javax.websocket.server.ServerContainer not available这样的错误,步骤3为常规解决一下问题方式


			org.springframework.boot
			spring-boot-starter-web
			
			
				 
					org.springframework.boot
					spring-boot-starter-tomcat
				
			
		

需要去除web-starter的tomcat,因为如果不去除会导致冲突,

如果出现这种问题,你还需要在websocketConfig中做如下修改:(websocket为自定义配置类)

/**
  * 服务器节点
  *
  * 如果使用独立的servlet容器,而不是直接使用springboot的内置容器,就不要注入ServerEndpointExporter,因为它将由容器自己提供和管理
  * @return
  */
 @Bean
 @Profile("dev")
 public ServerEndpointExporter serverEndpointExporter() {
  return new ServerEndpointExporter();
 }

在application.properties做如下配置

##prod:生产环境 dev:开发环境(WINDOWS)
spring.profiles.active=dev

这里加入了@Profile("dev") 这个注解。意思是在开发的过程中去调用

.记住如果开发过程中,记得一定要把pom.xml中的去除tomcat那句话给注释掉,上线才需要去除

问题反思:(为什么不建议这么解决问题)

这种方式确实可以常规解决websocket打包tomcat不报错问题,同时也解决了在资源无法加载的问题,但是这样却十分的麻烦,理由如下:

1. 繁琐:生产环境和开发环境要一直切换是否注释tomcat

2. 局限性大:我们在BootApplication中添加了websocketserver去访问资源的语句,但是其他地方难道没有需要调用的吗,如果有,难道像这样一直累计添加下去,每个server设置一下

核心思想是资源无法加载的问题,如果你有写线程,且线程你也调用了数据库资源,那么解决方法是一致,编写一个公用的工具类解决

解决方法二:(推荐)

步骤1:新建一个工具类,getbeanTool

此工具类为之后加载资源的工具类,公用

@Component
public class GetBeanTool implements ApplicationContextAware{
	
	private static ApplicationContext applicationContext = null;
 
 @Override
 public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
  GetBeanTool.applicationContext = applicationContext;
 }
 
 public static Object getBeanByName(String beanName) {
  if (applicationContext == null){
   return null;
  }
  return applicationContext.getBean(beanName);
 }
 
 public static  T getBean(Class type) {
  return applicationContext.getBean(type);
 }
 
}

步骤2:在线程、websocket等server中,加载资源

以WebSocketServer作为参考,如下修改:

 private ManageUserMapper manageUserMapper;
 
 public WebSocketServer() {
 	this.manageUserMapper=GetBeanTool.getBean(ManageUserMapper.class);
 }

这么做你就不用在BootApplication中添加语句,来让你的server去调用资源了,一步到位,大家都能用,需要的时候直接通过getbeanTool去请求就行了

步骤3:解决tomcat开发环境,生产环境pom.xml中注释和打开内置tomcat的问题

这里需要修改BootApplication,如下修改:

@SpringBootApplication
@Configuration
public class BootApplication extends SpringBootServletInitializer {
 
	@Override
	protected SpringApplicationBuilder configure(
			SpringApplicationBuilder application) {
		return application.sources(BootApplication.class);
	}
 
 
	public static void main(String[] args) {
		SpringApplication.run(BootApplication.class, args);
	}
}

可以看到这里我继承了SpringBootServletInitializer ,同时重写了configure方法。采用这种写法,如论是开发还是测试,你都不用管是否需要注释内置的tomcat了

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...