Как создать асинхронный сервер с одноэлементным сокетом с помощью Spring-интеграции? - PullRequest
0 голосов
/ 13 июня 2018

Я хочу добиться следующего, используя spring-integration: наличие одноэлементного открытого сокета, который постоянно получает и записывает данные, asyncrhon!

Это означает, что мне нужно открыть сокет, который постоянно читает из одного сокета,отправляет каждое сообщение для асинхронной обработки и возвращает ответы через сокет, также асинхронные.

Как мне добиться этого асинхронного шаблона?

Особенно: как я могу использовать Serializer/Deserializer?Насколько я понял, сериализатор вызывается только при новом сокетном соединении, поэтому в моем случае только один раз при запуске первого сообщения?

@Configuration
public class SocketConfig {
    @Bean
    public TcpConnectionFactoryFactoryBean tcpFactory(MyConverter converter) {
        TcpConnectionFactoryFactoryBean fact = new TcpConnectionFactoryFactoryBean();
        fact.setType("server");
        fact.setPort(PORT);
        fact.setUsingNio(true); //should I use true or false?
        fact.setSingleUse(false); //keep socket constantly open
        fact.setSerializer(converter);
        fact.setDeserializer(converter);
        return fact;
    }

    @Bean
    public TcpInboundGateway serverGateway(
            @Qualifier("tcpFactory") TcpConnectionFactoryFactoryBean factory,
            @Qualifier("serverChannel") MessageChannel serverChannel) throws Exception {
        TcpInboundGateway g = new TcpInboundGateway();
        g.setConnectionFactory(factory.getObject());
        g.setRequestChannel(serverChannel);
        return g;
    }

}

@MessageEndpoint
public class SocketEndpoint {

    @ServiceActivator(inputChannel = "serverChannel")
    public Object run(Object obj) {

    }
}


@Service
public class MyConverter implements Serializer<Object>, Deserializer<Object> {
    //read from socket
    @Override
    public Object deserialize(InputStream inputStream) {
    }

    //send back to socket
    @Override
    public void serialize(Object message, OutputStream outputStream) {
    }
}

1 Ответ

0 голосов
/ 13 июня 2018

Шлюз используется для отдельных пар запрос / ответ.

Если вам нужно отправить несколько ответов для одного запроса, вы должны использовать адаптеры сотрудничающих каналов, как описано в документации .

Совместные адаптеры также могут использоваться (на стороне сервера или на стороне клиента) для полностью асинхронной связи (а не с семантикой запрос / ответ).

На стороне сервера необходимо позаботиться о заполнении заголовка ip_connectionId, поскольку он используется для сопоставления сообщения с соединением.Для сообщений, отправляемых с входящего адаптера, автоматически устанавливается заголовок.Если вы хотите создать другие сообщения для отправки, вам нужно будет установить заголовок.Значение заголовка может быть получено из входящего сообщения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...