[英]How to set port and connectionFactory during run time for Spring TCP integration
Basically, I am not aware of port before hand. 基本上,我之前并不了解端口。 I will make a REST request to a host to send the port number.
我将向主机发出REST请求以发送端口号。 I am getting the port number, but not able to move ahead as I am not able to set connection factory into
inBoundClient
with received port number. 我正在获取端口号,但无法继续,因为我无法使用接收到的端口号将连接工厂设置为
inBoundClient
。 Please have a look at the code below, to understand the problem. 请看下面的代码,以了解问题所在。
I have tcp connections defined as below: 我有如下定义的TCP连接:
<?xml version="1.0" encoding="UTF-8"?>
<context:component-scan base-package="com.tcpclient" />
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:int="http://www.springframework.org/schema/integration"
xmlns:int-ip="http://www.springframework.org/schema/integration/ip"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd
http://www.springframework.org/schema/integration/ip http://www.springframework.org/schema/integration/ip/spring-integration-ip.xsd">
<context:annotation-config />
<!--Deserializer for incoming data on the socket -->
<bean
class="org.springframework.integration.ip.tcp.serializer.ByteArraySingleTerminatorSerializer"
id="serializeAndDeserializer">
<constructor-arg type="byte" value="0" />
</bean>
<!-- TCP Client configuration -->
<!-- Channels for communication -->
<int:channel id="tcp-client-input" />
<int:channel id="message" />
<int:channel id="message-serviceActivator" />
<int:gateway id="gateway" service-interface="com.tcpclient.ClientGateway"
default-request-channel="tcp-client-input" default-reply-channel="message" />
<int-ip:tcp-outbound-channel-adapter
id="outBoundClient" channel="tcp-client-input"
retry-interval="60000" auto-startup="false" />
<int-ip:tcp-inbound-channel-adapter
id="inBoundClient" channel="message"
client-mode="true" auto-startup="false" retry-interval="60000" />
<int:object-to-string-transformer
input-channel="message" output-channel="message-serviceActivator" />
<int:service-activator input-channel="message-serviceActivator"
method="onRtlsMessageArrival">
<bean class="com.tcpclient.HandleMessage" />
</int:service-activator>
</beans>
Config manager 配置管理器
In my class, I am trying below: 在我的课堂上,我尝试以下内容:
@component
public class ConfigManager {
@Autowired
@Qualifier("clientFactory")
TcpConnectionFactoryFactoryBean connFactory;
@Autowired
@Qualifier("inBoundClient")
SmartLifecycle inboundClient;
@Autowired
@Qualifier("outBoundClient")
SmartLifecycle outBoundClient;
public void initialize(Boolean canStart) {
try {
if (canStart) {
String portResponse = restTemplate.postForObject(SYSTEM_OPEN_SOCK_URI, openSockeEntity,
String.class);
int portNumber = parsePortFromJson(portResponse);
connFactory.setPort(portNumber);
TcpReceivingChannelAdapter receiver = (TcpReceivingChannelAdapter) inboundClient;
receiver.setConnectionFactory(connFactory);
receiver.start();
EventDrivenConsumer sender = (EventDrivenConsumer) outBoundClient;
sender.start();
}
} catch (Exception e) {
logger.error("Error occured while fetching data.");
}
}
}
But, at the line receiver.setConnectionFactory(connFactory);
但是,在
receiver.setConnectionFactory(connFactory);
行receiver.setConnectionFactory(connFactory);
, I have compiler error, The method setConnectionFactory(AbstractConnectionFactory) in the type TcpReceivingChannelAdapter is not applicable for the arguments (TcpConnectionFactoryFactoryBean)
. ,我有编译器错误,
The method setConnectionFactory(AbstractConnectionFactory) in the type TcpReceivingChannelAdapter is not applicable for the arguments (TcpConnectionFactoryFactoryBean)
。 Is there anyway I could set port dynamically. 无论如何,我可以动态设置端口。
EDIT: As per Gary's suggestion, 编辑:根据加里的建议,
@Autowired
@Qualifier("outboundClient.handler")
TcpSendingMessageHandler outBoundClient;`,
outBoundClient.setConnectionFactory(connFactory);
outBoundClient.setRetryInterval(60000);
outBoundClient.afterPropertiesSet();
outBoundClient.start();
But, I have this below error: 但是,我有以下错误:
Dispatcher has no subscribers for channel 'application.tcp-client-input'.; nested exception is org.springframework.integration.MessageDispatchingException: Dispatcher has no subscribers
when I try gateway.send("ACK");
当我尝试
gateway.send("ACK");
one of my beans. 我的一颗豆。 but I have my
outBoundClient
having channel="tcp-client-input"
但我的
outBoundClient
具有channel="tcp-client-input"
Since the port is set in a constructor, you can't change it after the bean is created. 由于端口是在构造函数中设置的,因此在创建bean后就无法更改它。
You also can't change the port on a connection factory bean after is has already created its connection factory. 创建连接工厂后,您也无法更改连接工厂Bean上的端口。
You need to create the connection factory yourself ( new TcpNetClientConnectionFactory(...)
) rather than have Spring create it - be sure to call afterPropertiesSet()
after creating and configuring it and before you add it to the adapter. 您需要自己创建连接工厂(
new TcpNetClientConnectionFactory(...)
),而不是让Spring创建它-请确保在创建和配置连接工厂并将其添加到适配器之前,调用afterPropertiesSet()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.