【问题标题】:CometD Issues with Publishing DataCometD 发布数据的问题
【发布时间】:2013-02-12 15:57:27
【问题描述】:

我是 CometD 的新手,在频道上发布数据时遇到问题。由于未在我的频道上调用 handshake(),我收到以下错误:

Sender : null Sender : L:/abc/1? Exception in thread "Thread-9" java.lang.IllegalStateException: Method handshake() not invoked for local session L:/abc/1? at org.cometd.server.LocalSessionImpl.getId(LocalSessionImpl.java:161) at org.cometd.server.ServerChannelImpl.publish(ServerChannelImpl.java:309) at packagename.CometDSender.sendData(CometDSender.java:64) at packagename.ProcessorImp.processData(ProcessorImp.java:18) at packagename.TestSource.processNewData(TestSource.java:50) at packagename.TestSource.run(TestSource.java:36) at java.lang.Thread.run(Unknown Source)

但是当我包含 sender.handshake() 时,我得到以下异常

    Sender : null
Sender : L:/abc/1?
Exception in thread "Thread-9" java.lang.NullPointerException
    at org.cometd.server.BayeuxServerImpl.freeze(BayeuxServerImpl.java:868)
    at org.cometd.server.BayeuxServerImpl.doPublish(BayeuxServerImpl.java:823)
    at org.cometd.server.BayeuxServerImpl.handle(BayeuxServerImpl.java:649)
    at org.cometd.server.LocalSessionImpl.doSend(LocalSessionImpl.java:214)
    at org.cometd.server.LocalSessionImpl.handshake(LocalSessionImpl.java:125)
    at org.cometd.server.LocalSessionImpl.handshake(LocalSessionImpl.java:110)
    at packagename.CometDSender.sendData(CometDSender.java:62)
    at packagename.ProcessorImp.processData(ProcessorImp.java:18)
    at packagename.TestSource.processNewData(TestSource.java:50)
    at packagename.TestSource.run(TestSource.java:36)
    at java.lang.Thread.run(Unknown Source)

我在下面包含了我的班级。如果我遗漏了什么,有人可以告诉我:

@Service

公共类 CometDSender 实现 Sender {

@Inject
private BayeuxServer bayeuxServer;

@Session
private LocalSession sender;

private String channelName = null;

// setup CometD Channel
public CometDSender() {

    this.channelName = "/abc/1";

    System.out.println("bayeuxServer : " + (bayeuxServer == null ? "Is Null" : "Is Not Null"));
    if (bayeuxServer == null) {
        bayeuxServer = new BayeuxServerImpl();
    }

    bayeuxServer.createIfAbsent(channelName, new ConfigurableServerChannel.Initializer() {
    public void configureChannel(ConfigurableServerChannel channelName) {
        System.out.println("channel : " + (channelName == null ? "Is Null" : "Is Not Null"));
        channelName.setPersistent(true);
        channelName.setLazy(true);
        }
    });

}

public void sendData(Agent data) {

    // Convert the Update business object to a CometD-friendly format
    Map<String, Object> cometData = new HashMap<String, Object>(4);
    cometData.put("ID", data.getID());      

    // Publish to all subscribers
    ServerChannel channel = bayeuxServer.getChannel(channelName);
    System.out.println("Sender : " + sender);       

    if (sender == null) {
        sender = bayeuxServer.newLocalSession(channelName);
        System.out.println("Sender : " + sender);
        sender.handshake();         
    }   
    channel.publish(sender, cometData, null);

}

}

【问题讨论】:

    标签: cometd bayeux


    【解决方案1】:

    除非您知道自己在做什么,否则不得创建 BayeuxServerImpl 实例,这同样适用于 LocalSession。 由于您使用的是 CometD 服务,因此这些字段必须是非空的,并且您不能自己创建它们。 它们可能为空,这是因为您很可能在 web.xml(您没有发布)中有错误配置。

    请阅读有关CometD services 的文档并关注tutorials:他们将逐步指导您解决您使用 CometD 服务遇到的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-03
      • 2011-02-24
      • 1970-01-01
      相关资源
      最近更新 更多