Это связано с тем, что Spring не управляет этими объектами - вам нужно либо удовлетворить все интерфейсы ...Aware
и вызвать afterPropertiesSet()
, либо вам нужно обратиться к нему за Spring.Есть два способа сделать последнее.
Использование фабрики бинов вручную
@Autowired
private ConfigurableListableBeanFactory beanFactory;
public AbstractClientConnectionFactory clientConnectionFactory(String hostName, int port) {
TcpNetClientConnectionFactory server = new TcpNetClientConnectionFactory(hostName, port);
server.setSingleUse(false);
server.setSoTimeout(300000);
server = (TcpNetClientConnectionFactory) this.beanFactory.initializeBean(server, "cf");
this.beanFactory.registerSingleton("cf", server);
return server;
}
public TcpInboundGateway tcpInbound(AbstractClientConnectionFactory connectionFactory) {
TcpInboundGateway gate = new TcpInboundGateway();
gate.setConnectionFactory(connectionFactory);
gate.setClientMode(true);
gate.setRetryInterval(60000);
gate.setRequestChannelName("toTcp");
gate = (TcpInboundGateway) this.beanFactory.initializeBean(gate, "gate");
this.beanFactory.registerSingleton("gate", gate);
return gate;
}
Использование функции регистрации динамического потока Java DSL
@Autowired
private IntegrationFlowContext flowContext;
public void tcpInbound(String host, int port, String flowId) {
IntegrationFlow flow = IntegrationFlows.from(
Tcp.inboundGateway(Tcp.netClient(host, port))
.clientMode(true))
.channel("toTcp")
.get();
this.flowContext.registration(flow).id(flowId).register();
}
(Вы также можете настроить другие свойства с помощью DSL).
gate.setRequestChannel(toTcp);
gate.setReplyChannelName("toTcp");
Нельзя использовать один и тот же канал для запросов и ответов;Вам обычно не нужен канал ответа, фреймворк это выяснит.Канал ответа нужен только в том случае, если вы хотите сделать что-то вроде добавления проводного сигнала для регистрации ответа.