2015-10-19 3 views
0

Я пытаюсь создать динамические адаптеры входящего канала 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?

Есть ли способ сделать эту работу?

ответ

0

Даже если вы можете добавить сопоставления, DispatcherServlet не имеет видимости для bean-компонентов в дочерних контекстах, поэтому он не может вызвать обработчик (-ы).

Возможно, проще иметь единственную входящую конечную точку и добавить маршрутизатор для маршрутизации на разные каналы на основе переменных (-ов) пути.

Смежные вопросы