原文地址:
http://cometd.org/documentation/cometd-java/server/services
CometD Java 服务器服务
由 sbordet 提交于星期二,2009/11/17-11:39。
CometD Java 服务器 API: 服务
CometD 服务是一个 Java 类,允许开发人员在Bayeux频道接收Bayeux消息时指定运行的代码。
CometD 服务实现
CometD 服务是一个 Java 类,它扩展 CometD 的org.cometd.server.BayeuxService类,指定感兴趣的Bayeux 频道的服务,并且,符合扩展 BayeuxService 类的需要如:
public class EchoService extendsBayeuxService (1)
{
public EchoService(Bayeux bayeux) (2)
{
super(bayeux, "echo"); (3)
subscribe("/echo", "processEcho"); (4)
}
public void processEcho(Client remote, Map<String, Object> data) (5)
{
remote.deliver(getClient(), "/echo", data, null); (6)
}
}
这是一种简单的 echo 服务,返回远程客户端频道"/ echo "发送的消息到远程客户端本身。
注意以下几点:
(1)我们是从 org.cometd.server.BayeuxService 的扩展类
(2)我们采用一个org.cometd.Bayeux 对象创建了一个构造函数
(3)我们调用父类的构造函数,传递 Bayeux 对象和任意的服务名称,
上面的例子用的是:"echo"
(4)我们订阅频道"/ echo ",并且指定在该通道的消息到达时,
必须调用的方法名称
(5)我们需要定义一个与方法(4)中相同名称的方法,它有适当的参数(见下文)
(6)我们使用 org.cometd.Client API 把消息返回该特定客户端
BayeuxService 类规定回调方法必须具有下列参数之一:
// Obtains the remote client object and themessage object
public void processEcho(Client remote,Message message)
// Obtains the remote client object and themessage's data object
// (additional message information, such asthe channel or the id is lost)
public void processEcho(Client remote,Map<String, Object> data)
// Obtains the remote client object, thechannel name, the message object and the message id
public void processEcho(Client remote,String channelName, Message message, String messageId)
// Obtains the remote client object, thechannel name, the message's data object and the message id
public void processEcho(Client remote,String channelName, Map<String, Object> data, String messageId)
请注意,在 subscribe() 方法中指定的频道名称可以是通配符,例如:
public class BaseballTeamService extendsBayeuxService
{
public BaseballTeamService(Bayeux bayeux)
{
super(bayeux, "baseballTeam");
subscribe("/baseball/team/*","processBaseballTeam");
}
public voidprocessBaseballTeam(Client remote, String channelName, Map<String,Object> data, String messageId)
{
// Uponreceiving a message on channel /baseball/team/*, forward to channel/events/baseball/team/*
getBayeux().getChannel("/events" + channelName, true).publish(getClient(),data, null);
}
}
此外请注意,在第一个示例中我们如何用Client.deliver() 向特定远程客户端来发送消息,而在第二个我们用 Channel.publish() 给订阅频道"/events/baseball/team/*"的人发送一条消息。
一旦您在 web 应用程序中已经编写了 Bayeux 服务,就是时候用普通模式或sping模式来配置管理它们。
联系客服