Apache Camel框组件文件下载,我该如何使用输出参数?

时间:2017-10-07 22:30:13

标签: apache-camel box

我一直在尝试使用Apache Camel Box组件从Box下载文件。我似乎无法解释如何将必需参数output与uri box://files/downloadFile一起使用。

我可以正常上传文件(代码未列出),因此我确信这是配置此特定端点的问题,而不是例如我的org.apache.camel.component.box.BoxConfiguration

如何使用camel-box和box://files/downloadFile下载文件?具体来说,我期望将其作为端点uri的输出参数传递?

我一直在提及此文档:

https://github.com/apache/camel/blob/master/components/camel-box/camel-box-component/src/main/docs/box-component.adoc

以下是我正在使用的内容:

camel-core 2.19.3camel-box 2.19.3camel-spring-javaconfig 2.19.3

这是我无法弄清楚的路线BoxRoute.java

package [REDACTED];

import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.camel.builder.RouteBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;


@Component
public class BoxRoute extends RouteBuilder{
    private static final Logger LOG = LoggerFactory.getLogger(BoxRoute.class);
    @Override
    public void configure() throws Exception {

        from("box://files/downloadFile?fileId=[REDACTED]&output=#outputStream") //I expect this to refer to the outputStream @Bean
        .process(new Processor() {
            @Override
            public void process(Exchange exchange) throws Exception {
                for(String key: exchange.getProperties().keySet()){
                    LOG.debug("ex prop {} = {}", key, exchange.getProperty(key));
                }
                for(String key: exchange.getIn().getHeaders().keySet()){
                    LOG.debug("he prop {} = {}", key, exchange.getIn().getHeader(key));
                }

            }
        })
        .to("file:c:/_/dat/camel/out");
    }



}

所以我我给这个uri它需要什么。也就是说,对我的outputStream的引用是OutputStream,在下一个清单中定义。

我的应用程序的主要方法是BoxApplication.java

package [REDACTED];

import java.io.ByteArrayOutputStream;
import java.io.OutputStream;

import org.apache.camel.spring.javaconfig.CamelConfiguration;
import org.apache.camel.spring.javaconfig.Main;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;

@Configuration
@ComponentScan
@ImportResource("classpath:/META-INF/spring/box-context.xml")
public class BoxApplication extends CamelConfiguration{

    public static void main(String[] args) throws Exception {
        Main main = new Main();
        main.setConfigClass(BoxApplication.class);
        main.setDuration(10);
        main.run();

    }

    @Bean()
    public OutputStream outputStream(){
        System.out.println("I AM GETTING REGISTERED"); // I see this in stdout, so this bean is available to Camel (right?)
        return new ByteArrayOutputStream();
    }

}

box-context.xml的内容是(我可以使用骆驼盒上传,所以我怀疑我的问题在这里):

?xml version="1.0" encoding="UTF-8"?>
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.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd">

    <bean id="box" class="org.apache.camel.component.box.BoxComponent">
        <property name="configuration">
            <bean class="org.apache.camel.component.box.BoxConfiguration">
                <property name="userName" value="[REDACTED]" />
                <property name="userPassword" value="[REDACTED]" />
                <property name="clientId" value="[REDACTED]" />
                <property name="clientSecret" value="[REDACTED]" />
                <property name="authenticationType" value="STANDARD_AUTHENTICATION" />
            </bean>
        </property>
    </bean>

唉,我收到了这个错误,我很难过。任何帮助将不胜感激。

2017-10-07 18:05:00.128 [main] INFO  o.s.c.a.AnnotationConfigApplicationContext(583) - Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@bd8db5a: startup date [Sat Oct 07 18:05:00 EDT 2017]; root of context hierarchy
2017-10-07 18:05:00.216 [main] INFO  o.s.b.f.xml.XmlBeanDefinitionReader(317) - Loading XML bean definitions from class path resource [META-INF/spring/box-context.xml]
2017-10-07 18:05:00.500 [main] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker(325) - Bean 'boxApplication' of type [com.hqcllc.box.BoxApplication$$EnhancerBySpringCGLIB$$4e7e4dfa] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
I AM GETTING REGISTERED
Exception in thread "main" org.apache.camel.spring.javaconfig.CamelSpringJavaconfigInitializationException: org.apache.camel.RuntimeCamelException: Error invoking downloadFile with {output=, listener=Consumer[box://files/downloadFile?fileId=[REDACTED]&output=%23outputStream], fileId=[REDACTED]}: object is not an instance of declaring class
    at org.apache.camel.spring.javaconfig.RoutesCollector.onApplicationEvent(RoutesCollector.java:88)
    at org.apache.camel.spring.javaconfig.RoutesCollector.onApplicationEvent(RoutesCollector.java:33)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:167)
    at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:393)
    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:347)
    at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:883)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:546)
    at org.apache.camel.spring.javaconfig.Main.createDefaultApplicationContext(Main.java:148)
    at org.apache.camel.spring.Main.doStart(Main.java:154)
    at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61)
    at org.apache.camel.main.MainSupport.run(MainSupport.java:168)
    at com.hqcllc.box.BoxApplication.main(BoxApplication.java:22)
Caused by: org.apache.camel.RuntimeCamelException: Error invoking downloadFile with {output=, listener=Consumer[box://files/downloadFile?fileId=[REDACTED]&output=%23outputStream], fileId=[REDACTED]}: object is not an instance of declaring class
    at org.apache.camel.util.component.ApiMethodHelper.invokeMethod(ApiMethodHelper.java:514)
    at org.apache.camel.component.box.BoxConsumer.doStart(BoxConsumer.java:98)
    at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61)
    at org.apache.camel.impl.DefaultCamelContext.startService(DefaultCamelContext.java:3514)
    at org.apache.camel.impl.DefaultCamelContext.doStartOrResumeRouteConsumers(DefaultCamelContext.java:3831)
    at org.apache.camel.impl.DefaultCamelContext.doStartRouteConsumers(DefaultCamelContext.java:3767)
    at org.apache.camel.impl.DefaultCamelContext.safelyStartRouteServices(DefaultCamelContext.java:3687)
    at org.apache.camel.impl.DefaultCamelContext.doStartOrResumeRoutes(DefaultCamelContext.java:3451)
    at org.apache.camel.impl.DefaultCamelContext.doStartCamel(DefaultCamelContext.java:3305)
    at org.apache.camel.impl.DefaultCamelContext.access$000(DefaultCamelContext.java:202)
    at org.apache.camel.impl.DefaultCamelContext$2.call(DefaultCamelContext.java:3089)
    at org.apache.camel.impl.DefaultCamelContext$2.call(DefaultCamelContext.java:3085)
    at org.apache.camel.impl.DefaultCamelContext.doWithDefinedClassLoader(DefaultCamelContext.java:3108)
    at org.apache.camel.impl.DefaultCamelContext.doStart(DefaultCamelContext.java:3085)
    at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61)
    at org.apache.camel.impl.DefaultCamelContext.start(DefaultCamelContext.java:3022)
    at org.apache.camel.spring.javaconfig.RoutesCollector.onApplicationEvent(RoutesCollector.java:84)
    ... 12 more
Caused by: java.lang.IllegalArgumentException: object is not an instance of declaring class
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.camel.util.component.ApiMethodHelper.invokeMethod(ApiMethodHelper.java:506)
    ... 28 more

这是我的第一个骆驼项目。

0 个答案:

没有答案