Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [jetty-users] Migrating 9 to 10: what replaces WebSocketServlet and JSON.parse() ?

You are using a JettyWebSocketCreator.

Get rid of  factory.register(WordsListener.class);

Joakim Erdfelt / joakim@xxxxxxxxxxx


On Fri, Sep 3, 2021 at 11:09 AM Alexander Farber <alexander.farber@xxxxxxxxx> wrote:
Hi, thank you for the helpful hints, now my WAR compiles.

However when I launch it by:

1) First running once on Win 10 / Java 11:

java -jar jetty-home-10.0.6\start.jar jetty.home=jetty-home-10.0.6 jetty.base=jetty.base --add-module=http,servlet,webapp,deploy,resources,websocket

2) Then running

@SET JETTY_HOME=%~dp0\jetty-home-10.0.6
@SET JETTY_BASE=%~dp0\jetty.base
java -Djdbc.drivers=org.postgresql.Driver -jar %JETTY_HOME%\start.jar jetty.home=%JETTY_HOME% jetty.base=%JETTY_BASE%

Then Jetty 10 starts fine initially:

2021-09-03 17:59:51.475:INFO :oejsh.ContextHandler:main: Started o.e.j.w.WebAppContext@42a9e5d1{/en,file:///C:/Users/U299FAV/src/slova/webapp/target/words-4.0/,AVAILABLE}{C:\Users\U299FAV\src\slova\jetty.base/../webapp/target/words-4.0.war}
2021-09-03 17:59:51.485:INFO :oejsh.ContextHandler:main: Started o.e.j.s.h.ContextHandler@2c1b9e4b{/,null,AVAILABLE}
2021-09-03 17:59:51.507:INFO :oejs.AbstractConnector:main: Started ServerConnector@7e027a05{HTTP/1.1, (http/1.1)}{0.0.0.0:8080}
2021-09-03 17:59:51.518:INFO :oejs.Server:main: Started Server@624ea235{STARTING}[10.0.6,sto=5000] @4326ms

But when I try accessing the following path (I put the XML file under jetty.base\webapps):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" 
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
    <Set name="contextPath">/ru</Set>
    <Set name="war"><SystemProperty name="jetty.base"/>/../webapp/target/words-4.0.war</Set>
</Configure>

Then Jetty 10 reports the error:

2021-09-03 18:00:00.583:WARN :oejshC.ru:qtp1072410641-16: unavailable
java.lang.RuntimeException: java.lang.NoSuchMethodException: de.afarber.WordsListener.<init>()
        at org.eclipse.jetty.websocket.server.JettyWebSocketServlet$CustomizedWebSocketServletFactory.register(JettyWebSocketServlet.java:218)
        at de.afarber.WordsServlet.configure(WordsServlet.java:646)
        at org.eclipse.jetty.websocket.server.JettyWebSocketServlet.init(JettyWebSocketServlet.java:168)
        at de.afarber.WordsServlet.init(WordsServlet.java:652)
        at javax.servlet.GenericServlet.init(GenericServlet.java:180)
        at org.eclipse.jetty.servlet.ServletHolder$Wrapper.init(ServletHolder.java:1305)
        at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:633)
        at org.eclipse.jetty.servlet.ServletHolder.getServlet(ServletHolder.java:486)
        at org.eclipse.jetty.servlet.ServletHolder.prepare(ServletHolder.java:731)
        at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:503)
        at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:131)
        at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:580)
        at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:122)
        at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:223)
        at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1571)
        at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:221)
        at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1372)
        at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:176)
        at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:463)
        at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1544)
        at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:174)
        at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1294)
        at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:129)
        at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:192)
        at org.eclipse.jetty.server.handler.HandlerList.handle(HandlerList.java:51)
        at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:122)
        at org.eclipse.jetty.server.Server.handle(Server.java:562)
        at org.eclipse.jetty.server.HttpChannel.lambda$handle$0(HttpChannel.java:406)
        at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:663)
        at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:398)
        at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:282)
        at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:319)
        at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:100)
        at org.eclipse.jetty.io.SocketChannelEndPoint$1.run(SocketChannelEndPoint.java:101)
        at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:894)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1038)
        at java.base/java.lang.Thread.run(Thread.java:834)

My WordsListener.java looks like:

import org.eclipse.jetty.util.ajax.JSON;
import org.eclipse.jetty.websocket.api.Session;
import org.eclipse.jetty.websocket.api.WebSocketListener;
import org.eclipse.jetty.websocket.api.WriteCallback;

public class WordsListener implements WebSocketListener {
    public WordsListener(WordsInterface servlet, String databaseUrl) {
        mServlet = servlet;
        mDatabaseUrl = databaseUrl;
    }
    
    @Override
    public void onWebSocketConnect(Session session) {
        mSession = session;
        InetSocketAddress address = (InetSocketAddress) session.getRemoteAddress();
        // use getHostString(), because it does not perform DNS resolving
        mAddress = address.getHostString() + ":" + address.getPort();
        LOG.info("onWebSocketConnect: address={} session={}", mAddress, mSession);
    }

    @Override
    public void onWebSocketClose(int statusCode, String reason) {
        LOG.info("onWebSocketClose: mUid={} address={} statusCode={} reason={}", mUid, mAddress, statusCode, reason);
        remove(false);
    }
}

And in my servlet I have:

import org.eclipse.jetty.websocket.api.WriteCallback;
import org.eclipse.jetty.websocket.server.JettyWebSocketServlet;
import org.eclipse.jetty.websocket.server.JettyWebSocketServletFactory;

public class WordsServlet extends JettyWebSocketServlet {
    @Override
    public void configure(JettyWebSocketServletFactory factory) {
        mLanguage = System.getenv("COUNTRY");
        mBundle = ResourceBundle.getBundle("strings", LOCALES.get(mLanguage));
        factory.setIdleTimeout(Duration.ofSeconds(IDLE_TIMEOUT_SECONDS));
        factory.setMaxBinaryMessageSize(0);
        factory.setMaxTextMessageSize(64 * 1024);
        factory.register(WordsListener.class);
        factory.setCreator(new WordsCreator(this, mBundle.getString(STR_DATABASE_URL)));
    }
    
    @Override
    public void init() throws ServletException {
        super.init();
        
        try {
            Class.forName("org.postgresql.Driver");
        } catch (ClassNotFoundException ex) {
            throw new ServletException(ex);
        }
    }

And my WordsCreator.java

import org.eclipse.jetty.websocket.server.JettyServerUpgradeRequest;
import org.eclipse.jetty.websocket.server.JettyServerUpgradeResponse;
import org.eclipse.jetty.websocket.server.JettyWebSocketCreator;

public class WordsCreator implements JettyWebSocketCreator {
    private final WordsInterface mServlet;
    private final String mDatabaseUrl;

    public WordsCreator(WordsInterface servlet, String databaseUrl) {
        mServlet = servlet;
        mDatabaseUrl = databaseUrl;
    }

    @Override
    public Object createWebSocket(JettyServerUpgradeRequest req, JettyServerUpgradeResponse resp) {
        return new WordsListener(mServlet, mDatabaseUrl);
    }
}

Please help me :-)

Regards
Alex


_______________________________________________
jetty-users mailing list
jetty-users@xxxxxxxxxxx
To unsubscribe from this list, visit https://www.eclipse.org/mailman/listinfo/jetty-users

Back to the top