Groovy cometd:已发布到频道的消息未显示在已订阅的侦听器中

Groovy cometd:已发布到频道的消息未显示在已订阅的侦听器中,groovy,cometd,Groovy,Cometd,我正在尝试将测试数据发布到Comed演示版server频道members/hello/。握手完成后,可以在callback上获取订阅的消息,也可以在publish()callback上获取已发布的消息。但我无法在subscribe()listener上获取已发布的消息。 Groovy脚本: import org.cometd.bayeux.Message; import org.cometd.bayeux.Message.Mutable import org.cometd.bayeux.cli

我正在尝试将测试数据发布到
Comed演示版
server频道
members/hello/
。握手完成后,可以在
callback
上获取订阅的消息,也可以在
publish()
callback上获取已发布的消息。但我无法在
subscribe()
listener上获取已发布的消息。
Groovy脚本:

import org.cometd.bayeux.Message;
import org.cometd.bayeux.Message.Mutable
import org.cometd.bayeux.client.ClientSessionChannel;
import org.cometd.bayeux.client.ClientSessionChannel.MessageListener;
import org.cometd.client.BayeuxClient
import org.cometd.client.transport.ClientTransport
import org.cometd.client.transport.LongPollingTransport
import org.eclipse.jetty.client.HttpClient as MyHttpClient

ClientSessionChannel.MessageListener mylistener = new Mylistener();

def myurl = "http://localhost:8080/cometd/"

MyHttpClient httpClient = new MyHttpClient();

httpClient.start()

Map<String, Object> options = new HashMap<String, Object>();

ClientTransport transport = new LongPollingTransport(options, httpClient);

BayeuxClient client = new BayeuxClient(myurl, transport)

client.handshake(30000)

def channel = client.getChannel("/members/hello/")

channel.subscribe(mylistener,mylistener)  

while (true)

{

    sleep(5000)

    channel.publish( 'hai' )

}

class Mylistener implements ClientSessionChannel.MessageListener {

        public void onMessage(ClientSessionChannel channel, Message message) {

            println message

        }

    }
import org.cometd.bayeux.Message;
导入org.cometd.bayeux.Message.Mutable
导入org.cometd.bayeux.client.ClientSessionChannel;
导入org.cometd.bayeux.client.ClientSessionChannel.MessageListener;
导入org.cometd.client.bayexclient
导入org.cometd.client.transport.ClientTransport
导入org.cometd.client.transport.LongPollingTransport
将org.eclipse.jetty.client.HttpClient作为MyHttpClient导入
ClientSessionChannel.MessageListener mylistener=新建mylistener();
def myurl=”http://localhost:8080/cometd/"
MyHttpClient httpClient=新的MyHttpClient();
httpClient.start()
Map options=newhashmap();
ClientTransport=new LongPollingTransport(选项,httpClient);
BayeuxClient=新的BayeuxClient(myurl,传输)
客户握手(30000)
def channel=client.getChannel(“/members/hello/”)
频道订阅(mylistener,mylistener)
while(true)
{
睡眠(5000)
频道发布(‘海’)
}
类Mylistener实现ClientSessionChannel.MessageListener{
消息上的公共void(ClientSessionChannel通道,消息消息){
println消息
}
}

运行此脚本时,我无法在侦听器上获取已发布的数据,即使JVM没有使用
While
循环终止。我缺少什么?

您在以下位置指定了不正确的频道路径:

def channel = client.getChannel("/members/hello/")
频道路径不能以
/
结尾-它应该是
/members/hello

还要仔细检查您是否使用了正确的URL。我使用了非常简单的Comed服务器应用程序(),它使用
/dojo-jetty9-primer/
上下文路径,所以在我的例子中,Comed服务器的URL是:

def url = "http://localhost:8080/dojo-jetty9-primer/cometd/"
您还可以将脚本简化为以下内容:

import org.cometd.bayeux.Message
import org.cometd.bayeux.client.ClientSessionChannel
import org.cometd.client.BayeuxClient
import org.cometd.client.transport.LongPollingTransport
import org.eclipse.jetty.client.HttpClient

final String url = "http://localhost:8080/dojo-jetty9-primer/cometd/"

final HttpClient httpClient = new HttpClient()
httpClient.start()

final BayeuxClient client = new BayeuxClient(url, new LongPollingTransport([:], httpClient))
client.handshake()
client.waitFor(1000, BayeuxClient.State.CONNECTED)

final ClientSessionChannel channel = client.getChannel("/members/hello")
channel.subscribe(new MyListener())

while (true) {
    sleep(1000)
    channel.publish("test")
}

class MyListener implements ClientSessionChannel.MessageListener {
    @Override
    void onMessage(ClientSessionChannel channel, Message message) {
        println "[${new Date()}] Received message from channel (${channel.id}): ${message}"
    }
}
特别是客户端的一部分。握手(30000)
可以在您的脚本中简化-您不必在这里等待30秒

当您运行它时,您将在控制台中每1秒看到一条新消息:

[Mon Feb 19 10:15:02 CET 2018] Received message from channel (/members/hello): [data:test, channel:/members/hello]
[Mon Feb 19 10:15:03 CET 2018] Received message from channel (/members/hello): [data:test, channel:/members/hello]
[Mon Feb 19 10:15:04 CET 2018] Received message from channel (/members/hello): [data:test, channel:/members/hello]
[Mon Feb 19 10:15:05 CET 2018] Received message from channel (/members/hello): [data:test, channel:/members/hello]
[Mon Feb 19 10:15:06 CET 2018] Received message from channel (/members/hello): [data:test, channel:/members/hello]

希望有帮助。

注意这是一个Comed bug,它应该规范化频道名称,以便
/members/hello/
/members/hello
无法区分。提起诉讼。