Java Web套接字聊天和EJB服务

Java Web套接字聊天和EJB服务,java,websocket,ejb-3.1,java-ee-7,inject,Java,Websocket,Ejb 3.1,Java Ee 7,Inject,我是新的JavaEE/EJB开发人员。我想为我的web应用程序创建聊天服务。聊天功能的主要功能是根据某些事件向用户发送简单消息。 代码如下: 聊天端点 @ServerEndpoint(value = "/chat") public class ChatEndpoint { @OnOpen public void open(final Session session, final EndpointConfig config) { } @OnMessage

我是新的JavaEE/EJB开发人员。我想为我的web应用程序创建聊天服务。聊天功能的主要功能是根据某些事件向用户发送简单消息。 代码如下:

聊天端点

@ServerEndpoint(value = "/chat")
public class ChatEndpoint {


    @OnOpen
    public void open(final Session session, final EndpointConfig config) {

    }

    @OnMessage
    public void message(final String msg) {

    }

    @OnError
    public void onError(Throwable t) {

    }

    @OnClose
    public void onClose(final Session session) {

    }

    public void sendMessage(@Observes ChatEvent event) {
        System.out.println("Try to dispatch new message: " + event.getMessage());
    }

}
事件类

public class ChatEvent {

    private final String message;

    public ChatEvent(final String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }

}
定时器类(发送一些随机消息)

@无状态
公共类聊天计时器{
@注入
事件;
@日程安排(秒=“*”,分钟=“*”,小时=“*”)
公共无效sendSomeRandomeMessage(){
System.out.println(“发送事件”);
fire(新的ChatEvent(“fromBean”+System.currentTimeMillis());
}
}
现在我的问题是:

  • 将@ServerEndpoint创建为@Stateless是否有任何问题(因为没有@Stateless,@Observes方法无法工作)
  • 如何跟踪所有打开的会话(用户)以向他们广播消息?(我目前的策略是在静态字段中保存它们,这似乎不正确!)

  • 1) 你试过了吗?2)是的,这很好。而不是使用静态字段,您可能会考虑单独的<代码> @ Apabtive Simulink bean来跟踪您的活动会话,这将允许您支持多种传输类型,并将会话管理与传输bean分开。1)我确实添加了它,它是有效的,至少通过简单的测试,但我认为这可能会导致一些问题与其他东西冲突。2) 我可以使用静态字段或使用@ApplicationScoped向数万名或更多用户广播内容吗?规模取决于大量不同的项目,但您选择的
    @ApplicationScoped
    与静态不会影响这一点。如果您希望扩展到单个服务器的能力之外,那么需要某种方式将会话外部存储在memcached或其他名称/值存储中。
    @Stateless
    public class ChatTimer {
    
        @Inject
        Event<ChatEvent> events;
    
        @Schedule(second = "*", minute = "*", hour = "*")
        public void sendSomeRandomeMessage(){
            System.out.println("Send event");
            events.fire(new ChatEvent("from bean " + System.currentTimeMillis()));
        }
    
    }