Использование инфраструктуры JAVA NIO на SPRING-сервере - PullRequest
3 голосов
/ 21 сентября 2010

Я реализую гибридное серверное приложение, которое смешивает веб-сервлет и простое Java-приложение.

Java-приложение управляет тысячами сокетов для удаленных устройств, а веб-приложение взаимодействует с пользователем для установки / чтения состояния любого сокета. Java NIO или Apache-MINA против Jboss-Netty , кажется, хорошие варианты для приложения сокетов.

Первый вопрос: можно ли запустить оба приложения (сервлет с веб-интерфейсом + приложение JAVA NIO) на одном сервере? Сейчас я использую Tomcat для сервлета и простой демон procrun для сокета приложения

Я не знаю, подходит ли Spring для этой комбинации, поскольку я не видел никакой информации об использовании NIO в Spring.

Второй вопрос: как оба приложения могут обмениваться данными между собой? Пока я использую RMI, но мне интересно, есть ли лучшее решение.

1 Ответ

10 голосов
/ 25 апреля 2011

Вы точно можете запустить сервер сокетов NIO и веб-сервер в одном и том же jvm с помощью Spring.Я сделал это с помощью Grails (который в любом случае является оберткой над весной).Я запускаю tcp-сервер в классе начальной загрузки Grails.

Для обычного весеннего веб-приложения вы можете запустить сервер сокетов, прослушивающий определенный порт, скажем, 8090, и веб-сервер, скажем,8080 с использованием прослушивателей жизненного цикла Spring Framework или постпроцессоров.

Сделайте ваш сервер сокетов пружинным компонентом и используйте метод init, как показано ниже, чтобы фактически запустить сервер сокетов.Эта среда Spring автоматически вызовет его при создании экземпляра.

Пример конфигурации для сервера netty может быть следующим:

<bean id="tcpServer" class="netty.NettyTCPServer"
        init-method="createServerBootstrap" destroy-method="stopServer">
        <property name="pipelineFactory" ref="pipelineFactory"></property>
</bean>

<bean id="pipelineFactory" class="netty.HandshakePipelineFactory">
        <lookup-method name="createHandshakeHandler" bean="handshakeHandler" />
        <property name="stringDecoder" ref="stringDecoder"></property>
        <property name="stringEncoder" ref="stringEncoder"></property>
        <property name="nulEncoder" ref="nulEncoder"></property>
        <property name="frameSize" value="256"></property>
</bean>
...