2017-08-18 25 views
5

我有一種方法,它每隔一段時間生成一個字符串。我想將方法​​註冊爲uri並生成一個交換方法,該方法將用作路由的輸入。在駱駝路線中使用一種方法作爲生產者

的方法是通過一個不同的類呼叫

SampleClass sc = new SampleClass(); 
sc.sampleMethod("Hello"); 

例如:

public class SampleClass{ 
    @Produce(uri = "direct:consumerMethod") 
    ProducerTemplate producer; 
    public sampleMethod(Object obj){ 
      producer.sendBody(object); 
    } 
} 

路線被定義爲如下:

@Override 
    public void configure() { 
     from("direct:consumerMethod").process(new GenerateD()); 
    } 

但路線犯規呼叫生成的類時我生產使用sampleMethod。這是不可行的,或者我做錯了什麼?

+0

我相信'.process(...)'的參數需要是一個'Processor'或繼承/實現它 - 在你的處理器中,你可以調用你的方法。我離我的示例代碼很近,但這可能會讓您朝正確的方向發展。 – ochi

+1

你會得到什麼錯誤? – Strelok

+0

我放了一個try catch附近producer.sendBody(),發現生產者爲空。那麼這是否意味着直接:consumerMethod未啓動? –

回答

1

最後這是我用例的工作。

開始camelcontext如下:

CamelContext camelContext = new DefaultCamelContext(); 
camelContext.addRoutes(new SampleRoute()); 
camelContext.start(); 

我routebuilder類:

class SampleRoute extends RouteBuilder { 

    @Override 
    public void configure() { 
     try 
     { 
      from("direct:consumerMethod").process(new DDT()); 
     }catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 

    } 
} 

我然後創建具有的sendMessage方法的接口。

public interface DDTConsumer { 

    public String sendMessage(Object object); 

} 

現在我實現此方法來創建此接口的端點併發送消息到端點。

DDTConsumer ddt; 
try { 
    ddt = new ProxyBuilder(camelContext).endpoint("direct:consumerMethod").build(DDTConsumer.class); 
    ddt.sendMessage(msg.getValue()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

這解決了我的問題,現在路線工作正常。希望它也能幫助別人。

0

在你的類,你必須在sampleMethod(Object)添加以下字段:

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

在你sampleMethod(Object)可以使用以前添加template這樣的:

public sampleMethod(Object obj){ 
     template.sendBody(object); 
} 

它應該發送一條消息到direct:consumerMethod路線。

+0

如果你看到我的代碼,它已經這樣做了,但是這個過程並沒有被調用。 –

+0

你確定'direct:consumerMethod'路線開始了嗎?你和Spring一起使用駱駝嗎? – mgyongyosi

0

使用這樣的事情,如果你要調用的someMethod

@Override 
public void configure() { 
    from("direct:consumerMethod").log(simple("${bean:generateD?method=generateDMethod}")); 
} 

上述表達式將調用generateD對象(豆)的generateDMethod和日誌的方式輸出到控制檯(默認日誌作家)。 爲了使上述表達式正常工作,您必須在註冊表中存儲generateD bean,該註冊表將進一步與您的應用程序的CamelContext關聯。您可以按照以下步驟進行操作

@Autowired 
private GenerateD generateD; 

@Override 
protected CamelContext createCamelContext() throws Exception { 
    SimpleRegistry registry = new SimpleRegistry(); 
    registry.put("generateD", generateD); //the generateD bean,which can be used anywhere in the camelcontext 
    SpringCamelContext camelContext = new SpringCamelContext(); 
    camelContext.setRegistry(registry); //add the registry 
    camelContext.setApplicationContext(getApplicationContext()); 
    camelContext.start(); 
    return camelContext; 
} 

這會將bean添加到camelContext中。請在這個link查看我的回答,以獲得完整的示例。