这篇博客上面有关于springboot集成webscoket项目的简单实例以及一些注意事项:spring boot Websocket(使用笔记)
第一种方法:
我在项目中应用场景是我们项目只在生产环境部署war包,所以我通过pom获取文件中packaging标签判断打包方式,通过application.properties文件中的spring.profiles.active属性获取打包的环境.然后通过@Conditional注解判断是否符合装配条件,符合就装配,不符合就不装配. 不影响在开发过程中使用main方法运行项目. 测试成功.
以下详细步骤:
1.配置application.properties能够读取pom文件中的数据,然后读取打包方式
build->resources标签下加入resource标签,内容如下,之后就可以在application.properties文件中获取pom中标签的值了.
filtering:为true或false,表示是否要为此资源启用过滤。请注意,不必定义过滤器* .properties文件以进行过滤 - 资源也可以使用,默认情况下在POM中定义的属性(例如$ {project.packaging}),使用传递到命令行“-D”标志(例如,“ - Dname = value ”)或由properties元素显式定义。上面介绍了过滤文件。(发现bug,如果不指定需要过滤的文件,会影响resource目录下其他的文件,我们项目里面的css文件放到resource下,就受到影响了,有很多矢量标签没有显示,所以这里加上includes,指定一下需要过滤的文件就行了)
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>application.properties</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
在application.properties文件中获取pom中packaging打包方式.默认打包方式是jar.
package.style = @project.packaging@
注意: 如果你使用yml文件做配置文件的话,@project.packaging@可能会报错,只需要加两个单引号就行了 '@project.packaging@'
2.使用@Conditional注解,根据是否满足指定的条件来决定是否装配bean.Conditional注解类里只有一个 value属性,需传入一个 Condition类型的数组.Condition接口是一个函数式接口,创建一个类实现Condition接口,并实现Condition接口中的matches方法.以下是实现方法,matches方法返回true装配,返回false不装配.
/**
* 判断是否使用webscoket容器,如果使用的是生产环境且是war包的方式不装配bean,使用方式@Conditional(WarAndJarWebscoketAutoWired.class)
*/
public class WarAndJarWebscoketAutoWired implements Condition {
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
Environment env = context.getEnvironment();
String packageStyle = env.getProperty("package.style");
String active = env.getProperty("spring.profiles.active");
// return !packageStyle.equals("war");
return ("jar".equals(packageStyle)&&"dev".equals(active));
}
}
3.webscoket容器类.
@Configuration
public class WebSocketConfig {
@Bean
@Conditional(WarAndJarWebscoketAutoWired.class)
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
4.当符合环境是prod且打包方式是war时,ServerEndpointExporter不会装配到容器中.我们生产环境使用的是外部tomcat容器.
上面那个博客中可以看到为什么要这么做.这样的话每次部署到生产环境的话只需要修改环境和打包方式,不用每次都注释@Bean那块代码了
第二种方法:
1、直接使用外部容器中的jar包,
我们的项目运行在外部的tomcat中,tomcat下面的lib文件夹中已经包含了websocket的jar包,我们就可以直接使用这些jar包
idea中配置引用tomcat中jar包,在Setting中查找Application Servers
,然后把需要的jar加进来。
加入项目依赖中
配置完成之后就可以使用websocket了,maven依赖中也不需要加websocket的依赖了,但是比较麻烦的是,启动的时候就不能使用main方法启动了,需要使用tomcat启动。