我在使用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-runtime
,atmosphere-annotations
和atmosphere-cdi
个罐子。
我将尝试最新的2.2版本候选版本,但错误跟踪器中没有提及任何类似问题,所以我不乐观。
更新:Atmosphere 2.2 RC3也出现同样的问题。
更新:通过使用@ javax.ejb.Stateful对类进行批注,我能够完成这项工作。我还没有进行任何实质性测试,看看是否有任何副作用,但我能够连接websocket并确认注射正确。我使用的是Atmosphere 2.2.0。
答案 0 :(得分:0)
这实际上是由于CDI规范的缺点: https://java.net/jira/plugins/servlet/mobile#issue/GLASSFISH-20468
遗憾的是,我现在不得不求助于长时间的民意调查。