`
wangleifire
  • 浏览: 508998 次
  • 性别: 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,但应用协议是需要用户自己定义的,也许是先发两字节认证,再发报头,报体,报尾等这种形式,如何能做到?

相关推荐

    apache-camel-1.3.0.tar.gz

    这个"apache-camel-1.3.0.tar.gz"文件是Apache Camel的一个早期版本,具体为1.3.0。这个版本的Camel包含了源代码、文档以及可能的构建工件,适用于那些需要在特定环境中运行或研究旧版Camel功能的用户。 Apache ...

    apache-camel-1.0.0.zip

    这个"apache-camel-1.0.0.zip"文件是Apache Camel的1.0.0版本的发布包,包含了该版本的所有组件和相关依赖。 Apache Camel 提供了一种声明式的方式来进行集成,这使得编写路由和转换数据变得简单。在1.0.0版本中,...

    apache-camel-2.8.2.tar.gz

    标题中的 "apache-camel-2.8.2.tar.gz" 指的是 Apache Camel 的特定版本,即 2.8.2 版本,该版本被打包成一个 `.tar.gz` 归档文件,这是一种常见的在 Unix-like 系统上使用的压缩格式,由 `tar` 工具用于打包多个...

    spring-boot-camel-config:Spring Boot Camel配置快速入门

    在命名空间中创建或更改名为camel-config的ConfigMap(包含名为application.properties的属性)后,将触发应用程序上下文刷新事件,并且日志将反映新的配置。 样品ConfigMap ( sample-configmap.yml )被包含在该...

    activemq-camel-5.5.0.jar

    activemq-camel-5.5.0.jar

    apache-camel-2.9.7.tar.gz

    这个"apache-camel-2.9.7.tar.gz"文件是Apache Camel的特定版本,即2.9.7版,以tar.gz格式打包。这种格式广泛用于Linux和Unix系统,用于压缩和归档文件。 1. **Apache Camel**:Apache Camel 提供了一个模型,该...

    apache-camel-2.8.0.zip

    这个"apache-camel-2.8.0.zip"压缩包包含的是Apache Camel的2.8.0版本,该版本发布于2011年,是Camel发展历史上的一个重要里程碑。 Apache Camel 的核心理念是“约定优于配置”,它提供了一种声明式的方式来定义...

    apache-camel-2.10.0-src.zip

    这个"apache-camel-2.10.0-src.zip"文件是Apache Camel 2.10.0版本的源代码包,对于开发者来说,它是深入理解Camel工作原理、自定义组件或调试问题的重要资源。 1. **Apache Camel 概述**: Apache Camel 是基于...

    apache-camel-2.12.4.tar.gz

    这个“apache-camel-2.12.4.tar.gz”文件是Apache Camel 2.12.4版本的源码或二进制分发版,通常包含了完整的库、文档以及示例代码,方便开发者在自己的项目中使用或学习。 Apache Camel 2.12.4 版本可能包含以下...

    apache-camel-2.7.3-src.tar.gz

    这个压缩包 "apache-camel-2.7.3-src.tar.gz" 包含了 Apache Camel 2.7.3 版本的源代码,这对于开发者来说是一个宝贵的资源,因为它允许他们深入理解项目的内部工作原理,进行自定义开发,或者对框架进行扩展。...

    apache-camel-2.8.3.zip

    这个 "apache-camel-2.8.3.zip" 文件是 Apache Camel 的一个特定版本,即 2.8.3 版本的压缩包。此版本包含了 Apache Camel 的核心组件、模块以及必要的依赖,适用于 Java 开发者用于构建和集成分布式系统。 Apache ...

    Springboot-ApacheCamel-Rest:使用Springboot和Apache Camel休息示例应用程序

    SpringBoot Rest Camel这是一个基于SpringBoot Apache-Camel Rest组件的示例凝乳应用程序。 系统中用于项目设置的必需项:Maven Java 8(如果您具有Java 7,则可以在maven pom中更改source和target属性) 基于H2数据...

    babel-camel-lambda-sample:发现 babel-camel-lambda 的示例(用于 Apache Camel 的改进的 Java DSL)

    babel-camel-lambda-sample 发现 babel-camel-lambda 的示例(用于 Apache Camel 的改进的 Java DSL) 在此示例中,您假设定义一个路由接收一个包含金额的字符串合计金额根据它是否为正数将总和发送到媒体路由应该在...

    groovy-camel-helper:Groovy 脚本的骆驼助手

    @GrabResolver(name=':groovy-camel-helper', root='http://www.wingnest.com/mvn-repo/') @Grab('com.wingnest.groovy:groovy-camel-helper:1.0-M1-SNAPSHOT') import static ...

    apache-camel-2.7.4.zip

    这个"apache-camel-2.7.4.zip"压缩包包含了Apache Camel的2.7.4版本,该版本发布于2013年,是Camel发展历史上的一个重要里程碑。 Apache Camel 的核心理念是“路由和数据转换”。它允许开发者通过声明式的方式定义...

    apache-camel-2.0-M2.tar.gz

    在标题中提到的 "apache-camel-2.0-M2.tar.gz" 是 Apache Camel 的一个特定版本,即2.0 Milestone 2(M2),它被打包成一个tar.gz格式的归档文件。这种格式是Unix/Linux系统中常用的压缩方式,由tar工具用于归档文件...

    akka-camel-kafka-example:阿卡+骆驼+卡夫卡!

    Play 中的 Camel + Kafka + Akka 示例 创建 docker 镜像 sbt docker:publishLocal 或者,将图像发布到 docker.io: # will need to do docker login first docker:publish 运行容器 docker run -d --name ...

    apache-camel-2.6.0.zip

    2. **camel-components**: 这个目录下会有各种组件,如camel-spring、camel-jms等,它们实现了与特定技术或协议的集成。 3. **camel-api**: 提供了Camel的公共API,供开发者在自定义组件或与Camel交互时使用。 4. **...

    WildFly-WLS-Camel-JMS:Camel-WildFly-WebLogic

    【标题】"WildFly-WLS-Camel-JMS:Camel-WildFly-WebLogic" 提供的项目涉及了几个关键的IT技术领域,包括Java中间件、消息队列(JMS)以及集成框架Apache Camel。这个项目可能是在探讨如何在不同的Java应用服务器之间...

    sti-camel-cdi:Java-sti项目演示

    骆驼CDI快速入门本示例说明如何使用CDI在Java容器中使用Camel来配置... fabric8/sti-java-jboss-jdk8:1.0.6 fabric8/camel-cdi在os3中运行oc new-app --strategy=source fabric8/sti-java-jboss-jdk8:1.0.6~https://git

Global site tag (gtag.js) - Google Analytics