Spring Integration для TCP Socket Client с использованием динамического хоста и порта - PullRequest
1 голос
/ 14 марта 2019

У меня есть рабочий пример TCPSocketClient, использующий Spring Integration с жестко запрограммированным именем хоста и портом.

Как изменить этот пример, чтобы принимать localhost и порт 5877 для динамической передачи?

т.е. Можно ли вызвать метод обмена как ExchangeService.exchange(hostname, port, request) вместо ExchangeService.exchange(request)

Если да, то как эти параметры применяются к бину client?

@Configuration
public class AppConfig {

    @Bean
    public IntegrationFlow client() {
        return IntegrationFlows.from(ApiGateway.class).handle(
            Tcp.outboundGateway(
                Tcp.netClient("localhost", 5877)
                .serializer(codec())
                .deserializer(codec())
            ).remoteTimeout(10000)
        )
        .transform(Transformers.objectToString())
        .get();
    }

    @Bean
    public ByteArrayCrLfSerializer codec() {
        ByteArrayCrLfSerializer crLfSerializer = new ByteArrayCrLfSerializer();
        crLfSerializer.setMaxMessageSize(204800000);
        return crLfSerializer;
    }

    @Bean
    @DependsOn("client")
    public ExchangeService exchangeService(ApiGateway apiGateway) {
        return new ExchangeServiceImpl(apiGateway);
    }
}

public interface ApiGateway {
    String exchange(String out);
}

public interface ExchangeService {
    public String exchange(String request);
}

@Service
public class ExchangeServiceImpl implements ExchangeService {

    private ApiGateway apiGateway;
    @Autowired
    public ExchangeServiceImpl(ApiGateway apiGateway) {
        this.apiGateway=apiGateway;
    }

    @Override
    public String exchange(String request) {
        String response = null;
        try {
            response = apiGateway.exchange(request);
        } catch (Exception e) {
            throw e;
        }
        return response;
    }   
}

1 Ответ

1 голос
/ 14 марта 2019

Для динамической обработки вы можете использовать функцию динамических потоков из Spring Integration Java DSL: https://docs.spring.io/spring-integration/docs/current/reference/html/#java-dsl-runtime-flows

Итак, всякий раз, когда вы получаете запрос с этими параметрами, вы создаете IntegrationFlow на лету и регистрируете его с помощью IntegrationFlowContext. Честно говоря, у нас есть точный пример в документации для вашего варианта использования TCP:

IntegrationFlow flow = f -> f
        .handle(Tcp.outboundGateway(Tcp.netClient("localhost", this.server1.getPort())
                .serializer(TcpCodecs.crlf())
                .deserializer(TcpCodecs.lengthHeader1())
                .id("client1"))
            .remoteTimeout(m -> 5000))
        .transform(Transformers.objectToString());

IntegrationFlowRegistration theFlow = this.flowContext.registration(flow).register();
...