Я построил два разных сервисных коннектора для одного сервиса. Если я добавлю оба служебных соединителя в свое приложение, Spring не начнет говорить, что не найдено подходящего служебного соединителя. Я отлаживал Spring и обнаружил, что только один из соединителей добавляется в список внутренних соединителей. Можно ли добавить два разных коннектора облачных сервисов spring для одного сервиса и использовать их в одном приложении?
Для лучшего понимания пример с сервисом rabbitMQ. Допустим, я создал два разных коннектора облачных сервисов с CloudFoundryServiceInfoCreator<AMQConnectionInfo> и CloudFoundryServiceInfoCreator<MQTTConnectionInfo>. Я хотел бы использовать оба соединителя в приложении (я знаю, что могу реализовать обе информации о соединении в одном облачном соединителе spring, но это не то, что я хотел бы делать).
редактировать: Возникает следующее исключение:
org.springframework.cloud.CloudException: No unique service matching class .... found. Expected 1, found 0
at org.springframework.cloud.Cloud.getSingletonServiceConnector(Cloud.java:149)
Я также пытался использовать cloud.getServiceConnector(id, class, null);.
Я также только что обнаружил, что Spring Cloud Connectors просто возвращает первый Connector, найденный в этом методе в org.springframework.cloud.AbstractCloudConnector:
private ServiceInfo getServiceInfo(SD serviceData) {
for (ServiceInfoCreator<? extends ServiceInfo,SD> serviceInfoCreator : serviceInfoCreators) {
if (serviceInfoCreator.accept(serviceData)) {
return serviceInfoCreator.createServiceInfo(serviceData);
}
}
// Fallback with a warning
ServiceInfo fallackServiceInfo = getFallbackServiceInfoCreator().createServiceInfo(serviceData);
logger.warning("No suitable service info creator found for service " + fallackServiceInfo.getId()
+ " Did you forget to add a ServiceInfoCreator?");
return fallackServiceInfo;
}
Я думаю, было бы неплохо, если бы это вернуло список подходящих ServiceInfoCreator или ищет тот, который я запросил, не так ли?
да. Каждый коннектор реализован в собственном проекте (с использованием maven). Также каждый коннектор работает, если он один в пом "основного" приложения.
Давайте начнем с простого вопроса: можете ли вы убедиться, что вы добавили оба служебных соединителя в соответствующие файлы служб, например.
META-INF/services/org.springframework.cloud.cloudfoundry.CloudFoundryServiceInfoCreator?