2016-09-26 110 views
0

我有一个JDBC端点端的路由:骆驼isMockEndpointsAndSkip不会跳过JDBC端点

from(CONNECTOR).routeId(ROUTE_ID).process(createSelectStatement).to(jdbc); 

JDBC的端点创建是这样的:

public static final String DB_NAME = "db"; 

private void setupJdbcEndpoint() { 
    JdbcEndpoint endpoint = getContext().getEndpoint("jdbc:" + DB_NAME, JdbcEndpoint.class); 
    endpoint.setOutputClass(OUTClass.class.getName()); 
    endpoint.setOutputType(JdbcOutputType.SelectList); 
    jdbc = endpoint; 
} 

在我的单元测试,我想“模拟和跳过”的数据库:

@Override 
public String isMockEndpointsAndSkip() { 
    return "jdbc:*"; 
} 

我也试过其他图案:“JDBC:分贝”,“JDBC://分贝”(该字符串是在l所示并且是toString的输出)

但是无论使用哪种模式,数据库都被调用。日志显示

org.apache.camel.component.jdbc.JdbcProducer: Executing JDBC Statement: SELECT.. 

然后将正确的(空的)结果发送到最后的模拟端点。而嘲弄的终端mock:jdbc:dbmock:jdbc://db()永远不会收到任何东西。

那么如何跳过这个jdbc端点呢?

以及如何获得模拟端点的引用,这些端点是使用通配符创建的,如'*'?

编辑

在此设置下我也看到日志:

InterceptSendToMockEndpointStrategy: Adviced endpoint [jdbc://db] with mock endpoint [mock:jdbc:db] 

所以isMockEndpointAndSkip似乎工作?但在我的情况下,jdbc端点不会被跳过。

第二编辑 - 从Vimsha 试图回答不使用isMockEndpointAndSkip但提供AdviceWithRouteBuilder没有帮助(我觉得骆驼实现isMockEndpointAndSkip方法相同)。我看到在日志(使用构建器Vimsha建议):

InterceptSendToEndpoint[jdbc:* -> [To[mock://jdbc://db]]], process[[email protected]], To[jdbc://db]]] 

除此之外数据库仍然是所谓的模拟端点没有看到任何的交流。

这里是详细的建设者:

new AdviceWithRouteBuilder() { 

      @Override 
      public void configure() throws Exception { 
       replaceFromWith(in); 
       interceptSendToEndpoint("jdbc:*").skipSendToOriginalEndpoint().to(dbMock); 

      } 
     }; 

回答

1

Vimsha引导到正确的方向,但由于某种原因,这是行不通的interceptSendToEndpoint("jdbc:*").skipSendToOriginalEndpoint()..

但这部作品在我的路线我添加了一个ID为jdbc端点:

...to(jdbc).id("jdbc")

在测试我加入这个AdviceWithRouteBuilder:

new AdviceWithRouteBuilder() { 

     @Override 
     public void configure() throws Exception { 
      replaceFromWith(in); 
      // interceptSendToEndpoint("jdbc:*").skipSendToOriginalEndpoint().to(dbMock); 
      weaveById("jdbcOut").replace().to(dbMock); 
     } 
    }; 

所以weaveById和替换做的工作。

+0

这也为我解决。请确保weaveById(“...”)中的id参数与您的端点ID相符。 –

1

如何使用拦截器跳过发送到JDBC端点并将其发送到一个模拟队列

RouteDefinition route = context.getRouteDefinitions().get(0); 
route.adviceWith(context, new RouteBuilder() { 
     @Override 
     public void configure() throws Exception { 
      interceptSendToEndpoint("jdbc:*") 
       .skipSendToOriginalEndpoint() 
       .to("mock:jdbc"); 
     } 
}); 

你可以改变你的JDBC端点这

private void setupJdbcEndpoint() { 
    jdbc = "jdbc:" + DB_NAME + "?outputType=SelectList&outputClass=" + OUTClass.class.getName(); 
} 

看到这个documentation

+0

谢谢,我编辑了我的文章。目前,由于另一个问题,我无法尝试您的建议。 和我不喜欢基于字符串的配置 - 试图阻止字符串文字。 – dermoritz

+0

看到我的第二次编辑,这是行不通的 – dermoritz