我已经使用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");
答案 0 :(得分:2)
Afaik,我认为在当前版本的Camel中不可能。
解决方法:
DefaultWebSocketFactory
并且应该在协议'default'下注册(即参见WebSocketComponent.setSocketFactory
)WebSocketFactory
的实施中,返回您自己的WebSocket
实施,并延长DefaultWebSocket
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