Websocket 连接上基于 Apache Camel 内容的路由
Apache Camel Content Based Routing on Websocket Connections
我有一个假设场景:假设我有一个 Apache Camel websocket 服务器并且我允许许多 websocket 连接。每个客户端连接都需要与一个 ClientID 相关联。 ClientID 由新连接通过 InitConnection json 消息获取,其中 ClientID 是消息的成员。问题是:是否可以让 camel 将 websocket 实例与 ClientID 相关联以执行基于内容的路由?
是的,这是可能的。您可以通过以下方法检索每个客户端的 UUID:
from("direct:Consumer1")
.process(new Processor() {
public void process(Exchange exchange) throws Exception {
Map<String, Object> headers=exchange.getIn().getHeaders();
//you can get a unique connection key from the exchange header.
//store this key somewhere, to send messages to particular client.
String uniqueConnectionKey=headers.get("websocket.connectionKey").toString();
//you can get message from the client like below.
String dataFromClient=exchange.getIn().getBody().toString();
}
}).end();
您需要将此唯一密钥映射到您的客户端 ID,以便您可以使用此 UUID 向特定客户端发送消息。
CamelContext camelContext=new DefaultCamelContext();
ProducerTemplate template=camelContext.createProducerTemplate();
template.sendBodyAndHeader("direct:Producer1", {message}, "connectionKey", {connectionkey});
direct:Producer1:生产者端点名称。
connectionkey : 一个唯一的连接密钥,你将从 websocket 消费者中的交换 header 中获得。
消息:发送到 websocket 端点的消息。
编辑:
这是生产者路线。
from("direct:Producer1").
//we will use this connectionKey for uniquely identifying each connection from the client.
setHeader(WebsocketConstants.CONNECTION_KEY, header("connectionKey")).
to("websocket://{host}:{port}/camel-websocket?sendToAll=false").end();
我有一个假设场景:假设我有一个 Apache Camel websocket 服务器并且我允许许多 websocket 连接。每个客户端连接都需要与一个 ClientID 相关联。 ClientID 由新连接通过 InitConnection json 消息获取,其中 ClientID 是消息的成员。问题是:是否可以让 camel 将 websocket 实例与 ClientID 相关联以执行基于内容的路由?
是的,这是可能的。您可以通过以下方法检索每个客户端的 UUID:
from("direct:Consumer1")
.process(new Processor() {
public void process(Exchange exchange) throws Exception {
Map<String, Object> headers=exchange.getIn().getHeaders();
//you can get a unique connection key from the exchange header.
//store this key somewhere, to send messages to particular client.
String uniqueConnectionKey=headers.get("websocket.connectionKey").toString();
//you can get message from the client like below.
String dataFromClient=exchange.getIn().getBody().toString();
}
}).end();
您需要将此唯一密钥映射到您的客户端 ID,以便您可以使用此 UUID 向特定客户端发送消息。
CamelContext camelContext=new DefaultCamelContext();
ProducerTemplate template=camelContext.createProducerTemplate();
template.sendBodyAndHeader("direct:Producer1", {message}, "connectionKey", {connectionkey});
direct:Producer1:生产者端点名称。
connectionkey : 一个唯一的连接密钥,你将从 websocket 消费者中的交换 header 中获得。
消息:发送到 websocket 端点的消息。
编辑: 这是生产者路线。
from("direct:Producer1").
//we will use this connectionKey for uniquely identifying each connection from the client.
setHeader(WebsocketConstants.CONNECTION_KEY, header("connectionKey")).
to("websocket://{host}:{port}/camel-websocket?sendToAll=false").end();