下面就把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);
}