0

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

这是我的模型和控制器,使用 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();
            }   
        }
    }
}
}
4

2 回答 2

0

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

if(!event.getReceiver().equals(user)) continue;
于 2013-01-27T16:39:37.870 回答
0

需要注意的一个小问题

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

于 2013-12-16T14:27:29.030 回答