Проект Java Spring Boot с веб-сокетами, возвращающими ошибку статуса 500

Я учусь использовать Spring Boot для создания веб-приложений. У меня есть проект, в котором я экспериментирую с веб-сокетами.

Я сталкиваюсь с ошибкой статуса 500 при попытке подключиться к чату в развернутом приложении.

Я развернул свой проект здесь. Для тестирования используйте логин: [email protected] / пароль

Когда я размещаю приложение на своем компьютере с помощью Spring Tool Suite, чат работает безупречно. Только на моем экземпляре EC2 Ubuntu Server 16.04 LTS (HVM) я сталкиваюсь с этой ошибкой уровня 500 при попытке подключиться к чату.

Я следовал следующему руководству для приложения чата: https://www.callicoder.com/spring-boot-websocket-chat-example/.

Вот мой файл конфигурации веб-сокета:

package com.web.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.*;

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
    registry.addEndpoint("/ws").setAllowedOrigins("*").withSockJS();
}

@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
    registry.setApplicationDestinationPrefixes("/app");
    registry.enableSimpleBroker("/channel");
}
}

Может ли кто-нибудь объяснить мне, почему приложение, использующее веб-сокеты, отлично работает при локальном размещении, но не при развертывании?

Кроме того, может ли кто-нибудь предоставить решение, с помощью которого я мог бы понять, почему возникает эта проблема?


person jhm1213    schedule 13.12.2017    source источник
comment
Я думаю, вы должны поделиться некоторым кодом на стороне сервера. Похоже, ваша конечная точка STOMP настроена неправильно. Также загляните в свои логи - может быть какая-то информация   -  person Kirill Simonov    schedule 14.12.2017
comment
Спасибо за ваш ответ! Я обновил свой пост, включив в него файл конфигурации websocket, в котором будет настроена конечная точка stomp.   -  person jhm1213    schedule 14.12.2017
comment
Ваша конфигурация веб-сокета выглядит нормально. Как вы развертываете приложение?   -  person Kirill Simonov    schedule 14.12.2017
comment
Также было бы неплохо увидеть ваш класс Controller   -  person Kirill Simonov    schedule 14.12.2017
comment
github.com/bchang1213/javaSpringProject/ tree/master/src/main/ Вот мои контроллеры. Приложение развертывается с использованием файла войны и прокси-сервера ajp. Существуют ли определенные детали развертывания, которые лучше всего подходят для релевантности? Спасибо за вашу помощь и терпение.   -  person jhm1213    schedule 14.12.2017


Ответы (1)


Мне удалось развернуть и запустить ваше приложение (на сервере Tomcat), используя следующую конфигурацию:

public class Project1Application extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Project1Application.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(Project1Application.class, args);
    }
    /*@Bean
    public EmbeddedServletContainerFactory servletContainer() {
        TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();
        Connector ajpConnector = new Connector("AJP/1.3");
        ajpConnector.setPort(9090);
        ajpConnector.setSecure(false);
        ajpConnector.setAllowTrace(false);
        ajpConnector.setScheme("http");
        tomcat.addAdditionalTomcatConnectors(ajpConnector);
        return tomcat;
    }*/
}

Для проверки просто запаковал в ROOT.war и закинул в папку webapps. Веб-сокеты работали, как и ожидалось.

Надеюсь это поможет.

PS. Эта статья оказалась для меня весьма полезной. Удачи!

person Kirill Simonov    schedule 14.12.2017
comment
Кирилл, большое спасибо за ответ! Я очень ценю ваше время. Однако я столкнулся с проблемой при попытке протестировать это решение. Я создал новый файл .war с помощью Maven Install, затем запустил файл .war на apache2 с помощью sudo a2enmod proxy sudo a2enmod proxy_ajp, а затем создал скрипт systemd для запуска файла war в моем экземпляре EC2. Я не могу запустить файл .war. Я вижу, что вы отключили ajp в предоставленном вами решении. Не могли бы вы объяснить мне, почему мой проект не требует AJP в вашем коде? - person jhm1213; 21.12.2017
comment
@jhm1213 Привет! Спасибо за ваш отзыв. Я не знал, что вам действительно нужен AJP. Я думал, что вы просто пытаетесь запустить свое приложение с помощью сервера приложений. Поэтому, если вы также хотите настроить коннектор AJP, вам следует копнуть немного глубже. Я предполагаю, что, поскольку AJP работает по протоколу HTTP, вам, возможно, придется добавить некоторые специальные настройки, чтобы он работал и по протоколу ws://. Взгляните на эту публикацию. - person Kirill Simonov; 21.12.2017
comment
Это выглядит как очень многообещающая статья! Большое спасибо за ваш опыт. Я прокомментирую, чтобы подтвердить, решит ли это мою проблему. - person jhm1213; 22.12.2017
comment
@ jhm1213 Надеюсь, это поможет! - person Kirill Simonov; 22.12.2017