Camel isMockEndpointsAndSkip 不会跳过 jdbc 端点
Camel isMockEndpointsAndSkip doesn't skip jdbc endpoint
我有一条路线结束于 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;
}
在我的单元测试中,我想要 "mock and skip" 数据库:
@Override
public String isMockEndpointsAndSkip() {
return "jdbc:*";
}
我还尝试了其他模式:"jdbc:db"、"jdbc://db"(这个字符串显示在日志中,是toString的输出)
但是不管用什么模式调用数据库。日志显示
org.apache.camel.component.jdbc.JdbcProducer: Executing JDBC Statement: SELECT..
最后将正确的(空)结果发送到模拟端点。而模拟的 endpint mock:jdbc:db
或 mock: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);
}
};
如何使用拦截器跳过发送到 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
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
并替换完成这项工作。
我有一条路线结束于 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;
}
在我的单元测试中,我想要 "mock and skip" 数据库:
@Override
public String isMockEndpointsAndSkip() {
return "jdbc:*";
}
我还尝试了其他模式:"jdbc:db"、"jdbc://db"(这个字符串显示在日志中,是toString的输出)
但是不管用什么模式调用数据库。日志显示
org.apache.camel.component.jdbc.JdbcProducer: Executing JDBC Statement: SELECT..
最后将正确的(空)结果发送到模拟端点。而模拟的 endpint mock:jdbc:db
或 mock: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);
}
};
如何使用拦截器跳过发送到 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
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
并替换完成这项工作。