Lors de la création d'une application Web avec SpringBoot, il est possible de la démarrer en exécutant l'artefact du fichier Jar à l'aide du Tomcat intégré.
java -jar xxx.jar
Cependant, comme il est différent du déploiement conventionnel avec War file, j'étais accro au réglage de la coopération avec le Tomcat + Apache + WebSocket intégré.
Le JavaConfig suivant sera le même que les paramètres traditionnels de server.xml.
TomcatConfiguration.java
@Configuration
public class TomcatConfiguration
{
@Bean
public EmbeddedServletContainerFactory servletContainer() {
TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();
tomcat.addAdditionalTomcatConnectors(ajpConnector());
return tomcat;
}
private Connector ajpConnector() {
Connector connector = new Connector("org.apache.coyote.ajp.AjpNioProtocol");
connector.setAttribute("maxThreads", 100);
connector.setProtocol("AJP/1.3");
connector.setPort(8009);
connector.setRedirectPort(8043);
connector.setURIEncoding("UTF-8");
return connector;
}
}
server.xml
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
Ajouté aux dépendances de gradle
build.gradle
dependencies {
...
compile "org.springframework.boot:spring-boot-starter-websocket:1.3.3.RELEASE"
...
}
Ajoutez et activez l'annotation @ EnableWebSocketMessageBroker
Application.java
@SpringBootApplication
@EnableWebSocketMessageBroker//ajouter à
public class Application extends SpringBootServletInitializer
{
public static void main( String... args )
{
SpringApplication.run( Application.class, args );
}
}
WebSocketConfiguration.java
@Configuration
public class WebSocketConfiguration extends AbstractWebSocketMessageBrokerConfigurer { //Hériter de AbstractWebSocketMessageBrokerConfigurer pour personnaliser les définitions de bean associées à WebSocket
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/chat").setAllowedOrigins("*").withSockJS();//Endpoints souscrits par la réception
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.setApplicationDestinationPrefixes("/sock");
registry.enableSimpleBroker("/topic", "/queue");
}
}
ChatController.java
@RestController
@RequestMapping("/chat/")
public class ChatController
{
@MessageMapping( "/chat/{accountId}" )
@SendTo( "/topic/chat/all" )
public ChatList all( @DestinationVariable Integer accountId, ChatMessage message ) throws InterruptedException
{
...
}
}
Cette fois, nous utilisons le système Angular Js1
ChatService.js
import SockJS from "sockjs-client";
export function ChatService($http, ChatStore) {
let stompClient = {};
var connect = ( $scope ) => {
let socket = new SockJS( '/chat');
stompClient = Stomp.over(socket);
stompClient.connect({}, (frame) => {//Établissement de la connexion WebSocket
stompClient.subscribe('/topic/chat/all', ( chatList ) => {
...
});
});
}
var send = () => {
stompClient.send(`/sock/chat/${ChatStore.accountId}`, {},JSON.stringify({
'value': ChatStore.message
}));
}
return {
connect,
send
};
}
httpd.conf
ProxyPass /chat/info ajp://localhost:8009/chat/info #URL qui connecte SockJS et WebSocket générée automatiquement par SpringWebSocket
ProxyPass /chat ws://localhost:8080/chat #paramètres de proxy ws
ProxyPass / ajp://localhost:8009/ #paramètres proxy ajp
Avec les paramètres ci-dessus, le Tomcat + Apache + WebSocket intégré fonctionnera (devrait) fonctionner! !!
J'ai tout plié sauf les points principaux, mais pardonnez-moi car je réviserai l'article chaque fois qu'il y aura une erreur. .. .. orz
Eh bien.
Recommended Posts