Я хочу обернуть вызов исходящего шлюза в своем приложении интеграции, используя Команда hystrix аналогична той, которая доступна в загрузочном приложении Spring.
<int-http:outbound-gateway id = "outbound.gateway"
request-channel = "get.request.channel" url = "http://localhost:9090/profileapplication"
http-method = "GET" charset='UTF-8' reply-channel = "reply.channel"
>
</int-http:outbound-gateway>
У меня есть исходящий шлюз, как указано выше.
Мне это нужно для сценария, когда целевое приложение часто не работает / не реагирует и мы ищем способ дать имитационный ответ во время этих сценариев и дать возможность целевое приложение для восстановления.
По сути, я хочу использовать команда Hystrix и смоделировать здесь схема выключателя.
Я чувствую, что использую комбинацию ExpressionEvaluatingRequestHandlerAdvice и RequestHandlerCircuitBreakerAdvice может быть полезно, но я не нашел никаких документов, как использовать их вместе в моем сценарии.
С Spring Boot это кажется проще, но с интеграцией я считаю, что это непонятно.
Если кто-то реализовал подобное поведение, добавив настраиваемое поведение для шлюза исходящей почты, сообщите нам об этом.
Обновлено:
В соответствии с предложением я сделал, как показано ниже,
Добавлена аннотация @EnableCircuitBreaker в мой класс загрузочного приложения Spring.
@SpringBootApplication
@RestController
@ImportResource("classpath:/META-INF/spring/integration/hystrix-outbound-config.xml")
@EnableCircuitBreaker
public class HystrixIntegrationApplication {
.. }
Кроме того, добавлена аннотация @HystrixCommand к моему интерфейсу шлюза, как показано ниже,
@MessagingGateway
public interface HystrixServiceGateway {
@Gateway(requestChannel = "get.request.channel", replyChannel = "reply.channel")
@HystrixCommand(fallbackMethod = "getMockdata")
String getMessage(String name);
default String getMockData(String name) {
return "Mock Data:" + name;
}
}
Я добавил метод в сам интерфейс, поскольку java 8 поддерживает методы по умолчанию в интерфейсе.
Я даже пробовал использовать статические методы в интерфейсе, как показано ниже.
@MessagingGateway
public interface HystrixServiceGateway {
@Gateway(requestChannel = "get.request.channel", replyChannel = "reply.channel")
@HystrixCommand(fallbackMethod = "getMockdata")
String getMessage(String name);
static String getMockData(String name) {
return "Mock Data:" + name;
}
}
Я использовал версии Spring Boot 1.5.12 и Spring облако Edgware.SR3. Я также добавил зависимости весна-облако-стартер-гистрикс и sPring-Cloud-Starter-Eureka в свое приложение pom.xml.
Не уверен, что аннотация @hystrix решает проблему.




Любой адаптер исходящего канала (или шлюз) можно настроить с помощью request-handler-advice-chain, где «цепочка» является основной задачей. Таким образом, вы действительно можете связать один совет с другим, используя их комбинацию, как в вашем случае. Достаточно настроить одну за другой.
Пример retry and more должен дать вам некоторые идеи: https://github.com/spring-projects/spring-integration-samples/tree/master/intermediate/retry-and-more
Я вернусь позже с решением Hystrix, если это возможно.
ОБНОВИТЬ
Что ж, согласно документации Spring Cloud, у нас может быть что-то вроде:
@Component
public class StoreIntegration {
@HystrixCommand(fallbackMethod = "defaultStores")
public Object getStores(Map<String, Object> parameters) {
//do stuff that might fail
}
public Object defaultStores(Map<String, Object> parameters) {
return /* something useful */;
}
}
А с точки зрения Spring Integration у нас может быть @MessagingGateway перед любым каналом сообщений. Итак, я предлагаю попробовать эту аннотацию Hystrix для метода @Gateway: одну для вызова HTTP-шлюза, а другую в качестве запасного варианта: https://docs.spring.io/spring-integration/docs/5.0.4.RELEASE/reference/html/messaging-endpoints-chapter.html#gateway
Я добавил в свой sendbox простой образец: https://github.com/artembilan/sendbox/tree/master/spring-integration-with-hystrix
Итак, решение такое:
@ServiceActivator(inputChannel = "serviceChannel")
@HystrixCommand(fallbackMethod = "serviceFallback")
public String myService(String payload) {
// Some external service call
}
public String serviceFallback(String payload) {
// some fallback logic
}
См. Также обсуждение здесь: stackoverflow.com/questions/45480446/…
См. ОБНОВЛЕНИЕ в моем ответе.
Спасибо, но я не могу повторить попытку и другие примеры. Наверное, нужно больше времени, чтобы понять это. В любом случае ваши предложения полезны.
Прохладный! Похоже, время для этого: stackoverflow.com/help/someone-answers?
Спасибо за ваше предложение. Я попытался использовать аннотацию hystrix, но она все равно не обрабатывает сценарий исключения, когда служба не работает. Я представлю изменения, которые я внес в ближайшее время.