У меня есть гипотетический сценарий: давайте представим, что у меня есть сервер веб-сокетов Apache Camel, и я разрешаю множество подключений к веб-сокетам. Каждое клиентское соединение должно быть связано с ClientID. ClientID получается новым соединением через сообщение InitConnection json, где ClientID является членом сообщения. Возникает вопрос: возможно ли, чтобы верблюд связывал экземпляр веб-сокета с ClientID для выполнения маршрутизации на основе контента?
Маршрутизация на основе контента Apache Camel на соединениях через веб-сокеты
comment
Вы имеете в виду, что верблюд выполняет добавление вызова к сообщению json, содержащему идентификатор клиента?
- person Souciance Eqdam Rashti   schedule 18.02.2016
comment
Нет. Я бы хотел, чтобы верблюд вытащил clientId из сообщения. Найдите веб-сокет в списке получателей по идентификатору клиента.
- person Rizon   schedule 18.02.2016
comment
Это должно быть сделано с выбором() и когда(). Но да, должно работать нормально.
- person Souciance Eqdam Rashti   schedule 19.02.2016
Ответы (1)
Да, это возможно. вы можете получить 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();
вам нужно сопоставить этот уникальный ключ с идентификатором вашего клиента, чтобы вы могли отправлять сообщения конкретному клиенту, используя этот UUID.
CamelContext camelContext=new DefaultCamelContext();
ProducerTemplate template=camelContext.createProducerTemplate();
template.sendBodyAndHeader("direct:Producer1", {message}, "connectionKey", {connectionkey});
direct:Producer1 : имя конечной точки производителя.
connectionkey : уникальный ключ подключения, который вы получите из заголовка обмена в потребителе веб-сокета.
message : сообщение конечной точке 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();
person
Shemeem
schedule
15.12.2016
Не могли бы вы объяснить, как и где хранить ключ подключения от Producer, чтобы отправлять сообщения конкретному клиенту.
- person Princey James; 06.06.2017
@PrinceyJames, вы можете сохранить ключ соединения в статической хеш-карте. Если ваше соединение привязано к процессу или пользователю, вы можете использовать его идентификатор в качестве ключа и ключ соединения в качестве значения. когда ваш клиент закрывает соединение, вы должны удалить ключ соединения с этой карты.
- person Shemeem; 08.06.2017
в моем случае каждое соединение привязано к процессу. перед запуском процесса клиент устанавливает соединение через веб-сокет с сервером, используя идентификатор процесса, сервер сохраняет этот уникальный ключ соединения с идентификатором процесса на карте и отправляет статус процесса, используя идентификатор процесса и ключ соединения.
- person Shemeem; 08.06.2017