0

我有一条在 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:db”、“jdbc://db”(此字符串显示在日志中,是 toString 的输出)

但无论使用什么模式,数据库都会被调用。日志显示

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

最后将正确的(空)结果发送到模拟端点。并且模拟的 endpintmock: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[Processor@0x6e9a5ed8], To[jdbc://db]]]

除此之外,数据库仍然被称为模拟端点,没有看到任何交换。

这是详细的构建器:

new AdviceWithRouteBuilder() {

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

            }
        };
4

2 回答 2

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();
}

请参阅本文档

于 2016-09-26T15:29:50.607 回答
1

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

但这适用于我的路线,我向 jdbc 端点添加了一个 id:

...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并替换做这项工作。

于 2016-09-27T09:02:56.317 回答