LINUX.ORG.RU

Как внутрь Томката (или Джетти, или чего угодно) подпихнуть существующий контекст Спринга?

 ,


0

3

Есть Spring. Не веб, просто спринг.

Внутри него хочется запустить веб-контейнер.

Но не просто так, а передать ему контекст вызывающего спринга. Чтобы заработали аннотации и все остальное. Чтобы внтутри Томката можно было использовать бины из кода, который этот Томкат запустил.

Как это сделать?

★★★★☆

Последнее исправление: stevejobs (всего исправлений: 1)
Ответ на: комментарий от BillDver

Нельзя. Используется Spring 3, версии весны 2014 года. В это время существовала только первая альфа Лабутенов, да и та со старта использовала Spring 4 (который тогда тоже был в бете).

именно поэтому я и пытаюсь разобраться, как запустить embedded container вручную и замерджить контексты.

stevejobs ★★★★☆
() автор топика

Проблема в том, что прилолжение исходно не веб, а наружу хочется выставить REST.

/0
В чем проблема то? Рест из коробки даже в 3 спринге работает. Конечно может быть нету таких хитроспецифических анотаций, но и на том что есть всё работает.

FeyFre ★★★★
()
Ответ на: комментарий от FeyFre

Ну так ведь, чтобы веб-приложение заработало, оно должно запуститься в контейнере. Например, в Томкате, или Вилдфлае.

Но у меня оно запускается через java -jar. И там в этом коде, запущенном через java -jar, уже существует 100500 бинов

Теперь, мы можем взять и сделать новый синглтон, и в этом синглтоне запустить Томкат. Но все, что запустится в этом Томкате - будет иметь новый класслоадер, новый контекст спринга, итп.

Хочется не просто запустить томкат, а прокинуть ему внутрь совершенно всю инфраструктуру, что уже запущена из «внешнего» спринга. В частности, чтобы можно было автовайрить бины, юзать внешние процессоры (н-р PlaceholderConfigurer), и итп

stevejobs ★★★★☆
() автор топика
Ответ на: комментарий от stevejobs

Ммм... Ты текущее приложение править можешь? Вот и правь, что бы работало через embedded jetty. Хотя оно и так через него работает. Либо переделывай его в war и деплой на томкат.

P.S.: Вполне возможно, оно и без всяких переделок задеплоится.

TheKnight ★★★
()
Последнее исправление: TheKnight (всего исправлений: 1)
Ответ на: комментарий от TheKnight

запускалку править не могу никак. У нас стандартизированная запускалка (чтобы работала со всякими докерами итп), ради одного проекта менять ее никто не разрешит. Т.е. запустить приложуху под embedded jetty - никак.

много бинов ставится в этой неизменяемой запускалке, поэтому выбросить ее тоже невозможно

но можно запустить embedded jetty (все-таки желательно Томкат) в любом методе. Отсюда и вопрос с прокидыванием контекста

stevejobs ★★★★☆
() автор топика
Последнее исправление: stevejobs (всего исправлений: 2)

В голову приходит только сделать ембеддед томкат с кастомным класслоадером. По сути тебе нужно подменить только класлоадер уровня сервлета.

Но да, ты в любом случае хочешь извращения.

ya-betmen ★★★★★
()
Последнее исправление: ya-betmen (всего исправлений: 1)
@Component
public class NettyServer {
    private static final Logger logger = Logger.getLogger(NettyServer.class);

    @Value("${http.port:8081}")
    private int port;

    private EventLoopGroup masterGroup;
    private EventLoopGroup workerGroup;


    @PostConstruct
    public void init() throws InterruptedException {
        masterGroup = new NioEventLoopGroup(1);
        workerGroup = new NioEventLoopGroup();

        ServerBootstrap serverBootstrap = new ServerBootstrap();
        serverBootstrap.group(masterGroup, workerGroup)
                .channel(NioServerSocketChannel.class)
                .childHandler(new NettyServerInit());
        serverBootstrap.option(ChannelOption.SO_BACKLOG, 2048);

        Channel channel = serverBootstrap.bind(port).sync().channel();

        logger.info(String.format("http port %d", port));
    }

    @PreDestroy
    public void destroy() {
        masterGroup.shutdownGracefully();
        workerGroup.shutdownGracefully();
    }
}
public class NettyServerInit extends ChannelInitializer<SocketChannel> {
    @Override
    protected void initChannel(SocketChannel ch) throws Exception {
        ChannelPipeline channelPipeline = ch.pipeline();
        channelPipeline.addLast(new HttpServerCodec());
        channelPipeline.addLast(new NettyServerHandler());
    }
}
@Component
public class NettyServerHandler extends ChannelInboundHandlerAdapter {
    private static final Logger logger = Logger.getLogger(NettyServerHandler.class);

    private final <например FreeMarker>

    @Value("${val:ololo}")
    private String val;

    @Autowired
    public NettyServerHandler(Сюда, можно запихнуть какой-нибудь FreeMarker) {this.freemaker = FreeMarker}

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        if (msg instanceof HttpRequest) {
            FullHttpResponse response = new DefaultFullHttpResponse(HTTP_1_1, OK, Unpooled.wrappedBuffer("pong".getBytes()));
            response.headers().set(CONTENT_TYPE, "text/plain");
            response.headers().setInt(CONTENT_LENGTH, response.content().readableBytes());

            ctx.write(response).addListener(ChannelFutureListener.CLOSE);
        }
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        logger.info(cause.getMessage());
        ctx.close();
    }

    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) {
        ctx.flush();
    }
}

Не уверен в полной корректности того что написал, но должно работать. Мне нужно просто plain/text отадавать.

xpahos ★★★★★
()
Ответ на: комментарий от xpahos

твое решение норм. в джетти тоже можно так.

но мне хотелось бы полноценный контейнер, а еще лучше - application server.

stevejobs ★★★★☆
() автор топика

Я нашел очень простое решение в три строчки. Как сделаю и протещу - выложу или на Хабре, или здесь.

stevejobs ★★★★☆
() автор топика
Ответ на: комментарий от stevejobs

Я нашел очень простое решение в три строчки.

Хм, запуск ембеддед томката с кастомным контекстом это минимум 5 строк, плюс зависимости (если мавен) ещё десять. Если ты действительно смог уложиться в 3 то будет инетересно.

ya-betmen ★★★★★
()
Последнее исправление: ya-betmen (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.