4

根据我对 Camel 的 MINA2 和 Netty 组件的有限理解,我发现我可以进行单向通信和请求-回复通信,但我希望能够将消息从客户端异步发送到服务器以及从服务器发送到客户端。

例如,我想编写一个简单的服务器来将提交的内容回显给任何连接的客户端。此外,对于任何连接的客户端,我想每三十秒发送一次当前时间。有没有好的方法来做到这一点?下面是我所拥有但不知道如何设置允许服务器向连接的客户端发送消息的部分的示例。

下面代码片段的 netcat 部分工作,并且将当前时间打印到服务器的控制台(通过日志记录)工作,但希望将其发送回连接的客户端。 我应该注意到客户端是遗留软件,我没有能力改变它。 只有服务器部分。

TL;DR:我希望服务器将异步消息发送到我必须按原样支持的已连接旧客户端。在 Camel 中是否有内置方法可以在不编写自定义代码的情况下执行此操作?或者如果没有,我会写什么?

应用程序上下文.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

当前时间.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;
    }

}

回声.java

package netcat;

import org.apache.commons.lang3.StringUtils;

public class Echo {

    public String echo(String message) {
        return StringUtils.join(new Object[] { "Echoing: ", message });
    }

}
4

0 回答 0