骆驼3:如何使用“ interceptSendToEndpoint”拦截来自“ onException”的路由

可能

问题:

从Camel 2迁移到3的过程中,我的错误路由测试失败了。

我遵循的模式是强制执行异常并断言该onException()块将使用适当的标签发送到我的指标路由。

我正在使用uri模式匹配来单独测试是否发射了每个标签...这会严重影响测试模式

注意:在下面的两个示例中,createRouteBuilder()方法相同

传递骆驼2示例

import org.apache.camel.RoutesBuilder
import org.apache.camel.builder.RouteBuilder
import org.apache.camel.test.junit4.CamelTestSupport
import org.junit.Test
import java.util.concurrent.TimeUnit

class Camel2Test : CamelTestSupport() {

    val startUri = "direct:start"
    val baseMetricsUri = "micrometer:counter:errors"
    // Want to use pattern to test each individual tag here
    val fullMetricsUri = "$baseMetricsUri?tags=a=1,b=2"

    override fun isUseAdviceWith(): Boolean {
        return true
    }

    override fun createRouteBuilder(): RoutesBuilder {
        return object : RouteBuilder() {
            override fun configure() {

                onException(Exception::class.java)
                    .to(fullMetricsUri)

                from(startUri)
                    .routeId(startUri)
                    .throwException(Exception())
            }

        }
    }

    @Test
    fun `metric with tag B is emitted`() {
        val exchange = createExchangeWithBody("")

        val mockEndpoint = getMockEndpoint("mock:test")

        context.getRouteDefinition(startUri)
            .adviceWith(context, object : RouteBuilder() {
                override fun configure() {
                    interceptSendToEndpoint("$baseMetricsUri.*b.*2.*") // <-- PATTERN
                        .skipSendToOriginalEndpoint()
                        .to(mockEndpoint)
                }
            })

        context.start()

        mockEndpoint.expectedMessageCount(1)

        template.send(startUri, exchange)

        assertMockEndpointsSatisfied(2, TimeUnit.SECONDS)
    }
}

失败的骆驼3示例

import org.apache.camel.RoutesBuilder
import org.apache.camel.builder.AdviceWithRouteBuilder
import org.apache.camel.builder.RouteBuilder
import org.apache.camel.test.junit4.CamelTestSupport
import org.junit.Test
import java.util.concurrent.TimeUnit

class Camel3Test : CamelTestSupport() {

    val startUri = "direct:start"
    val baseMetricsUri = "micrometer:counter:errors"
    // Want to use pattern to test each individual tag here
    val fullMetricsUri = "$baseMetricsUri?tags=a=1,b=2"

    override fun isUseAdviceWith(): Boolean {
        return true
    }

    override fun createRouteBuilder(): RoutesBuilder {
        return object : RouteBuilder() {
            override fun configure() {

                onException(Exception::class.java)
                    .to(fullMetricsUri)

                from(startUri)
                    .routeId(startUri)
                    .throwException(Exception())
            }

        }
    }

    @Test
    fun `metric with tag B is emitted`() {
        val exchange = createExchangeWithBody("")

        val mockEndpoint = getMockEndpoint("mock:test")

        AdviceWithRouteBuilder.adviceWith(context, startUri) { routeBuilder ->
            routeBuilder.interceptSendToEndpoint("$baseMetricsUri.*b.*2.*") // <-- PATTERN
                .skipSendToOriginalEndpoint()
                .to(mockEndpoint)
        }

        context.start()

        mockEndpoint.expectedMessageCount(1)

        template.send(startUri, exchange)

        assertMockEndpointsSatisfied(2, TimeUnit.SECONDS)
    }
}

mockEndpoint未接收到交换,它是不是仍然要度量端点。

题:

在骆驼3中,如何使用模式来拦截像在骆驼2中一样的路线手动测试表明错误路由的行为与产品中预期的一样,因此这似乎是测试配置问题。

其他详情:

  • 骆驼仓库的这个单元测试演示了我正在尝试做的事情,但是通过手动拦截路线而不是mock:直接在路线中使用。
  • 当我不需要模式匹配时,这种替代方法有效

    override fun isMockEndpointsAndSkip() = myUri
    
    // ... in test
    getMockEndpoint("mock:$myUri").expectedMessageCount(1)
    
可能

这似乎与的使用直接相关onException()显然,在Camel 3中,您不再可以直接从进行拦截onException,因此将业务逻辑从异常块中移出到新的路由中可以使拦截工作。

就我而言,这仅需要将相关onException信息保存在交换属性中,然后可以在发出度量标准时进行引用。

import org.apache.camel.RoutesBuilder
import org.apache.camel.builder.AdviceWithRouteBuilder
import org.apache.camel.builder.RouteBuilder
import org.apache.camel.test.junit4.CamelTestSupport
import org.junit.Test
import java.util.concurrent.TimeUnit

class Camel3ErrorInterceptWorking : CamelTestSupport() {

    val startUri = "direct:start"
    val errorUri = "direct:errors"
    val baseMetricsUri = "micrometer:counter:errors"
    val fullMetricsUri = "$baseMetricsUri?tags=a=1,b=2"

    override fun isUseAdviceWith(): Boolean {
        return true
    }

    override fun createRouteBuilder(): RoutesBuilder {
        return object : RouteBuilder() {
            override fun configure() {

                onException(Exception::class.java)
                    .to(errorUri)

                from(errorUri)
                    .to(fullMetricsUri) // Moved metrics here from `onException`

                from(startUri)
                    .routeId(startUri)
                    .throwException(Exception())
            }

        }
    }

    @Test
    fun `exception is routed to error logging route`() {
        val exchange = createExchangeWithBody("")

        val mockEndpoint = getMockEndpoint("mock:test")

        AdviceWithRouteBuilder.adviceWith(context, startUri) { routeBuilder ->
            routeBuilder.interceptSendToEndpoint("$baseMetricsUri.*b.*2.*") // <-- PATTERN
                .skipSendToOriginalEndpoint()
                .to(mockEndpoint)
        }

        context.start()

        mockEndpoint.expectedMessageCount(1)

        template.send(startUri, exchange)

        assertMockEndpointsSatisfied(2, TimeUnit.SECONDS)
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

骆驼SFTP路由无法继续onException

来自分类Dev

骆驼onException重新交付澄清

来自分类Dev

骆驼onException不能捕获idempotentConsumer的NoMessageIdException吗?

来自分类Dev

如何拦截API调用并使用UserScript显示来自它的数据?

来自分类Dev

如何拦截网址以动态更改路由

来自分类Dev

如何拦截网址以动态更改路由

来自分类Dev

在Apache骆驼中为全局onException注入或继承Router Builder

来自分类Dev

Unity拦截器如何确定呼叫是来自WCF还是来自内部服务?

来自分类Dev

Unity拦截器如何确定呼叫是来自WCF还是来自内部服务?

来自分类Dev

角路由未被拦截

来自分类Dev

拦截Laravel路由

来自分类Dev

动态拦截骆驼端点

来自分类Dev

拦截骆驼交换

来自分类Dev

来自printf的消息如何路由到终端?

来自分类Dev

骆驼测试:如何访问路由中设置的标题

来自分类Dev

从ByteArrayInputStream进行骆驼路由

来自分类Dev

你如何在 UITextField 子类中拦截来自键盘的文本输入事件

来自分类Dev

如何在 React 组件中拦截来自 Chatbot 的消息?(微软botframework-webchat)

来自分类Dev

如何使用骆驼的cipientntList

来自分类Dev

apache骆驼路由队列问题

来自分类Dev

骆驼:无法动态添加路由

来自分类Dev

简单的骆驼ftp路由超时

来自分类Dev

骆驼路由无法正常工作

来自分类Dev

骆驼路由无法正常工作

来自分类Dev

Apache骆驼同步文件路由

来自分类Dev

骆驼路由多个,如果条件

来自分类Dev

骆驼路由聚合序列问题

来自分类Dev

如何在路由更改时显示来自db的数据?

来自分类Dev

如何路由来自外部请求的React组件?