艰苦的岁月-camel成功部署mina:tcp

下面就把camel部署mina:tcp时候遇到一些问题为大家做答,并贴上代码供大家学习!

很多人在部署好后,从客户端发来消息就会报这样的错误:

org.apache.mina.common.BufferDataException dataLength Hexdump camel

我也遇到了,然后去网上一找,很多人提问,但没有一个人真正得到了答案的,回答的人都是以“不知道你要做什么,不知道你这个是在什么环境下部署的”。做答案,那我做为全国第一个把我这两天的研究结果发布这在上面,希望对大家有帮助;

这个问题最先以为是camle的问题,于调试其源代码,不得解,然后看其文档,发现"mina:tcp://"+host+":"+port+"?textline=true&sync=true"

是textline的问题,为什么呢,是因为在mina处有个过滤器,如果不这样设置,在做message的类型转换是就会报错,于加它加上,然后 再运行 ,发现不现报错了,但是没有收到任何结果,再查其原因,发现必须在客户端每条发送的数据后加一个回车符才行,为什么呢,因为这个过滤器要收到一个回符,才 认为接收完成,才会做下一步处理。

  到这里如果你的需求可以让你的每条message都加一个回车符,那么不用改源代码也可以满足你的需求了。但我的要求不是这么低的,于再研究。

到最后把问题盯在了mina的TextLineDecoder这个类上,

如下红色部分,你只需加这一点,你的消息就可以不用再跟上回车符也可以让camel接收到消息了,哈哈,当然这只是最基本的做法了。本人还有很多需求,都要改源代码的。有时间再贴出来和大家分享了!

实际的程序运行例子参照

http://wangleifire.iteye.com/category/58864我这里就不做ctrl+c ctrl+v了!

 

private void decodeAuto(Context ctx, ByteBuffer in, ProtocolDecoderOutput out)
            throws CharacterCodingException {

        int matchCount = ctx.getMatchCount();
       
        // Try to find a match
        int oldPos = in.position();
        int oldLimit = in.limit();
        while (in.hasRemaining()) {
            byte b = in.get();
            boolean matched = false;
            switch (b) {
            case '\r':
                // Might be Mac, but we don't auto-detect Mac EOL
                // to avoid confusion.
                matchCount++;
                break;
            case '\n':
                // UNIX
                matchCount++;
                matched = true;
                break;
            default:
                matchCount = 0;
            }

            if (matched || !in.hasRemaining() ) {
                // Found a match.
                int pos = in.position();
                in.limit(pos);
                in.position(oldPos);

                ctx.append(in);

                in.limit(oldLimit);
                in.position(pos);

                if (ctx.getOverflowPosition() == 0) {
                    ByteBuffer buf = ctx.getBuffer();
                    buf.flip();
                    buf.limit(buf.limit() - matchCount);
                    try {
                        out.write(buf.getString(ctx.getDecoder()));
                    } finally {
                        buf.clear();
                    }
                } else {
                    int overflowPosition = ctx.getOverflowPosition();
                    ctx.reset();
                    throw new BufferDataException(
                            "Line is too long: " + overflowPosition);
                }

                oldPos = pos;
                matchCount = 0;
            }
        }

        // Put remainder to buf.
        in.position(oldPos);
        ctx.append(in);

        ctx.setMatchCount(matchCount);
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值