Маршрутизация на основе контента Apache Camel на соединениях через веб-сокеты

У меня есть гипотетический сценарий: давайте представим, что у меня есть сервер веб-сокетов Apache Camel, и я разрешаю множество подключений к веб-сокетам. Каждое клиентское соединение должно быть связано с ClientID. ClientID получается новым соединением через сообщение InitConnection json, где ClientID является членом сообщения. Возникает вопрос: возможно ли, чтобы верблюд связывал экземпляр веб-сокета с ClientID для выполнения маршрутизации на основе контента?


person Rizon    schedule 18.02.2016    source источник
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
comment
Не могли бы вы объяснить, как и где хранить ключ подключения от Producer, чтобы отправлять сообщения конкретному клиенту. - person Princey James; 06.06.2017
comment
@PrinceyJames, вы можете сохранить ключ соединения в статической хеш-карте. Если ваше соединение привязано к процессу или пользователю, вы можете использовать его идентификатор в качестве ключа и ключ соединения в качестве значения. когда ваш клиент закрывает соединение, вы должны удалить ключ соединения с этой карты. - person Shemeem; 08.06.2017
comment
в моем случае каждое соединение привязано к процессу. перед запуском процесса клиент устанавливает соединение через веб-сокет с сервером, используя идентификатор процесса, сервер сохраняет этот уникальный ключ соединения с идентификатором процесса на карте и отправляет статус процесса, используя идентификатор процесса и ключ соединения. - person Shemeem; 08.06.2017