`
wangleifire
  • 浏览: 500117 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

艰苦的岁月-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);
    }

分享到:
评论
2 楼 wangleifire 2011-07-14  
thebest 写道
你好,请问如果camel要接收一个socket请求,但我这个socket是先发送4字节内容作为后面报文体的长度的值,如1000,再发送该长度的内容,如1000字节的内容,这样camel中如何配置和使用呢?也就是这个通讯协议是基于tcp,但应用协议是需要用户自己定义的,也许是先发两字节认证,再发报头,报体,报尾等这种形式,如何能做到?

自己写吧
1 楼 thebest 2011-06-30  
你好,请问如果camel要接收一个socket请求,但我这个socket是先发送4字节内容作为后面报文体的长度的值,如1000,再发送该长度的内容,如1000字节的内容,这样camel中如何配置和使用呢?也就是这个通讯协议是基于tcp,但应用协议是需要用户自己定义的,也许是先发两字节认证,再发报头,报体,报尾等这种形式,如何能做到?

相关推荐

Global site tag (gtag.js) - Google Analytics