当前位置: 首页 > 知识库问答 >
问题:

Apache Camel/Spring中的节流阀

段超
2023-03-14

如何在骆驼的所有路线上添加油门

@Component
public class MyRestRoute extends RouteBuilder {

@Value("${spring.application.name}")
private String appName;

@Value("${spring.application.description}")
private String description;

@Value("${spring.application.version}")
private String appVersion;

@Override
public void configure() throws Exception {

    restConfiguration().apiContextRouteId("swagger").contextPath(System.getenv("CONTEXT_PATH"))
            .apiContextPath("/swagger").component("servlet")
            .apiProperty("api.title", appName)
            .apiProperty("api.description", description)
            .apiProperty("api.version", appVersion)
            .apiProperty("host", "localhost")
            .apiProperty("port", "8080")
            .apiProperty("schemes", "http");



    rest("/transfers/{transfer_id}")
            .post().type(Request.class).id("id-limits").description("transfer").bindingMode(RestBindingMode.auto)
            .skipBindingOnErrorCode(true)
            .param().name("transfer_id").type(RestParamType.path).description("transferId").endParam()
            .produces(MediaType.APPLICATION_JSON_VALUE)

            .to("direct:transferRoute);


    rest("/accounts")
            .get().id("id-limits").description("Get Accounts").bindingMode(RestBindingMode.auto)
            .skipBindingOnErrorCode(true)

            .param().name("account_id").type(RestParamType.query).description("account_id").endParam()
            .param().name("document").type(RestParamType.query).description("document").endParam()

            .produces(MediaType.APPLICATION_JSON_VALUE)
            .to("direct:accountsRoute));
}
}

那可以得到不止一个Restresource_path,我怎么能在我的所有主要路线中插入油门。我知道我可以在.from(“直接:转移路由”)和.from(“直接:帐户路由”)中的每个路由的开始之后插入,但我想一般地插入我的所有资源。我可以在骆驼身上做到这一点,或者也许使用Spring更安全?

共有2个答案

李景天
2023-03-14

也许你可以使用拦截器 https://camel.apache.org/components/3.17.x/eips/intercept.html#_using_intercept

interceptFrom().throttle(...);
马煌
2023-03-14

据我所知,我认为在全球范围内这样做是不可能的。恐怕你得按每条路线来做。

作为一种(相当愚蠢的)变通方法,你可以想象这样的事情。

public abstract class CustomRouteBuilder extends RouteBuilder {
  public RouteDefinition fromWithTrottle(String uri) {
    return this.fromWithTrottle(uri, 3, 10000); // default throttling
  }
  public RouteDefinition fromWithTrottle(String uri, int count, long period) {
    return super.from(uri)
       .throttle(count)
       .timePeriodMillis(period);
}

public class MyRestRoute extends CustomRouteBuilder {
  @Override
  public void configure() throws Exception {
     fromWithTrottle("direct:transferRoute")
       .to("mock:transfer");

     fromWithTrottle("direct:accountsRoute", 2, 12_000)
       .to("mock:accounts")
  }
}
 类似资料:
  • Apache Camel:2.12.2,activemq:5.7 我们注意到,在下面的路由中,对于前100次交换,节流工作正常。此后,它不是每秒发送100次交换,而是每秒仅发送1次交换。现在,如果我们将timePeriodMillis设置为100,它似乎可以正常工作。注意,我们同时发送500个交换。

  • 我正在尝试向异步路由发送消息,但它不起作用。我刚刚在github上创建了一个项目来模拟这个问题

  • 我正在使用apache camel cxf开发一个Web服务(肥皂),我遇到了这个错误。 Java . lang . illegalargumentexception:Part { http://blue print . camel . ngt . TN/}返回的类型应为[ltn . ngt . camel . blue print . WB _ subscriptions;,而不是org . A

  • 我当前有一个配置有以下线程池的JMSListener: 我正在监听的队列有超过100条消息,当我启动侦听器时,它将处理前10条消息,没有任何问题,然后我将为其余的消息获得TaskRejectedException异常。 我的意图是,如果没有可用的线程来处理消息,@JMSListener不应该拉出任何新消息。有没有人知道这个配置是不是可以?我使用的是SpringBoot的1.5.3版本。

  • 我有一个restendpoint示例。org,返回表单的json响应 我的路线是这样的 我读过关于轮询消费者的内容,但找不到如何继续轮询endpoint的示例,直到它返回“success”响应。 是否应该使用轮询消费者?如果是这样的话,可以举一个与我的案例相关的例子。用于轮询restendpoint的任何其他资源都非常有用。

  • 问题内容: 我正在寻找JS中的简单节流阀。我知道像lodash和underscore这样的库都有它,但是仅对一个函数来说,包含其中任何一个库都是过大的。 我也在检查jquery是否具有类似的功能-找不到。 我发现一个工作的节流阀,这是代码: 问题是:在油门时间结束后,它将再次触发该功能。因此,假设我制作了一个在按键时每10秒触发一次的油门如果我按键2次,则在完成10秒后仍会触发第二次按键。我不要这