我在一个应用程序中有 2个主要入口点。
first main 启动服务器,映射控制器并启动一些工作线程。这些工作人员从云队列接收消息。
如果负载增加,我希望能够增加额外的工作来完成我的工作。所以我的应用程序中有一个第二个主入口点,我希望能够在spring-boot(作为客户端应用程序)中启动而不启动默认服务器,以便避免端口冲突(显然会导致失败)。
我如何实现这一目标?
答案 0 :(得分:15)
server
和client
个人资料要使用具有2个不同配置文件的相同jar和相同入口点,您应该只是在运行时提供Spring配置文件,以便具有不同的应用程序 - $ {profile} .properties已加载(并且可能触发条件Java配置)。
定义2个春季档案(client
和server
):
application-${profile}.properties
拥有一个SpringBootApp和入口点:
@SpringBootApplication
public class SpringBootApp {
public static void main(String[] args) {
new SpringApplicationBuilder()
.sources(SpringBootApp.class)
.run(args);
}
}
让这个班级成为你的主要班级。
的src /主/资源/的 application-server.properties 强>:
spring.application.name=server
server.port=8080
的src /主/资源/的 application-client.properties 强>:
spring.application.name=client
spring.main.web-environment=false
从命令行启动两个配置文件:
$ java -jar -Dspring.profiles.active=server YourApp.jar
$ java -jar -Dspring.profiles.active=client YourApp.jar
您可能会根据活动配置文件有条件地触发@Configuration
个类:
@Configuration
@Profile("client")
public class ClientConfig {
//...
}
server
和client
个人资料<强>发射器强>:
@SpringBootApplication
public class SpringBootApp {
}
public class LauncherServer {
public static void main(String[] args) {
new SpringApplicationBuilder()
.sources(SpringBootApp.class)
.profiles("server")
.run(args);
}
}
public class ClientLauncher {
public static void main(String[] args) {
new SpringApplicationBuilder()
.sources(SpringBootApp.class)
.profiles("client")
.web(false)
.run(args);
}
}
您可以指定其他配置类(特定于客户端或服务器):
new SpringApplicationBuilder()
.sources(SpringBootApp.class, ClientSpecificConfiguration.class)
.profiles("client")
.web(false)
.run(args);
的src /主/资源/的 application-server.properties 强>:
spring.application.name=server
server.port=8080
的src /主/资源/的 application-client.properties 强>:
spring.application.name=client
#server.port= in my example, the client is not a webapp
注意,您可能还有2个SpringBootApp(
ClientSpringBootApp
,ServerSpringBootApp
),每个都有自己的主,它是一个类似的设置 允许您配置不同的AutoConfiguration
或ComponentScan
:
@SpringBootApplication
@ComponentScan("...")
public class ServerSpringBootApp {
public static void main(String[] args) {
new SpringApplicationBuilder()
.sources(ServerSpringBootApp.class)
.profiles("server")
.run(args);
}
}
//Example of a difference between client and server
@SpringBootApplication(exclude = SecurityAutoConfiguration.class)
@ComponentScan("...")
public class ClientSpringBootApp {
public static void main(String[] args) {
new SpringApplicationBuilder()
.sources(ClientSpringBootApp.class)
.profiles("client")
.web(false)
.run(args);
}
}