大气@ManagedService Injection因WebSockets而失败

时间:2014-07-14 23:03:20

标签: websocket glassfish-4 atmosphere

我在使用Atmosphere时遇到使用websocket传输的问题。代码如下所示:

当我使用long-polling作为传输时,一切正常。我可以毫无问题地在注入的类上调用方法。但是,当我将客户端配置为使用websocket时,我最终得到一个异常IllegalStateException: Singleton not set for org.glassfish.main.core.kernel并且方法调用失败。我怀疑这是由于Atmosphere / Glassfish处理普通servlet(以及ApplicationContext)环境之外的WebSockets的方式。

@ManagedService(path = "/rt/test/{id}")
public class TestWebService {

    private @Inject TestWebController controller;

    @Get
    public void onGet(AtmosphereResource r) {
        Broadcaster b = controller.getBroadcaster(r.getRequest().getPathInfo(), true);
        if(b != null)
            r.setBroadcaster(b);
        else
            r.getResponse().setStatus("Invalid parameter", 400);
    }
}

现在是控制器:

@ApplicationScoped
public class TestWebController {
    private @Inject IdValidator validator;

    public void eventHandler(@Observes MyEvent myEvent) {
        Broadcaster b = getBroadcaster(myEvent.getId(), false);
        if(b != null)
            b.broadcast(myEvent.getMessage());
    }

    public Broadcaster getBroadcaster(String id, boolean create) {
        if(validator.validate(id)) {
            Broadcaster b = BroadcasterFactory.getDefault().lookup(id);
            if(b == null && create)
                b = BroadcasterFactory.getDefault().get(id);

            return b;
        } 
        return null;
    }
}

我已经尝试过不同的控制器范围以及其他所有内容。如果我将广播器创建逻辑移动到Web服务类中,它可以正常工作(没有注释)但是我失去了验证id的能力,这有点重要。

我使用Glassfish 4和Atmosphere 2.1.7加载了atmosphere-runtimeatmosphere-annotationsatmosphere-cdi个罐子。

我将尝试最新的2.2版本候选版本,但错误跟踪器中没有提及任何类似问题,所以我不乐观。

更新:Atmosphere 2.2 RC3也出现同样的问题。

更新:通过使用@ javax.ejb.Stateful对类进行批注,我能够完成这项工作。我还没有进行任何实质性测试,看看是否有任何副作用,但我能够连接websocket并确认注射正确。我使用的是Atmosphere 2.2.0。

1 个答案:

答案 0 :(得分:0)

这实际上是由于CDI规范的缺点: https://java.net/jira/plugins/servlet/mobile#issue/GLASSFISH-20468

遗憾的是,我现在不得不求助于长时间的民意调查。