如何让Camel Websocket组件在从客户端连接时发送消息?

时间:2016-03-13 21:49:40

标签: java websocket apache-camel

我已经使用Java DSL创建了一个可用的Camel Websocket路由,但我无法弄清楚如何在新客户端连接时让Camel触发事件,以便我可以向客户端发送初始化消息...

    LOG.info("ReplicationSink route is loading");
    String uri = "websocket://0.0.0.0:2081/v3/replication";
    boolean interest_sent = false;
    onException(AccessDeniedException.class)
            .handled(true)
            .transform()
            .simple("{\"error\": \"Access Denied\", \"message\":\"${exception.message}\"}")
            .to(uri);
    from(uri)   // How can I specify here that upon initial connection to send the INTEREST_MESSAGE?
            .log(DEBUG, "replication-sink", simple("${body}").getText())
            .choice()
            .when().simple("${header.interested} == null")
                .log(DEBUG, "Preparing to send interest message")
                .setBody().constant(INTEREST_MESSAGE)
                .setHeader("interested").constant("true")
                .to(uri)
            .when().simple("${header.qfor} == null")
                .log(DEBUG, "Setting QFOR headers")
                .setHeader("data").body()
                .setHeader("qfor").constant("TEST")
                .setHeader("self").javaScript("JSON.parse(request.body).self")
                .to(uri)
            .otherwise()
                .log(DEBUG, "Receiving updates")
                .setBody(simple("INSERT INTO raw (qfor, self, data) VALUES (:?qfor, :?self, :?data::jsonb)"))
                .to("jdbc:ccindexer?useHeadersAsParameters=true");

2 个答案:

答案 0 :(得分:2)

Afaik,我认为在当前版本的Camel中不可能。

解决方法:

  • 配置websocket组件以使用您自己的WebSocketFactory。该工厂应该扩展DefaultWebSocketFactory并且应该在协议'default'下注册(即参见WebSocketComponent.setSocketFactory
  • WebSocketFactory的实施中,返回您自己的WebSocket实施,并延长DefaultWebSocket
  • 在您的WebSocket实现中,您可以访问方法onOpen和关联的Connection(使用Connection.sendMessage

答案 1 :(得分:1)

前段时间我遇到了同样的问题,得出了与上面相同的结论,我创建了一个实现。代码是Apache许可证,可在此处找到: https://github.com/SignalK/signalk-server-java/tree/master/src/main/java/org/apache/camel/component/websocket

您必须重新找回其使用方式 - 查找RouteManager.class