2017-08-15 43 views
1

我正在使用direct-vm在兩個運行在相同JVM中的駱駝上下文之間進行通信。但它不工作,我的製片人不斷尋找消費者:(我在這裏缺少什麼。任何幫助表示讚賞謝謝:)如何使用駱駝「direct-vm」在兩個駱駝上下文之間進行通信?

這是我的製片人,從發送的數據文件夾中的端點

import org.apache.camel.CamelContext; 
import org.apache.camel.builder.RouteBuilder; 
import org.apache.camel.impl.DefaultCamelContext; 

public class OrderRouter { 

    public static void main(String args[]) throws Exception { 
    // create CamelContext 
    CamelContext context = new DefaultCamelContext(); 

// add our route to the CamelContext 
    context.addRoutes(new RouteBuilder() { 
    @Override 
    public void configure() { 

     from("file:src/data?noop=true").to("direct-vm:pipeRequestDR91"); 

     } 
    }); 

    // start the route and let it do its work 
    context.start(); 
    Thread.sleep(10000); 

    // stop the CamelContext 
    context.stop(); 
    } 
} 

這是我的終端消費者輪詢。

import org.apache.camel.CamelContext; 
import org.apache.camel.Exchange; 
import org.apache.camel.Processor; 
import org.apache.camel.builder.RouteBuilder; 
import org.apache.camel.impl.DefaultCamelContext; 

public class App { 
    public static void main(String[] args) throws Exception { 

    CamelContext context = new DefaultCamelContext(); 

    context.addRoutes(new RouteBuilder() { 
     @Override 
     public void configure() { 

      from("direct-vm:pipeRequestDR91").process(new Processor() { 
       public void process(Exchange exchange) throws Exception { 
        System.out.println("Reached here"); 
        System.out.println("Received XML order: " 
          + exchange.getIn().getHeader("CamelFileName")); 
        String strBody = exchange.getIn().getBody(String.class); 
        System.out.println(strBody); 
       } 
      }); 

     } 
    }); 

    context.start(); 
    Thread.sleep(100000); 
    } 
} 

這是錯誤:

Message History 

--------------------------------------------------------------------------------------------------------------------------------------- 
RouteId    ProcessorId   Processor                  Elapsed (ms) 
[route1   ] [route1   ] [file://src/data?noop=true              ] [   5] 
[route1   ] [to1    ] [direct-vm:pipeRequestDR91              ] [   0] 

Exchange 
--------------------------------------------------------------------------------------------------------------------------------------- 
Exchange[ 
    Id     ID-LP0G0085-56374-1502833874430-0-418 
    ExchangePattern  InOnly 
    Headers    {breadcrumbId=ID-LP0G0085-56374-1502833874430-0-417, CamelFileAbsolute=false, CamelFileAbsolutePath=C:\Prashant\camelinaction-master\chapter2\cbr\src\data\message2.csv, CamelFileContentType=application/vnd.ms-excel, CamelFileLastModified=1436197636000, CamelFileLength=53, CamelFileName=message2.csv, CamelFileNameConsumed=message2.csv, CamelFileNameOnly=message2.csv, CamelFileParent=src\data, CamelFilePath=src\data\message2.csv, CamelFileRelativePath=message2.csv, CamelRedelivered=false, CamelRedeliveryCounter=0} 
    BodyType   org.apache.camel.component.file.GenericFile 
    Body    [Body is file based: GenericFile[message2.csv]] 
] 

Stacktrace 
--------------------------------------------------------------------------------------------------------------------------------------- 
org.apache.camel.component.directvm.DirectVmConsumerNotAvailableException: No consumers available on endpoint: Endpoint[direct-vm://pipeRequestDR91]. Exchange[message2.csv] 
    at org.apache.camel.component.directvm.DirectVmProducer.process(DirectVmProducer.java:51)[camel-core-2.15.2.jar:2.15.2] 
    at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:129)[camel-core-2.15.2.jar:2.15.2] 
    at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77)[camel-core-2.15.2.jar:2.15.2] 
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:448)[camel-core-2.15.2.jar:2.15.2] 
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)[camel-core-2.15.2.jar:2.15.2] 
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)[camel-core-2.15.2.jar:2.15.2] 
    at org.apache.camel.component.file.GenericFileConsumer.processExchange(GenericFileConsumer.java:435)[camel-core-2.15.2.jar:2.15.2] 
    at org.apache.camel.component.file.GenericFileConsumer.processBatch(GenericFileConsumer.java:211)[camel-core-2.15.2.jar:2.15.2] 
    at org.apache.camel.component.file.GenericFileConsumer.poll(GenericFileConsumer.java:175)[camel-core-2.15.2.jar:2.15.2] 
    at org.apache.camel.impl.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:174)[camel-core-2.15.2.jar:2.15.2] 
    at org.apache.camel.impl.ScheduledPollConsumer.run(ScheduledPollConsumer.java:101)[camel-core-2.15.2.jar:2.15.2] 
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)[:1.7.0_71] 
    at java.util.concurrent.FutureTask.runAndReset(Unknown Source)[:1.7.0_71] 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(Unknown Source)[:1.7.0_71] 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source)[:1.7.0_71] 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)[:1.7.0_71] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)[:1.7.0_71] 
    at java.lang.Thread.run(Unknown Source)[:1.7.0_71] 
[1) thread #0 - file://src/data] GenericFileOnCompletion  WARN Rollback file strategy: org.apache[email protected]281eff for file: GenericFile[message3.csl] 
[1) thread #0 - file://src/data] DefaultErrorHandler 
+0

你確定消費者在生產者想要發送時還活着嗎?爲什麼不確保你的路線「永遠」活着? –

+0

我的消費者在100秒內仍然活着,生產者仍然在繼續尋找它。雖然它運行並且在使用相同的駱駝環境時需要不到一秒的時間。 我如何測試?我在eclipse上一個接一個地運行這兩個應用程序。 –

+0

我必須讓他們在OSGI中運行嗎? OSGI是direct-vm的限制嗎? –

回答

1

下面是一個小例子,(但Thread.sleep代碼僅僅是一個快速的方式來顯示什麼手段,兩種環境沒有的OSGi /彈簧等相同的JVM):

import org.apache.camel.CamelContext; 
import org.apache.camel.builder.RouteBuilder; 
import org.apache.camel.impl.DefaultCamelContext; 

public class Main { 
    public static void main(String[] args) throws Exception { 
     CamelContext first = new DefaultCamelContext(); 
     first.addRoutes(new RouteBuilder() { 
      @Override 
      public void configure() throws Exception { 
       from("timer:start").to("direct-vm:test"); 
      } 
     }); 

     CamelContext second = new DefaultCamelContext(); 
     second.addRoutes(new RouteBuilder() { 
      @Override 
      public void configure() throws Exception { 
       from("direct-vm:test").log("Message received"); 
      } 
     }); 

     first.start(); 
     second.start(); 

     Thread.sleep(100000); 
    } 
} 

事實上,正如我看到真實的要求是在不同的應用程序,以便JVM無線不同駱駝上下文之間進行通信會有所不同。與「direct」或「direct-vm」類似的最快捷方式是使用camel-netty4和選項「transferExchange」設置爲「true」(http://camel.apache.org/netty4.html)。這裏是一個包含了通信用這樣兩個單獨的應用程序的例子:

App1.java

import org.apache.camel.CamelContext; 
import org.apache.camel.builder.RouteBuilder; 
import org.apache.camel.impl.DefaultCamelContext; 

public class App1 { 
    public static void main(String[] args) throws Exception { 
     CamelContext first = new DefaultCamelContext(); 
     first.addRoutes(new RouteBuilder() { 
      @Override 
      public void configure() throws Exception { 
       from("timer:start").to("netty4:tcp://127.0.0.1:9999?transferExchange=true"); 
      } 
     }); 

     first.start(); 
     Thread.sleep(100000); 
    } 
} 

App2.java

import org.apache.camel.CamelContext; 
import org.apache.camel.builder.RouteBuilder; 
import org.apache.camel.impl.DefaultCamelContext; 

public class App2 { 
    public static void main(String[] args) throws Exception { 
     CamelContext second = new DefaultCamelContext(); 
     second.addRoutes(new RouteBuilder() { 
      @Override 
      public void configure() throws Exception { 
       from("netty4:tcp://127.0.0.1:9999?transferExchange=true").log("Message received"); 
      } 
     }); 

     second.start(); 

     Thread.sleep(100000); 
    } 
} 

通過更改IP地址,將有可能運行的應用程序在不同的機器上等。

+0

感謝這對我也很好,但是當我在上面的示例中顯示的兩個不同的Maven項目中嘗試相同時,它不起作用。 –

+0

當然,它不會工作,因爲當你從ide或cli運行它們時,每一個都有它自己的jvm –

+0

感謝您的迴應。即使我懷疑它,有沒有辦法實現這一點? –

0

讓您的消費者爲@Souciance Eqdam Rashti提到運行下去。 您可以參考下面的例子從駱駝文檔保持運行駱駝背景永遠

http://camel.apache.org/running-camel-standalone-and-have-it-keep-running.html

+0

因此,我也嘗試過,現在我的消費者正在永遠運行,我的製作人仍然在不斷尋找它,我想我可能會錯過別的東西。你有一個可以與我分享的工作例子,謝謝Murli! –

0

簡短的回答是:當上下文位於不同的JVM中時,路由無法通過direct-vm進行通信。期。

如果它們運行在相同的JVM中 - 例如在一些Java EE容器中運行的兩個WAR/EAR文件(如JBoss,Weblogic,Tomcat等)。 或者當應用程序中有一個主要方法啓動兩個上下文時。例如,它可以在不同的線程中完成。

+0

是的完全贊同你,我試過,我開始從主應用程序中的其他應用程序的路線。由於它是在同一個JVM中啓動的,因此它對我來說工作得很好。謝謝你的迴應Arjan –