当前位置: 首页 > 知识库问答 >
问题:

OnMessage(WebSocket)在Glassfish中不工作,Java8

公西苗宣
2023-03-14

我在运行Java EE应用程序时遇到了问题。我有下面的服务器edpoint代码:

import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.enterprise.context.ApplicationScoped;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;



@ApplicationScoped
@ServerEndpoint(
        value = "/model" 
)
public class ModelWebSocket {


    private final ModelHandle model = new ModelHandle();   

    @OnOpen
    public void onOpen(Session session) throws IOException {

    }

    @OnError
    public void onError(Throwable error) {
        /// put model back to pool, log erros
    }


    // This code never calls,
    @OnMessage
    public void onMessage(String message, Session session) {

        //TODO: Add decoders/encoders to annotations
        try {       
            ModelInputData inputData = new ModelInputDataDecoder().decode(message);         
            double input = inputData.getInput();
            double timespan = inputData.getTimespan();

            model.setInput(input);

            ModelProcessData process = model.getOuptput(timespan);

            try {
                session.getBasicRemote().sendText(
                        new ModelProcessDataEncoder().encode(process)
                );
            } catch (IOException | EncodeException ex) {
                Logger.getLogger(ModelWebSocket.class.getName()).log(Level.SEVERE, null, ex);
            }
        } catch (DecodeException ex) {
            Logger.getLogger(ModelWebSocket.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

}

And the following stub for a client stub in javascript:

<!DOCTYPE html>
<!--
This is a test
-->
<html>
    <head>
        <title>Test</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
    </head>
    <body>
         <!-- insert the main script here -->

        <script type ="text/javascript">

            //copied from https://learn.javascript.ru/websockets
            var socket = new WebSocket(
                    "ws://localhost:8080/SimulatorWeb/model"
                    );

            socket.onopen = function () {
                alert("Connection OK");
            };

            socket.onclose = function (event) {
                if (event.wasClean) {
                    alert('Connection closed');
                } else {
                    alert('Connection interrupted'); // например, "убит" процесс сервера
                }
                alert('Code: ' + event.code + ' redason: ' + event.reason);
            };

            socket.onmessage = function (event) {
                alert("Data accepted " + event.data);
            };

            socket.onerror = function (error) {
                alert("Error " + error.message);
            };



            function send(){ 
              socket.send("dummy");
            }
        </script>

        <button type="button" onclick="send();" >Send</button>
    </body>
</html>

客户端似乎发送消息,但OnMessage从未被拦截。当我启动Glassfish 4.1.1时,出现以下警告:

  • WARN:WELD-000411:观察者方法[BackedAnnotatedMethod]私有org.glassfish.jersey.ext.cdi1x.internal.CdiComponentProvider.processAnnotatedType(@Obts ProcessAnnotatedType)接收所有带注释类型的事件。考虑使用@SusAnnotions或带边界的泛型类型来限制事件。WARN:WELD-000411:观察者方法[BackedAnnotatedMethod]公共org.glassfish.jms.injection.JMSCDIExtension.processAnnotatedType(@Obds ProcessAnnotatedType)接收所有带注释类型的事件。考虑使用@SusAnnotions或带边界的泛型类型来限制事件。WARN:WELD-000411:观察者方法[BackedAnnotatedMethod]org.glassfish.sse.impl.ServerSentEventCdiExtension.processAnnotatedType(@Obts ProcessAnnotatedType, BeanManager)接收所有带注释类型的事件。考虑使用@SusAnnotions或带边界的泛型类型来限制事件。

我花了很多时间进行调试,但仍然无法找到问题所在……我使用Java8SDK和NetBeansIDE。

(在代码中我没有使用解码器/编码器,因为我认为它们是问题所在并将它们从ServerEnpoint中删除)

共有1个答案

充鑫鹏
2023-03-14

我不知道Glassfish有什么问题...我切换到Tomcat,手动将我需要的所有外部库添加到WEB_INF/lib中(在我的例子中是javax.json)。Tomcat似乎没有给原始代码任何警告,一切都运行良好。

 类似资料:
  • 我对JMS编码是新手。我试图从独立的java客户端创建消息,该客户端创建并将消息发送到队列,消息驱动bean用于进一步处理消息。 我使用的是Glassfish应用服务器(3.1)。并设置从独立java客户机创建消息的所有内容。 下面是我的代码:客户端 消息驱动bean: 问题是:没有被调用。我错过什么了吗?请帮帮我.

  • 我成功订阅了一个队列,但在发送消息时,另一个用户没有收到它 消息代理配置: 我如何发送消息 在ws-connection上创建自定义用户主体 在客户端,我连接套接字 当我连接到stomp时,我会在浏览器控制台中看到下一条消息 是此用户的实际id 我将id为1的用户和id为2的用户订阅到同一队列,当我从用户1向用户2发送消息时,第二个用户没有收到消息<我错过什么了吗?

  • 用"cro sub"创建了一个web套接字服务器。 这名客户写道: 我在tcp转储中看到了来自服务器的响应代码101(交换协议),但我没有看到从客户端发送到服务器的消息。 那么,我做错了什么? 另一个问题,不应该“$connection.send”返回一个promise还是什么?如果发送时出错怎么办? 另一个问题是:服务器似乎只理解IPV6地址...如何让它理解IPV4地址? 就这样,现在。 使现

  • 我试图在Linux Red Hat Entreprise Linux release 5.11(Tikanga)服务器上安装GlassFish4.0。 因此,我按照以下网站说明成功地在该服务器上安装了Java JDK1.7.0_79和NetBeans4.0:https://blog.idrsolutions.com/2014/02/tutorial-setting-up-glassfish-on-

  • 我通过web套接字发送一个文本到一个Java服务器,但不会被调用,这是我为客户端使用的函数(WebSocketTest),当我关闭服务器时,会正确调用on近函数的警报消息 这就是我在服务器上接收到的内容 这是服务器端

  • null edit 根据BalusC的答案,我删除了myfaces-bundle-2.1.7.jar,现在我得到以下异常: 知道有什么问题吗?