Веб-сокеты Spring-MVC с SockJS на JBoss: невозможно обновить с HTTP/1.1 без событий ввода-вывода

Моя цель: я хочу транслировать сообщение всем клиентам на моей странице, когда происходит определенное событие. Вероятно, это будет происходить все 15 секунд.

Я хотел работать с веб-сокетами, и на данный момент это выглядит довольно хорошо. После просмотра различных докладов и прочтения нескольких деклараций проекта и официального документа я думаю, что заключил сделку.

Однако я застрял в этом сообщении об ошибке и больше не знаю, что делать:

JBWEB000034: Cannot upgrade from HTTP/1.1 without IO events

Настраивать:

  • Весенняя версия 4.1.1
  • JBoss EAP 6.3
  • IntelliJ
  • Мавен

Я выгружу все свои конфигурации и текущее состояние кода:

Веб-сокетконтроллер

@Controller
public class WebsocketController extends TextWebSocketHandler{

    @MessageMapping
    @SendTo("/topic/nextImg")
    public Message nextImg() {
        return new Message("next");
    }
}

Сообщение (простой DTO)

public class Message {
    private String message;

    public Message(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }
}

mvc-dispatcher-servlet.xml

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:task="http://www.springframework.org/schema/task"
       xmlns:websocket="http://www.springframework.org/schema/websocket"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
        http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.1.xsd
        http://www.springframework.org/schema/websocket http://www.springframework.org/schema/websocket/spring-websocket-4.1.xsd">

    <context:component-scan base-package="global.pics"/>
    <mvc:annotation-driven/>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <bean id="multipartResolver"
                class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

        <!-- setting maximum upload size -->
        <property name="maxUploadSize" value="10000000" />

    </bean>

    <bean id="websocketController" class="global.pics.websocket.WebsocketController"/>

    <websocket:handlers>
        <websocket:mapping path="/next" handler="websocketController"/>
        <websocket:sockjs/>
    </websocket:handlers>


    <websocket:message-broker application-destination-prefix="/app">
        <websocket:stomp-endpoint path="/next">
            <websocket:sockjs/>
        </websocket:stomp-endpoint>
        <websocket:simple-broker prefix="/topic"/>
    </websocket:message-broker>


    <mvc:resources mapping="/resources/**" location="/resources/" />

    <task:scheduled-tasks>
        <task:scheduled ref="queueController" method="nextImg" fixed-rate="13370"/>
    </task:scheduled-tasks>

    <task:scheduled-tasks>
        <task:scheduled ref="imageCounter" method="backup" fixed-delay="60000"/>
    </task:scheduled-tasks>

</beans>

web.xml

<web-app version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <display-name>share.pics.global</display-name>

    <servlet>
        <servlet-name>mvc-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
        <async-supported>true</async-supported>
    </servlet>

    <servlet-mapping>
        <servlet-name>mvc-dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>



<!--update: context-param-->

<context-param>
    <param-name>websockets-enabled</param-name>
    <param-value>true</param-value>
</context-param>

</web-app>

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.springapp</groupId>
    <artifactId>picsglobal</artifactId>
    <packaging>war</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>picsglobal</name>

    <properties>
        <spring.version>4.1.1.RELEASE</spring.version>
    </properties>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.1.10.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.1</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring.version}</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.jboss.spec.javax.websocket</groupId>
            <artifactId>jboss-websocket-api_1.1_spec</artifactId>
            <version>1.1.1.Final</version>
        </dependency>

        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.2.1</version>
        </dependency>

        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>1.4</version>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
            <version>1.2.1.RELEASE</version>
        </dependency>


        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-messaging</artifactId>
            <version>4.1.4.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.9.13</version>
        </dependency>
        <!--update: looks like this is nescessary for whatever reason-->

        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-spring</artifactId>
            <version>3.0.10.Final</version>
        </dependency>

    </dependencies>

    <build>
        <finalName>picsglobal</finalName>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <includes>
                        <include>**/*Tests.java</include>
                    </includes>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>spring-releases</id>
            <url>https://repo.spring.io/libs-release</url>
        </repository>
        <repository>
            <id>central</id>
            <url>http://repo1.maven.org/maven/</url>
        </repository>
    </repositories>
    <pluginRepositories>
        <pluginRepository>
            <id>spring-releases</id>
            <url>https://repo.spring.io/libs-release</url>
        </pluginRepository>
    </pluginRepositories>

</project>

Если я что-то пропустил, вы можете найти все на моем Github: https://github.com/r79/picsglobal

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

ОБНОВИТЬ:

Я добавил параметры контекста в свой файл web.xml (см. выше). Похоже, что spring-web.xml устарел, а решение с параметром контекста является обновленной формой.

Я также добавил следующую зависимость в свой pom.xml.

На данный момент я работаю с новейшей версией Wildfly-Alpha (9.0.0), потому что похоже, что в текущей продуктивной версии есть ошибка с Spring: https://issues.jboss.org/browse/WFLY-3439

Тем не менее, я все еще получаю сообщения об ошибках. Я пытаюсь исправить их и обновить эту ветку, если найду решение. Возможное быстрое решение для других, столкнувшихся с проблемой, может заключаться в переключении на Tomcat, похоже, там это работает. Сначала мне нужно попробовать запустить его с помощью Wildfly, потому что я использовал некоторые зависимости от JBoss.

Новое обновление:

Похоже, что новейший WildFly, с которым я пытался заставить эту штуку работать (9.0.0.alpha1), имеет еще одну ошибку с Spring: [невозможно опубликовать вторую ссылку, потому что моя репутация здесь слишком низкая, поищите в Google «wildfly 9 getresteasyspringvirtualfile», это было первая ссылка там]

Похоже, они вытащили Запрос в свою ветку разработки, но я не могу собрать его без ошибок. На этом этапе я прекращаю попытки заставить его работать с wildfly и переключаюсь на Tomcat.

Решение этой проблемы состоит в том, чтобы дождаться свободной от ошибок среды WildFly или просто использовать Tomcat. Я отвечу на этот вопрос, как только мне удастся запустить эту штуку на Tomcat.


person R79    schedule 03.02.2015    source источник
comment
Взгляните сюда, пожалуйста: framework" title="jboss eap 6 3 beta с websocket и stockjs stomp js с использованием spring framework">stackoverflow.com/questions/24016996/   -  person Artem Bilan    schedule 04.02.2015
comment
@ArtemBilan Уже нашел это. В единственном ответе на вопрос первая ссылка мертва, а вторая ссылка ссылается на документацию и говорит мне только, что поддерживается undertow 1.0 (которую использует JBoss). Поиски о том, как использовать jboss-web.xml, относятся только к официальной документации без примеров того, как его привязать. Если кто-нибудь может объяснить, что это за вещь и как ее привязать, это может быть полезно.   -  person R79    schedule 04.02.2015
comment
Я думаю, вы имеете в виду этот github. com/jboss-developer/jboss-eap-quickstarts/tree/   -  person Artem Bilan    schedule 04.02.2015
comment
@ArtemBilan Большое спасибо. Теперь похоже, что этот пример работает неправильно. Кажется, что-то не так с местоположением xml (существенное сообщение об ошибке при запуске): Сообщение: Неожиданный элемент '{jboss.com/xml/ns/javaee}обнаружена возможность включения веб-сокетов}}   -  person R79    schedule 04.02.2015
comment
не могли бы вы обновить свой вопрос с помощью этого файла jboss-web.xml   -  person Brian Clozel    schedule 05.02.2015
comment
@BrianClozel добавил обновление под всей отправкой. Похоже, jboss-web.xml устарел.   -  person R79    schedule 08.02.2015


Ответы (1)


Я думаю, вы смешиваете здесь три вопроса.

«Невозможно обновить HTTP/1.1 без событий ввода-вывода» в JBoss EAP 6.3

Обычно это означает, что вы забыли активировать «websockets-enabled» в своей конфигурации. Файл jboss-web.xml теперь может быть объявлен устаревшим, но не для этой версии JBoss.

Wildfly 8.2 и WFLY-3439

Нигде не указано, что это связано с Spring. Не могли бы вы уточнить это? Вы столкнулись с этой проблемой?

Дикая муха 9.0.0.alpha1

В настоящее время Wildfly 9.0/undertow 1.2 официально не поддерживаются Spring (но они могут работать прямо сейчас из коробки) — следуйте SPR-12469 и сообщайте о проблемах там, если они у вас есть.

person Brian Clozel    schedule 08.02.2015
comment
jboss-web.xml не устарел. Следуйте этому: github.com/burrsutter/simplechat и последней документации: access.redhat.com/documentation/en-US/ . - person Jared Burrows; 12.03.2015