Wenn Sie eine Webanwendung mit SpringBoot erstellen, können Sie sie starten, indem Sie das Artefakt der Jar-Datei mit dem integrierten Tomcat ausführen.
java -jar xxx.jar
Da es sich jedoch von der herkömmlichen Bereitstellung mit War-Datei unterscheidet, war ich süchtig nach der Einstellung der Zusammenarbeit mit dem integrierten Tomcat + Apache + WebSocket.
Die folgende JavaConfig entspricht den herkömmlichen Einstellungen für 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" />
Zu Gradle-Abhängigkeiten hinzugefügt
build.gradle
dependencies {
...
compile "org.springframework.boot:spring-boot-starter-websocket:1.3.3.RELEASE"
...
}
Fügen Sie die Annotation @ EnableWebSocketMessageBroker
hinzu und aktivieren Sie sie
Application.java
@SpringBootApplication
@EnableWebSocketMessageBroker//hinzufügen
public class Application extends SpringBootServletInitializer
{
public static void main( String... args )
{
SpringApplication.run( Application.class, args );
}
}
WebSocketConfiguration.java
@Configuration
public class WebSocketConfiguration extends AbstractWebSocketMessageBrokerConfigurer { //Erben Sie AbstractWebSocketMessageBrokerConfigurer, um WebSocket-bezogene Bean-Definitionen anzupassen
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/chat").setAllowedOrigins("*").withSockJS();//Von der Rezeption abonnierte Endpunkte
}
@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
{
...
}
}
Dieses Mal verwenden wir das Angular Js1-System
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) => {//Aufbau einer WebSocket-Verbindung
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, die SockJS und WebSocket verbindet und automatisch von SpringWebSocket generiert wird
ProxyPass /chat ws://localhost:8080/chat #ws Proxy-Einstellungen
ProxyPass / ajp://localhost:8009/ #Ajp-Proxy-Einstellungen
Mit den oben genannten Einstellungen funktioniert (sollte) das integrierte Tomcat + Apache + WebSocket! !!
Ich habe alles außer den Hauptpunkten gefaltet, aber bitte verzeihen Sie mir, da ich den Artikel jedes Mal überarbeiten werde, wenn ein Fehler auftritt. .. .. orz
Na dann.
Recommended Posts