Есть ли лучший способ разрешить только одно одновременное выполнение верблюжьего маршрута и отбросить дополнительные запJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Есть ли лучший способ разрешить только одно одновременное выполнение верблюжьего маршрута и отбросить дополнительные зап

Сообщение Anonymous »

Цель:
  • Я хочу пробежать верблюжий маршрут, прохождение которого займет много времени. Я хочу
    запустить этот маршрут с помощью запроса put.
  • Я хочу разрешить только 1 одновременное
    выполнение для этого маршрута.
    < li>Я хочу отменить любой другой запрос,
    поступивший во время обработки маршрута. Я не хочу ставить их в очередь, чтобы
    обработать позже, просто выбросьте их.
Попробовав все, что я мог придумать, у меня получилось следующий код, который использует AtomicBoolean, чтобы запомнить, обрабатывает ли он что-то в данный момент или нет. Но мне это кажется немного хакерским. Учитывая вышеизложенные требования, я должен решить эту проблему таким образом или Camel предлагает лучший способ?

Код: Выделить всё

@Component
public class TestRoute2 extends RouteBuilder {

@Autowired
private MyService myService;

@Override
public void configure() {

AtomicBoolean isProcessing = new AtomicBoolean(false);

from("platform-http:/api/myservice?httpMethodRestrict=PUT")
.routeId("myServiceRoute")
.doTry()
.process(exchange -> {
// Cast the endpoint to SedaEndpoint to access the queue
SedaEndpoint sedaEndpoint = (SedaEndpoint)
getContext().getEndpoint("seda:handlePut");
int currentQueueSize = sedaEndpoint
.getQueue()
.size();

if (currentQueueSize > 0 || isProcessing.get()) {
throw new org.apache.camel.CamelExchangeException("Service busy", exchange);
}

// Mark service as busy
isProcessing.set(true);
})
.wireTap("seda:handlePut")
.setHeader("CamelHttpResponseCode", constant(204))
.endDoTry()
.doCatch(org.apache.camel.CamelExchangeException.class)
.setHeader("CamelHttpResponseCode", constant(503))
.setBody(constant("Service busy, please try again later"))
.end();

from("seda:handlePut?concurrentConsumers=1")
.doTry()
.bean(myService, "slowMethod") // runs for long time
.endDoTry()
.doFinally()
.process(exchange -> isProcessing.set(false));
}
}
До этого я также пробовал следующий код. Он не использует AtomicBoolean, что кажется улучшением с точки зрения чистого кода, но проблема в том, что он все еще ставит в очередь 1 дополнительный запрос, прежде чем начнет возвращать 503. Это означает, что n запросов PUT к конечной точке /api/myservice во время работы handlePut вызовут 1 дополнительное выполнение маршрута handlePut, который будет выполнен после завершения первоначального handlePut, но мне нужно 0 дополнительных выполнений.

Код: Выделить всё

  @Override
public void configure() {

from("platform-http:/api/myservice?httpMethodRestrict=PUT")
.routeId("myServiceRoute")
.doTry()
.process(exchange -> {
SedaEndpoint sedaEndpoint = (SedaEndpoint)
getContext().getEndpoint("seda:handlePut");
int currentQueueSize = sedaEndpoint
.getQueue()
.size();
if (currentQueueSize > 0) {
throw new org.apache.camel.CamelExchangeException("Service busy", exchange);
}
})
.wireTap("seda:handlePut")
.setHeader("CamelHttpResponseCode", constant(204))
.endDoTry()
.doCatch(org.apache.camel.CamelExchangeException.class)
.setHeader("CamelHttpResponseCode", constant(503))
.setBody(constant("Service busy, please try again later"))
.end();

from("seda:handlePut?concurrentConsumers=1")
.bean(myService, "slowMethod");
}
Этот код использует AtomicBoolean так, как это должно быть, или у Camel есть более правильный способ?


Подробнее здесь: https://stackoverflow.com/questions/790 ... on-and-dis
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»