Я пытаюсь создать динамические адаптеры входящего канала Http с разными путями, которые генерируются значениями базы данных.Динамический HTTP-адаптер входящего канала
Я использую те же принципы, что и в [https://github.com/spring-projects/spring-integration-samples/tree/master/advanced/dynamic-ftp].
Динамический контекст выглядит следующим образом:
<context:property-placeholder />
<int-http:inbound-channel-adapter id="dynamicInboundEdi846HttpRequest" channel="dynamicInboundEdi846HttpChannel" auto-startup="${startup}"
path="${url}" supported-methods="POST"/>
<int:header-enricher input-channel="dynamicInboundEdi846HttpChannel" output-channel="${successChannel}">
<int:header name="tsp" value="${tsp}"/>
</int:header-enricher>
<bean id="multipartResolver" class="com.bstonetech.ptms.integration.service.http.CustomMultipartResolver"/>
<int:channel id="dynamicInboundEdi846HttpChannel"/>
<int:channel id="inboundDynamEdiHttpErrorChannel"/>
Динамический код адаптера выглядит следующим образом:
public class DynamicHttpAdapter implements ApplicationContextAware {
private static ApplicationContext context;
private static final Logger log = LoggerFactory.getLogger(DynamicHttpAdapter.class);
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
context = applicationContext;
}
@Autowired
private IFileService fileService;
private final Map<String , ConfigurableApplicationContext> contexts =
new HashMap<String , ConfigurableApplicationContext>();
private List<String> tspMap;
public DynamicHttpAdapter(List<String> tspMap) {
this.tspMap = tspMap;
}
public String resolve(String name, String propType, String autostartProp,String successChannel) {
/* loop through tsps and see if we have a context already deifined */
for (String tsp : tspMap) {
String key = tsp + propType;
if (!contexts.containsKey(tsp)) {
log.debug("create context for: " + key);
createNewTspContext(name, propType, tsp, autostartProp, successChannel);
}
}
return "done";
}
private synchronized void createNewTspContext(String name, String propType, String tsp, String autostartProp,
String successChannel) {
ConfigurableApplicationContext httpContext = new ClassPathXmlApplicationContext(
new String[] { "/META-INF/spring/integration/dynamic-http-inbound-adapter-context.xml" },
false, context);
if (this.setEnvironmentForTsp(httpContext, name, propType, tsp, autostartProp, successChannel)) {
httpContext.refresh();
String key = tsp + propType;
this.contexts.put(tsp, httpContext);
}
}
/**
*/
private Boolean setEnvironmentForTsp(ConfigurableApplicationContext ctx, String name, String propType, String tsp, String autostartProp, String successChannel) {
StandardEnvironment env = new StandardEnvironment();
Properties httpProps = new Properties();
// populate properties for tsp
httpProps.setProperty("startup", fileService.getPropertyForTsp(tsp,autostartProp, propType));
httpProps.setProperty("tsp", tsp);
httpProps.setProperty("successChannel", successChannel);
httpProps.setProperty("url", "/" + tsp.toLowerCase() + "/" + name);
PropertiesPropertySource pps = new PropertiesPropertySource("httpProps", httpProps);
env.getPropertySources().addLast(pps);
ctx.setEnvironment(env);
return true;
}
public Map<String , ConfigurableApplicationContext> getContexts(){
return contexts;
}
ConfigurableApplicationContext создается, свойства устанавливается и контекст добавляется к ApplicationContext.
ИнтеграцияRequestMappingHandlerMapping инициируется с правильным обработчиком и отображением.
Однако, когда поступает запрос на IntegrationRequestMappingHandlerMapping не обнаружен в DispatcherServlet. Существует IntegrationRequestMappingHandlerMapping, который присутствует в DispatcherServlet, но у меня нет сопоставлений.
Я подозреваю, что это связано с тем, что динамический контекст является дочерним и не может быть замечен DispatcherServlet?
Есть ли способ сделать эту работу?