【问题标题】:How can I avoid putting camel dependency in pojo? : camel-example-spring-boot-rest-jpa :如何避免在 pojo 中依赖骆驼? :骆驼示例-spring-boot-rest-jpa:
【发布时间】:2017-10-31 01:27:29
【问题描述】:

camel-example-spring-boot-rest-jpa

我正在查看 Order.java :

@Consumed
public void setProcessed() {
}

我了解这是必需的,因此 Camel 不需要重新处理已处理的订单。但是,如果不向 Order.java pojo 添加骆驼依赖项,如何实现呢?

原因:在现实生活中我们需要在不给pojo添加外部依赖的情况下实现相同的功能。

参考:https://github.com/apache/camel/blob/master/examples/camel-example-spring-boot-rest-jpa/src/main/java/org/apache/camel/example/spring/boot/rest/jpa/Order.java


编辑 1: 按照claus的建议,创建了一个自定义删除处理器

public class OrderProcessedHandler implements DeleteHandler<Order>{
    @Override
    public void deleteObject(EntityManager arg0, Object arg1, Exchange arg2) {
        ((Order) arg1).setProcessed(true);
    }
}

并在端点uri中指定:

    // A second route polls the DB for new orders and processes them


from("jpa:sb.app.bo.Order" 
+ "?consumer.namedQuery=new-orders"
+ "&consumer.delay={{example.processOrderPeriod:25s}}"
+ "&consumeDelete=false"
+ "&deleteHandler=sb.app.camel.routes.OrderProcessedHandler")
.routeId("process-order")
.log("Processed order #id ${body.id} with ${body.amount} ");

无法使用Handler,错误日志:

2017-10-31 15:45:33.688 ERROR 1429 --- [  restartedMain] o.s.boot.SpringApplication               : Application startup failed

org.apache.camel.RuntimeCamelException: org.apache.camel.FailedToCreateRouteException: Failed to create route process-order: Route(process-order)[[From[jpa:sb.app.bo.Order?consumer.name... because of Failed to resolve endpoint: jpa://sb.app.bo.Order?consumeDelete=false&consumer.delay=25s&consumer.namedQuery=new-orders&deleteHandler=sb.app.camel.routes.OrderProcessedHandler due to: Could not find a suitable setter for property: deleteHandler as there isn't a setter method with same type: java.lang.String nor type conversion possible: No type converter available to convert from type: java.lang.String to the required type: org.apache.camel.component.jpa.DeleteHandler with value sb.app.camel.routes.OrderProcessedHandler
    at org.apache.camel.util.ObjectHelper.wrapRuntimeCamelException(ObjectHelper.java:1831) ~[camel-core-2.20.0.jar:2.20.0]
    at org.apache.camel.spring.SpringCamelContext.start(SpringCamelContext.java:136) ~[camel-spring-2.20.0.jar:2.20.0]
    at org.apache.camel.spring.SpringCamelContext.onApplicationEvent(SpringCamelContext.java:174) ~[camel-spring-2.20.0.jar:2.20.0]

解决方案(基于@claus 建议):

// A second route polls the DB for new orders and processes them
from("jpa:sb.app.bo.Order"  //select * from orders where consumed = false
    + "?consumer.namedQuery=query_new_orders"
    + "&consumer.delay={{example.processOrderPeriod:5s}}"
    + "&consumeDelete=false"
    + "&deleteHandler=#orderProcessedMarker")
    .routeId("process-order")
    .log("Processed order #id ${body.id} with ${body.amount} copies of the «${body.book.description}» book");

DeleteHandler bean:

@Bean(name = "orderProcessedMarker")
public DeleteHandler<Order> createOrderProcessHandler() {
    return new DeleteHandler<Order>() {
        @Override
        public void deleteObject(EntityManager arg0, Object arg1, Exchange arg2) {
            ((Order) arg1).setProcessed(true);
        }
    };
}

【问题讨论】:

  • 您的意思是要排除某些特定的依赖项吗?

标签: apache-camel


【解决方案1】:

【讨论】:

  • 添加了 OrderDeleteHandler 并更新了 uri(见编辑),但是 deleteHandler 没有连接。 URI 格式问题?
  • 在端点 uri 中使用 '#beanName`,并使 Spring Boot 通过 @Component("beanName") 使用您为 beanName 选择的名称将类公开为 bean。
猜你喜欢
  • 2014-01-07
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 2016-09-10
相关资源
最近更新 更多