2017-08-18 17 views
5

Tôi có phương pháp mà bây giờ và sau đó tạo ra một chuỗi. Tôi muốn đăng ký phương pháp như uri và tạo ra một phương thức trao đổi sẽ được sử dụng làm đầu vào cho một tuyến đường.Sử dụng phương pháp làm nhà sản xuất trong tuyến đường lạc đà

Phương pháp này là lời kêu gọi của một lớp khác nhau

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

Ví dụ:

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

Các tuyến đường được xác định như sau:

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

Nhưng các cuộc gọi đường doesnt tạo lớp khi tôi sản xuất bằng cách sử dụng sampleMethod. Điều này không khả thi hay tôi đang làm điều gì sai?

+0

Tôi tin rằng tham số cho '.process (...)' cần phải là một 'Processor' hoặc kế thừa/thực hiện nó - Bên trong bộ xử lý của bạn, sau đó bạn có thể gọi phương thức của bạn. Tôi là hư không gần mã mẫu của tôi nhưng điều này có thể thúc đẩy bạn đi đúng hướng. – ochi

+1

Bạn gặp phải lỗi gì? – Strelok

+0

Tôi đặt một thử bắt xung quanh producer.sendBody() và tìm thấy nhà sản xuất là null. Vì vậy, điều này có nghĩa là trực tiếp: consumerMethod không được bắt đầu? –

Trả lời

1

Cuối cùng, đây là những gì phù hợp với trường hợp sử dụng của tôi.

Bắt đầu camelcontext như sau:

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

lớp routebuilder của tôi:

class SampleRoute extends RouteBuilder { 

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

    } 
} 

sau đó tôi tạo ra một giao diện trong đó có một phương pháp SendMessage.

public interface DDTConsumer { 

    public String sendMessage(Object object); 

} 

Bây giờ tôi triển khai phương pháp này để tạo điểm cuối của giao diện này và gửi thư đến điểm cuối.

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

Điều này đã giải quyết được sự cố và tuyến đường của tôi hiện đang hoạt động tốt. Hy vọng nó cũng giúp người khác.

0

Trong lớp học của bạn, nơi bạn có sampleMethod(Object) thêm lĩnh vực sau đây:

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

Trong bạn sampleMethod(Object) bạn có thể sử dụng trước đây thêm template như thế này:

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

Và nó nên gửi một tin nhắn đến tuyến đường direct:consumerMethod.

+0

Nếu u thấy mã của tôi, nó đã làm điều đó. Vì vậy, quá trình này không được gọi. –

+0

Bạn có chắc chắn rằng tuyến 'direct: consumerMethod' đã bắt đầu? Bạn có sử dụng Camel with Spring không? – mgyongyosi

0

Sử dụng một cái gì đó như thế này, nếu bạn muốn gọi somemethod

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

Các biểu thức trên sẽ gọi generateDMethod của generateD đối tượng (đậu) và đăng nhập các phương pháp đầu ra để an ủi (nhà văn đăng nhập mặc định). Để thực hiện công việc trên biểu thức, bạn phải lưu trữ generateD bean trong Registry, nó sẽ được liên kết thêm với CamelContext của ứng dụng của bạn. Bạn có thể thực hiện tương tự như sau

@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; 
} 

Điều này thêm bean vào camelContext. Vui lòng kiểm tra câu trả lời của tôi tại số link này để có ví dụ hoàn chỉnh.

Các vấn đề liên quan