当前位置: 首页 > 知识库问答 >
问题:

自定义Apache Camel数据格式的Spring配置

李明贤
2023-03-14

我使用的是Apache Camel 2.9.2和Spring 3.0.6.Release。我正在尝试使用自定义的DataFormat来封送和取消封送骆驼消息。我想使用Spring将我的自定义数据格式配置到我的一条路由中。

Apache Camel的文档指出,为了将我的自定义数据格式与Spring中的路由挂钩,我只需要将我的自定义数据格式声明为bean并在Spring路由中引用它,如下所示:

<marshal>
    <custom ref="myCustomDataFormat"/>
</marshal>

http://camel.apache.org/custom-dataformat.html

所以我有以下设置:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                        http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
                        http://www.springframework.org/schema/context
                        http://www.springframework.org/schema/context/spring-context-3.0.xsd
">

<bean id="myCustomDataFormat" class="com.test.CustomDataFormat"/>
<!-- Camel Context -->
<camelContext xmlns="http://camel.apache.org/schema/spring">
    <route>
        <from uri="file:C:/test?initialDelay=4000&amp;delay=1000"/>
        <marshal>
            <custom ref="myCustomDataFormat"/>
        </marshal>
        <to uri="file:C:/test2"/>
    </route>
</camelContext>
</beans>

我的数据格式定义如下:

package com.test;

import java.io.InputStream;
import java.io.OutputStream;

import org.apache.camel.Exchange;
import org.apache.camel.spi.DataFormat;

public class CustomDataFormat implements DataFormat {

/* (non-Javadoc)
 * @see org.apache.camel.spi.DataFormat#marshal(org.apache.camel.Exchange, java.lang.Object, java.io.OutputStream)
 */
@Override
public void marshal(Exchange exchange, Object graph, OutputStream stream)
        throws Exception {
    System.out.println("Marshal");
    byte[] bytes = exchange.getContext().getTypeConverter().mandatoryConvertTo(byte[].class, graph);
    stream.write(bytes);

}

/* (non-Javadoc)
 * @see org.apache.camel.spi.DataFormat#unmarshal(org.apache.camel.Exchange, java.io.InputStream)
 */
@Override
public Object unmarshal(Exchange exchange, InputStream stream)
        throws Exception {
    System.out.println("Unmarshal");
    byte[] bytes = exchange.getContext().getTypeConverter().mandatoryConvertTo(byte[].class, stream);
    return bytes;
}
}

我知道我的CustomDataFormat实现是正确的,因为我用Java创建了以下测试路由,并且它完美无缺地工作

package com.test;

import org.apache.camel.spring.SpringRouteBuilder;

public class TestFormatRoute extends SpringRouteBuilder {

/* (non-Javadoc)
 * @see org.apache.camel.builder.RouteBuilder#configure()
 */
@Override
public void configure() throws Exception {
    from("file:C:/test?initialDelay=4000&delay=1000").unmarshal(new CustomDataFormat()).to("file:C:/test2");
}

}

我错过了什么?

在让Camel在收到这个错误后完全启动后,我不相信我的自定义数据格式在我创建的路由中确实起作用。我不确定是什么进程试图解析我的自定义数据格式但失败了,但显然不是同一个进程解析数据格式以放入我的路由。

这解决了数据格式的功能需求,但并不能解释为什么我会收到这个错误。

我还确认了不是我的数据格式(CustomDataFormat)的名称导致了这个问题。将我的DataFormat重命名为唯一名称(MerlinDataFormat)无法修复该错误。

我仍然想知道为什么我会收到这个错误,因为在我的控制台和日志文件中有大量丑陋的红色错误并不是很吸引人。

再次感谢。

共有1个答案

许承悦
2023-03-14

结果证明这是一个非常简单的解决方案(我承认这应该是一个很容易看到的解决方案)。实际上有两种方法可以解决这个问题,一种只使用spring,另一种需要一个额外的java类。

解决方案1

创建扩展DataFormatDefinition的新类,该类具有与自定义的DataFormat相同的属性。重写ConfigureDataFormat()方法以设置基础DataFormat的所有属性。添加构造函数以将基础DataFormat设置为CustomDataFormat的实例。现在,您应该能够在spring中创建DataFormatDefinition的实例,并在封送或Unmarshaling时引用它。

解决方案2(快速和脏)

在spring中,创建一个新的DataFormatDefinitionbean,并将其DataFormat属性设置为对DataFormatspring bean的引用。现在,您应该能够在marshalingunmarshaling时引用您的DataFormatDefinitionbean。

 类似资料:
  • spring security oauth的错误格式符合oauth规范,如下所示。 特别是在资源服务器上,我发现为身份验证问题提供不同的错误格式有点奇怪。所以我想改变这个异常的呈现方式。 授权服务器中的错误处理使用标准的Spring MVC特性,即@ExceptionHandler方法 所以我尝试了类似这样的方法来自定义错误的格式: 但这不起作用。 查看代码,所有的错误呈现似乎都是在中完成的。但实

  • 本文向大家介绍SQL Server数据表字段自定义自增数据格式的方法,包括了SQL Server数据表字段自定义自增数据格式的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了SQL Server数据表字段自定义自增数据格式的方法。分享给大家供大家参考,具体如下: 效果如图所示: 希望本文所述对大家SQL Server数据库程序设计有所帮助。

  • 本文向大家介绍PHP自定义函数格式化json数据示例,包括了PHP自定义函数格式化json数据示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP自定义函数格式化json数据的方法。分享给大家供大家参考,具体如下: PS:这里再为大家推荐几款比较实用的json在线工具供大家参考使用: 在线JSON代码检验、检验、美化、格式化工具: http://tools.jb51.net/code

  • 本文向大家介绍.NET Framework 格式:自定义DateTime格式,包括了.NET Framework 格式:自定义DateTime格式的使用技巧和注意事项,需要的朋友参考一下 示例            

  • 问题内容: 我正在尝试做一些我认为应该非常简单的事情。我有一个对象,设置了spring-boot,spring-data-rest和spring-hateoas。所有基础知识都可以正常工作。我想添加一个自定义控制器,该控制器返回一个与GET到我的 完全相同的格式,以便两者之间的响应兼容。 这是我的控制器: 选项1:依靠提供的 这个选项的问题是没有必要的渲染。如果有解决方案,那将是最简单的解决方案。

  • 我想通过LLCP在一个NDEF记录中的NDEF消息中传输一个自定义数据(或者有效载荷可能会被分块到几个NDEF中)。传输的内容是具有特定格式的文件,仅在特定应用中具有意义。那么,指定NDEF头的最佳方法是什么? 1) 将TNF设置为0x04(NFC论坛外部类型),0x03(绝对URI)或0x05(未知)?0x04将在 TYPE 字段中具有自定义相对 URI,如果是绝对 URI,则0x03绝对 UR