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

播放框架1.2.5 Websocket

燕钟展
2023-03-14

而是使用EventStream而不是ArchivedEventStream,当我运行命令alert(通知)消息时,会转到除原始发件人之外的所有连接套接字,我也可以如何发送到原始发件人。

这是我的模型和控制器,使用WebSocket

事件模型

public class EventModel {

// ~~~~~~~~~ Let's chat! 

final EventStream<EventModel.Event> events = new EventStream<EventModel.Event>(100);

/**
 * Get the event
 */

public EventStream<EventModel.Event> getEventStream() {
    return events;
}
/**
 * A user say something on the room
 */

public void _alert(Notification notification){
    if(notification == null) return;
    events.publish(new EventModel.NotificationEvent(notification));
}


// ~~~~~~~~~ Events

public static abstract class Event {

    final public String type;
    final public Long timestamp;
    public boolean sended;

    public Event(String type) {
        this.sended = false;
        this.type = type;
        this.timestamp = System.currentTimeMillis();
    }

}

public static class NotificationEvent extends EventModel.Event{
    public final Notification notification;
    public NotificationEvent(Notification notification) {
        super("notification");
        this.notification = notification;
    }

    public User getReceiver(){
        return notification.receiver;
    }
}


// EventModel factory

static EventModel instance = null;
public static EventModel get() {
    if(instance == null) {
        instance = new EventModel();
    }
    return instance;
}

//Alert notification
public static void alert(Notification notification){
    get()._alert(notification);
}

}

这是控制器

public class MyWebSocket extends RootController {

public static class WebSocket extends WebSocketController {

    public static void echo(Long userId) {
        //Security
        User user = User.findById(userId);   

        EventModel eventCentre = EventModel.get();

        // Socket connected, join the chat room
        EventStream<EventModel.Event> eventStrean = eventCentre.getEventStream();

        // Loop while the socket is open
        while(inbound.isOpen()) {

            // Wait for an event (either something coming on the inbound socket channel, or ChatRoom messages)

            Either<WebSocketEvent,EventModel.Event> e = await(Promise.waitEither(
                inbound.nextEvent(), 
                eventStrean.nextEvent()
            ));

            //Handle if get any notification 
            for(EventModel.NotificationEvent event: ClassOf(EventModel.NotificationEvent.class).match(e._2)) {

                if(!event.getReceiver().equals(user)) continue;
                outbound.send(event.notification.toJson());
            }      

            // Case: The socket has been closed
            for(WebSocketClose closed: SocketClosed.match(e._1)) {
                disconnect();
            }   
        }
    }
}
}

共有2个答案

任小云
2023-03-14

一个需要注意的小问题

https://github.com/playframework/play1/pull/709

康赞
2023-03-14

要发送给原始发件人,也请删除或注释掉这一行:

if(!event.getReceiver().equals(user)) continue;
 类似资料:
  • Rest服务器(Play Framework)中的相关问题在负载测试期间出现“读取超时”异常 java版本“1.8.0_31”java(TM)SE运行时环境(Build1.8.0_31-B13)java HotSpot(TM)64位服务器VM(Build25.31-B07,混合模式) 我正在我的本地PC中测试jmeter。我使用了2000个线程,出现了超时异常,并且Socket不知为什么没有关闭。

  • 在用400k记录查询MongoDb时,我得到了< code>OutOfMemoryError。我收集了大约40万条用户记录。当我试图检索所有用户(在弹性搜索中转储)时,我得到了< code>OutOfMemoryError错误。 我已经浏览过这个链接,在application.config中添加了jvm.memory=-Xms64m -Xmx1024m,但还是一样的异常。 这是我的堆栈跟踪 -

  • 问题内容: 我想知道(我的Java应用程序的)播放框架版本与我的应用程序的Java版本之间是否有任何联系? 示例:如果我使用play 2.2.1并在计算机上安装了java8。我可以在代码中使用java8吗? 如果有连接。java8的第一个播放版本是什么? 谢谢你妮芙 问题答案: Play 2.3.x是提及Java 8的第一个版本,请参见此处 今天早晨,我正在与我的一位同事交谈,他发现运行2.1.x

  • 这些是以下类别: 在控制器文件中,我有以下文件 列表getQuestion()中的size()引发LazyInitializationException,因为没有打开的会话 我知道,将fetch类型更改为EAGER或在QuestionRepository中的函数定义上方使用JPQL查询可能会解决这个问题,但在我的应用程序中,有些地方没有帮助,我需要延迟fetch。 如何使get问题()函数中的整个

  • 我不熟悉这个框架,尝试使用JavaWS调用RESTful API。我一直在努力解决这个问题。这就是我目前的情况: 这段代码基于JavaWS文档(我发现它非常混乱),旨在发出请求。我认为它的工作原理是重复“ok”结果的完成阶段,该结果包含一个字符串,该字符串是将响应转换为文本的结果。 然后从控制器调用此代码: 我目前收到一个错误,上面写着“变量ws可能没有初始化”,这是有意义的,因为我没有初始化ws

  • 我想知道如何使用Play2.0中的模型和下面列出的查询来查询数据库。我没有看到将直接sql传递到play framework 2.0中的选项。 我想得到一份特定月份的费用清单。 我看到的选项是查询所有费用,然后使用Date对象解析它们列出的月份。 我认为应该有一种有效的方法,我似乎找不到一种使用ebean和Java play framework 2.0来执行此查询的方法。 使现代化 谢谢Nico,