2017-06-08 35 views
0

私はspringbootとラクダの簡単な例を取得しようとしているが、元に戻す。私が間違っていることを確認していない。私はこのスプリングブートとキャメルスローdirect.DirectConsumerNotAvailableException

@Component 
class DirectRoute extends RouteBuilder{ 
    @Override 
    void configure() throws Exception { 
     from ("direct:in") //tried stream:in also 
       .to ("stream:out") 
    } 

} 

ようDirectRouteコンポーネントを作成してきたこれまでの

dependencies { 
    compile 'org.apache.camel:camel-spring-boot-starter:2.18.4' 
    compile 'org.apache.camel:camel-groovy:2.18.4' 
    compile 'org.apache.camel:camel-stream:2.18.4' 
    compile 'org.codehaus.groovy:groovy-all:2.4.11' 
    testCompile group: 'junit', name: 'junit', version: '4.11' 
    testCompile group: 'junit', name: 'junit', version: '4.12' 
} 

を含めましたGradleのビルドでは、私はその後、ルートに

@Component 
public class HelloImpl implements Hello { 

    @Produce(uri = "direct:in") 
    private ProducerTemplate template; 

    @Override 
    public String say(String value) throws ExecutionException, InterruptedException { 

     assert template 
     println "def endpoint is : " + template.getDefaultEndpoint() 
     return template.sendBody (template.getDefaultEndpoint(), value) 
    } 


} 
を呼び出すためのを試みるドライバBeanを持っています

最後にspringbootアプリケーションクラスで私はこのようなコマンドラインランナーを追加し、SpringコンテキストからBeanを取得し、sayメソッドを呼び出します。私はgroovyを使用しているので、私はコマンドラインランナーにクロージャを渡しました。

@Bean 
public CommandLineRunner commandLineRunner(ApplicationContext ctx) { 
//return closure to run on startup - just list the beans enabled 
    {args -> 
     println("Let's inspect the beans provided by Spring Boot:") 

     String[] beanNames = ctx.getBeanDefinitionNames() 
     Arrays.sort(beanNames) 
     for (String beanName : beanNames) { 
      println(beanName) 
     } 

     println("call the direct:start route via the service") 
     Hello service = ctx.getBean("helloService") 

     def result = service.say("William") 
     println "service returned : $result " 
    } 
} 

私は自分のアプリケーションを実行したとき、私は直接の呼び出しがとき、(それは大丈夫です)プリントアウトし、すべてのBean名を取得:プロデューサーテンプレート経由で私はこのエラーを取得する(org.apache.camel.component.direct .DirectConsumerNotAvailableException)を参照してください。

出力ストリームに到達するのを見るために送信されたルートがトリガーされることを期待していましたが、これは私が得るものです。

Caused by: org.apache.camel.CamelExecutionException: Exception occurred during execution on the exchange: Exchange[ID-MONSTER-PC2-58911-1496920205300-0-2] 
    at org.apache.camel.util.ObjectHelper.wrapCamelExecutionException(ObjectHelper.java:1795) ~[camel-core-2.18.4.jar:2.18.4] 
    at org.apache.camel.util.ExchangeHelper.extractResultBody(ExchangeHelper.java:677) ~[camel-core-2.18.4.jar:2.18.4] 
    at org.apache.camel.impl.DefaultProducerTemplate.extractResultBody(DefaultProducerTemplate.java:515) ~[camel-core-2.18.4.jar:2.18.4] 
    at org.apache.camel.impl.DefaultProducerTemplate.extractResultBody(DefaultProducerTemplate.java:511) ~[camel-core-2.18.4.jar:2.18.4] 
    at org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:163) ~[camel-core-2.18.4.jar:2.18.4] 
    at org.apache.camel.ProducerTemplate$sendBody$0.call(Unknown Source) ~[na:na] 
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) [groovy-all-2.4.11.jar:2.4.11] 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113) [groovy-all-2.4.11.jar:2.4.11] 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:133) [groovy-all-2.4.11.jar:2.4.11] 
    at services.HelloImpl.say(HelloImpl.groovy:29) ~[main/:na] 
    at services.Hello$say.call(Unknown Source) ~[na:na] 
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) [groovy-all-2.4.11.jar:2.4.11] 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113) [groovy-all-2.4.11.jar:2.4.11] 
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125) [groovy-all-2.4.11.jar:2.4.11] 
    at application.Application$_commandLineRunner_closure1.doCall(Application.groovy:47) ~[main/:na] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_121] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_121] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_121] 
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_121] 
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93) ~[groovy-all-2.4.11.jar:2.4.11] 
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325) ~[groovy-all-2.4.11.jar:2.4.11] 
    at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:294) ~[groovy-all-2.4.11.jar:2.4.11] 
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1022) ~[groovy-all-2.4.11.jar:2.4.11] 
    at groovy.lang.Closure.call(Closure.java:414) ~[groovy-all-2.4.11.jar:2.4.11] 
    at org.codehaus.groovy.runtime.ConvertedClosure.invokeCustom(ConvertedClosure.java:54) ~[groovy-all-2.4.11.jar:2.4.11] 
    at org.codehaus.groovy.runtime.ConversionHandler.invoke(ConversionHandler.java:124) ~[groovy-all-2.4.11.jar:2.4.11] 
    at com.sun.proxy.$Proxy44.run(Unknown Source) ~[na:na] 
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:776) [spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE] 
    ... 10 common frames omitted 
Caused by: org.apache.camel.component.direct.DirectConsumerNotAvailableException: No consumers available on endpoint: direct://in. Exchange[ID-MONSTER-PC2-58911-1496920205300-0-2] 
    at org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:55) ~[camel-core-2.18.4.jar:2.18.4] 
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:197) ~[camel-core-2.18.4.jar:2.18.4] 
    at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:97) ~[camel-core-2.18.4.jar:2.18.4] 
    at org.apache.camel.impl.ProducerCache$1.doInProducer(ProducerCache.java:529) ~[camel-core-2.18.4.jar:2.18.4] 
    at org.apache.camel.impl.ProducerCache$1.doInProducer(ProducerCache.java:497) ~[camel-core-2.18.4.jar:2.18.4] 
    at org.apache.camel.impl.ProducerCache.doInProducer(ProducerCache.java:365) ~[camel-core-2.18.4.jar:2.18.4] 
    at org.apache.camel.impl.ProducerCache.sendExchange(ProducerCache.java:497) ~[camel-core-2.18.4.jar:2.18.4] 
    at org.apache.camel.impl.ProducerCache.send(ProducerCache.java:225) ~[camel-core-2.18.4.jar:2.18.4] 
    at org.apache.camel.impl.DefaultProducerTemplate.send(DefaultProducerTemplate.java:144) ~[camel-core-2.18.4.jar:2.18.4] 
    at org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:161) ~[camel-core-2.18.4.jar:2.18.4] 

は私が間違って何をした - と理由は、「ダイレクト:中」に関するプロデューサーテンプレートの呼び出しは動作しません(これも同じ問題にしてストリームを試してみましたか)?私は.to( "stream:out")は消費者だと思った。

任意のポインタまたはアドバイスは感謝して、この時点で問題の

+0

直接に:で? – ndrone

+0

私はSpringBootApplicationアノテーションを持っていますが、Component注釈付きのルートを選択していませんでした。 ScanBaseパッケージを追加する必要がありました。さらにcamelContextは自動的に起動されないので、start()とstop()の間にsleepを追加する必要がありました。私がそれをして、私のダイレクトと呼ぶとき、テンプレートから物事がうまくいくように見えます。午前中に投資を完了し、アップデートします –

+0

クールなスプリングブートアプリケーションコンポーネントは、サブパッケージのみをスキャンします。したがって、ラクダの設定が上位のパッケージにある場合は、それをスキャンしません。 – ndrone

答えて

0

更新OKを受けました。

  1. アプリケーションクラスに@SpringBootApplicationという名前のサブパッケージがありました。そう、はい、それはsubpackagesをスキャンしていないunadorned。
  2. scanBasePackages=またはscanBaseClasses=パラメータを追加することはできますが、1つのクラスのスキャンを試みると、ディレクトリ全体を何らかの方法でスキャンして他のものも取得したようです。
  3. 私はサブパッケージを持つ単一のルートパッケージを持つようにアプリケーションをリファクタリングし、 'scanBasePakagesを新しいルートパッケージに設定するように選択しました。 Applicationクラスを独自のサブパッケージに残しました(個人的な設定のみ - ドキュメントはルートパッケージにアプリケーションを残すことを提案しています)
  4. @Configurationと注釈付けされた他のクラスを追加して、豆を生成するか、基本@Componentを使用できるようになりました。
  5. @Componentと注釈を付けたCamelルートを作成すると、camelContextで自動的に設定されます。
  6. デフォルトでは、SpringがcamelContextを起動していないように見えます。コンテキストのステータスを確認すると、startingと表示され、startedではありません。私のcommandLineRunnerでは、春のcamelContextの注入を開始しなければならず、自分で開始しなければならず、終了すると終了しなければなりませんでした。私はSpringBootStarterがcamelContextを自動的に開始すると思ったので少し驚いたが、そうではないようだ。
  7. SpringコンポーネントのスキャンなどをしてcamelContextを起動すると、org.apache.camel.component.direct.DirectConsumerNotAvailableException例外の問題が解消し、少なくとも私が試しているベビーの例が機能し始めました。

ので、改訂された構造は、今改訂ApplicationClassは今、春のCTXでいくつかの簡単なのprintlnコンテキストの状態を確認するために、出力、および豆とこのようになります。この enter image description here

のように見えます。 helleoService Beanは、プロデューサテンプレートを設定してDirectRouteを呼び出すために使用するプロキシです。

package com.softwood.application 

import groovy.util.logging.Slf4j 
import org.apache.camel.CamelContext 
import org.springframework.beans.factory.annotation.Autowired 
import com.softwood.services.Hello 

/** 
* Created by willw on 07/06/2017. 
*/ 
import org.springframework.boot.CommandLineRunner; 
import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.annotation.Bean 

@Slf4j //inject logger 
@SpringBootApplication (scanBasePackages = ["com.softwood"]) //forces scan at parent 
// same as @Configuration @EnableAutoConfiguration @ComponentScan with 'defaults' e.g. sub packages 
public class Application { 
    @Autowired 
    ApplicationContext ctx 

    @Autowired 
    CamelContext camelContext 

    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args) 
    } 

    @Bean 
    public CommandLineRunner commandLineRunner(ApplicationContext ctx) { 
    //return closure to run on startup - just list the beans enabled 
     {args -> 

      println("Let's inspect the beans provided by Spring Boot:") 

      String[] beanNames = ctx.getBeanDefinitionNames() 
      Arrays.sort(beanNames) 
      for (String beanName : beanNames) { 
       println(beanName) 
      } 

      /* when component scan is working - bean routes are added 
      automatically to camel context via springBoot, however you do have to start 
      the camel context, yourself 
      */ 
      println "camelCtx has following components : " + camelContext.componentNames 
      println "camelCtx state is : " + camelContext.status 
      println "starting camel context" 
      camelContext.start() 
      println "camelCtx state now is : " + camelContext.status 


      //log.debug "wills logging call " 
      println("call the direct:start route via the service") 
      Hello service = ctx.getBean("helloService") 

      def result = service.say("William") 
      println "service returned : $result " 
      println "sleep 5 seconds " 
      sleep (5000) 
      println "stop camel context" 
      camelContext.stop() 
      println "camelCtx state now is : " + camelContext.status 

     } 
    } 

} 

プロキシは、ちょうど春のコンテキストでこのような単純なBeanとして登録されていることTimedRouteがちょうど

package com.softwood.camelRoutes 

/** 
* Created by willw on 07/06/2017. 
*/ 
import org.apache.camel.builder.RouteBuilder 
import org.springframework.stereotype.Component 


@Component 
class TimedRoute extends RouteBuilder { 

    @Override 
    void configure() throws Exception { 
     from ("timer:foo") 
     .to ("log:com.softwood.application.Application?level=WARN") 
    } 
} 

に呼び出すために必要なテンプレートなしで自身を選別する

package com.softwood.services 
/** 
* Created by willw on 07/06/2017. 
*/ 
import org.apache.camel.Produce; 
import org.apache.camel.ProducerTemplate 
import org.springframework.stereotype.Component; 

import java.util.concurrent.ExecutionException 

@Component 
public class HelloImpl implements Hello { 

    @Produce(uri = "direct:in") /* ?block=true */ 
    private ProducerTemplate template 

    @Override 
    public String say(String value) throws ExecutionException, InterruptedException { 

     assert template 
     println "def endpoint is : " + template.getDefaultEndpoint() 
     //Future future = template.asyncSendBody(template.getDefaultEndpoint(), value) 
     //return future.get() 
     return template.sendBody (template.getDefaultEndpoint(), value) 
    } 


} 

私シンプルなノーオペレーションファイルのルートは動作していません(まだ)。容疑者私はファイルを設定する権利がありませんでした何とかいくつかの再生が必要です。

package com.softwood.camelRoutes 

import org.apache.camel.builder.RouteBuilder 
import org.springframework.stereotype.Component 


/** 
* Created by willw on 08/06/2017. 
*/ 
@Component 
class FileNoOpRoute extends RouteBuilder{ 
    @Override 
    void configure() throws Exception { 
     from ("file:../com.softwood.file-inbox?recursive=true&noop=true&idempotent=true") 
     .to ("file:../com.softwood.file-outbox") 

    } 

} 

しかし基本は働いていないと私はちょうど例外と何を持っていた前に、少なくともラクダは、一方、何かをやっています。

私はこれが、あなたが仕事を見てみたいと思っているときに最も不満を感じていることをしようとすると、同じように立ち往生してくれる人たちを助けてくれることを望んでいます。

@ndroneもありがとうございます。また configuration with springboot problems

がうまくいけば、これは他の人を助ける上記のいくつかをhilighting春の設定上の別の質問へ

と、このリンクのポイントは、同様に落とし穴を乗り越えるメッセージを示して、あなたのルートが渡されている

+0

PSはもう少し実験を行いました - file://のデフォルトの相対的なルートはプロジェクトのトップレベルのルートですので 'file:// data/inbox'は実際には' /data/inbox'を参照しています。あなたのクラスパスが始まる場所ではありません。上の例では、これは私のdev pcの 'D:\ Intellij-projects \ camel-test \ data \ fileInbox'です。相対パスがどこから始まるのか分かり次第、うまく動作します –

関連する問題