Сервер Jpos Q2 с загрузкой Spring 2.3

У нас есть существующая система с Q2 Server и Spring MVC со следующей конфигурацией. Сервер Q2 был создан, когда был инициирован Httpservlet, и он отлично работал, а bean-компоненты Spring можно было автоматически подключить с помощью ISORequestlistner. Теперь это преобразуется в Spring boot 2.3. Как только я инициировал тот же Httpservlet с помощью ServletRegistrationBean при загрузке Spring, сервер Q2 инициируется и может отправлять ему запросы. Но автоперевод не работает. Раз проверю. Как только запрос обрабатывается внутри списка ISORequest, контекст Spring не виден, поскольку сервер Q2 использует другой загрузчик классов.

<server class="org.jpos.q2.iso.QServer" logger="Q2" name="DownloadServer-A">
<attr name="port" type="java.lang.Integer">6400</attr>
<attr name="minSessions" type="java.lang.Integer">10</attr>
<attr name="maxSessions" type="java.lang.Integer">1100</attr>
<channel name="DownloadServer-A-Channel" class="org.jpos.iso.channel.NACChannel" logger="Q2"
packager="org.jpos.iso.packager.GenericPackager" header="6000010000">
<property name="packager-config" value="/app/repository/q2serverconfig/resources/Download_generic.xml" />
</channel>
<request-listener class="DownloadServerAListener" logger="Q2">
<property name="space" value="transient:default" />
<property name="queue" value="TransactionQueue" />
<property name="timeout" value="35000" />
</request-listener>
</server>
1st Try Tried creating static ApplicationContext using ApplicationContextAware and tried it in the ISORequestListner. But It becomes null when TCP request received to Q2 server.

2-я попытка. Я попробовал несколько решений, как показано ниже в репозитории github. Но я не работал. https://github.com/vmantek/chimera

Кто-нибудь пытался запустить ISO-сервер в контексте приложения Spring как bean-компонент? Я имею в виду, что запускайте ISO-сервер в классе @Configuration с помощью Q2.start(). Q2.start запустится в отдельном загрузчике классов. Я не хочу, чтобы это случилось.


person Supun Athukorala    schedule 12.09.2020    source источник


Ответы (1)


Я искал эти несколько дней и пробовал несколько способов. Проблема в том, что Spring запускается в конкретном загрузчике классов. Но когда вы запускаете Q2 Server как

Q2 q2Server = new Q2(<deploydir>);
q2Server.start();

Сервер Q2 запускается в другом загрузчике классов. Поэтому SpringContext был недоступен для автоматической проводки. SpringBeanAutowiringSupport зависит от ContextLoader для получения текущего контекста приложения и всегда получает значение null.

Временное решение

Вы можете зарегистрировать bean-компонент, который реализует org.springframework.boot.context.embedded.ServletContextInitializer для получения контекста приложения во время запуска().

@Configuration
public class WebApplicationContextLocator implements ServletContextInitializer {
    private static WebApplicationContext webApplicationContext;

    public static WebApplicationContext getCurrentWebApplicationContext() {
        return webApplicationContext;
    }

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
      webApplicationContext = 
            WebApplicationContextUtils.getWebApplicationContext(servletContext);
    }
}

Затем вы можете реализовать самоавтоподключение в своем классе ISORequestListener.

 @Component
 public class ServiceImpl implements ISORequestListener {
    @Autowired
    private BackendService backendService;

    public ServiceImpl() {
           AutowiredAnnotationBeanPostProcessor bpp = new 
                       AutowiredAnnotationBeanPostProcessor();
           WebApplicationContext currentContext = 
                       WebApplicationContextLocator.getCurrentWebApplicationContext();
           bpp.setBeanFactory(currentContext.getAutowireCapableBeanFactory());
           bpp.processInjection(this);
    }

}

Тогда авто проводка работает отлично. Меня вдохновил следующий ответ. Spring Boot зарегистрирует веб-сервис JAX-WS как bean-компонент

person Supun Athukorala    schedule 16.09.2020