根据我对Camel的MINA2和Netty Components的有限理解,我发现我可以通过单向通信和请求 - 回复通信,但我希望能够从客户端向服务器和服务器发送消息异步到客户端。
例如,我想编写一个简单的服务器来回显给提交的任何连接客户端。此外,对于任何连接的客户端,我想每30秒发送一次当前时间。有没有办法做到这一点?下面是我的样本,但不知道如何设置允许服务器向连接的客户端发送消息的部分。
下面的代码片段的netcat部分工作,并将当前时间打印到服务器的控制台(通过日志记录)工作,但希望将其发送回连接的客户端。 我应该注意,客户端是遗留软件,我无法更改它。只有服务器部分。
TL; DR:我希望服务器向我必须支持的已连接的旧客户端发送异步消息。是否有内置的方法在Camel中执行此操作而无需编写自定义代码?或者如果没有,我将不得不写什么?
的applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:camel="http://camel.apache.org/schema/spring" xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">
<bean id="echo" class="netcat.Echo" />
<camel:errorHandler id="camelErrorHandler" type="DefaultErrorHandler" />
<camelContext id="camelContext" errorHandlerRef="camelErrorHandler" xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="quartz2://sendTime?cron=0/5+*+*+*+*+?" />
<to uri="bean:netcat.CurrentTime?method=getCurrentTime()" />
</route>
<route>
<from uri="netty:tcp://localhost:5555?textline=true" />
<to uri="bean:echo" />
</route>
</camelContext>
</beans>
log4j.properties
log4j.rootLogger=INFO, A1
# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.apache.log4j.ConsoleAppender
# A1 uses PatternLayout.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r %d [%t] %-5p %c %x - %m%n
CurrentTime.java
package netcat;
import org.joda.time.DateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class CurrentTime {
private static final Logger LOG = LoggerFactory.getLogger(CurrentTime.class);
private CurrentTime() {
}
public static String getCurrentTime() {
String currentTime = DateTime.now().toString();
LOG.info("Current Time is {}.", currentTime);
return currentTime;
}
}
Echo.java
package netcat;
import org.apache.commons.lang3.StringUtils;
public class Echo {
public String echo(String message) {
return StringUtils.join(new Object[] { "Echoing: ", message });
}
}