javamavenglassfishglassfish-embedded

Websocket application doesnt run in glassfish embedded, but runs in standalone version


Good evening,

I have a simple websocket application. It runs fine if I deploy it to standalone glassfish server either using asadmin command or my IDE. When I use glassfish-embedded, everything seems fine (no error messages), but I get 404 at endpoint which should be serving websockets.

WebSocket connection to 'ws://localhost:8080/test/websocket/zelitomasfds/efdsdfsdf' failed: Error during WebSocket handshake: Unexpected response code: 404

Here is the code, should be pretty simple

/* Imports skipped */    

@ServerEndpoint("/websocket/{email}/{type}")
public class SimpleHOTPWebSocket {
    @OnMessage
    public void onMessage(String message, Session session)
            throws IOException, InterruptedException {

        System.out.println("Received: " + message);
    }

    @OnOpen
    public void onOpen(Session session, 
                       EndpointConfig c,
                       @PathParam("email") String email,
                       @PathParam("type") String type) {
        System.out.println("Client " + email + " connected as a " + type);
    }

    @OnClose
    public void onClose(Session session) {
        System.out.println("Connection closed");
    }
}

Here is my pom.xml:

I've tried running it using webapp-runner and jetty as well, so problem must be somewhere in my code or pom.xml.

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>cf.zelitomas</groupId>
    <artifactId>simplesocket</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>simplesocket</name>
    <pluginRepositories>
        <pluginRepository>
            <id>m.g.o-groups-glassfish</id>
            <url>http://maven.glassfish.org/content/groups/glassfish</url>
        </pluginRepository>
    </pluginRepositories>

    <properties>
        <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-web-api</artifactId>
            <version>7.0</version>
            <scope>provided</scope>
        </dependency>


        <dependency>
            <groupId>org.glassfish.extras</groupId>
            <artifactId>glassfish-embedded-all</artifactId>
            <version>3.1.1</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>

                    <compilerArguments>
                        <endorseddirs>${endorsed.dir}</endorseddirs>
                    </compilerArguments>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.3</version>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.6</version>
                <executions>
                    <execution>
                        <phase>validate</phase>
                        <goals>
                            <goal>copy</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${endorsed.dir}</outputDirectory>
                            <silent>true</silent>
                            <artifactItems>
                                <artifactItem>
                                    <groupId>javax</groupId>
                                    <artifactId>javaee-endorsed-api</artifactId>
                                    <version>7.0</version>
                                    <type>jar</type>
                                </artifactItem>
                            </artifactItems>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.glassfish</groupId>
                <artifactId>maven-embedded-glassfish-plugin</artifactId>
                <version>3.0.1</version>
                <configuration>
                    <app>${project.build.directory}/${build.finalName}.war</app>
                    <autoDelete>true</autoDelete>
                    <port>8080</port>
                    <contextRoot>test</contextRoot>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

I'm starting server with mvn clean install embedded-glassfish:run

If you wanted to look at source code or try the war file, please feel free to download it here (war, source) Please, can anyone see what am I doing wrong?

Thanks for your help, I'm struggling with this for more that 10 hours now.

And also sorry for my bad English


Solution

  • You mention glassfish-embedded in title, but you also mention you tried with jetty and webapp-runner, so I understand that in "embedded" mode you don't care about which you use.

    So I downloaded your sources, tried it, reproduced the issue (same behavior), and... removed almost everything from the POM and added the required bits from scratch, using Jetty because I'm more familiar with it, and it only needs central maven repository (no repo added). Overall it's a lot simpler.

    Your code only needs a single dependency: javax.websocket-api. All the rest is configuration for jetty:run (which I configured with context path "/test" to match your expectations, as default is "/").

    <?xml version="1.0" encoding="UTF-8"?>
    <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/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>cf.zelitomas</groupId>
        <artifactId>simplesocket</artifactId>
        <version>1.0-SNAPSHOT</version>
        <packaging>war</packaging>
    
        <name>simplesocket</name>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <jetty-version>9.4.6.v20170531</jetty-version>
        </properties>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.6.1</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.eclipse.jetty</groupId>
                    <artifactId>jetty-maven-plugin</artifactId>
                    <version>${jetty-version}</version>
                    <configuration>
                        <webApp>
                            <contextPath>/test</contextPath>
                        </webApp>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    
        <dependencies>
            <dependency>
                <groupId>javax.websocket</groupId>
                <artifactId>javax.websocket-api</artifactId>
                <version>1.1</version>
                <scope>provided</scope>
            </dependency>
        </dependencies>
    </project>
    

    In short: replace your POM with the above, execute mvn jetty:run, and visit http://localhost:8080/test.