Camel,Netty,MINA:服务器和客户端之间的双向异步通信

时间:2014-05-09 19:48:13

标签: spring asynchronous apache-camel netty mina

根据我对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 });
    }

}

0 个答案:

没有答案