仅发送TCP客户端的问题

时间:2020-05-18 07:12:56

标签: java spring spring-boot tcp tcplistener

我目前正在尝试做一个仅发送数据而无需任何响应的TCP,这意味着服务器端仅侦听TCP消息。

这是客户端的Java Config:

@Configuration
@EnableIntegration
@IntegrationComponentScan
public class TcpClientConfig implements ApplicationEventPublisherAware {

@Value("${tcp.server.host}")
private String host;

@Value("${tcp.server.port}")
private int port;

@Value("${tcp.client.connection.poolSize}")
private int connectionPoolSize;

private ApplicationEventPublisher applicationEventPublisher;

@Override
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
    this.applicationEventPublisher = applicationEventPublisher;
}

@Bean
public AbstractClientConnectionFactory clientConnectionFactory() {
    TcpNetClientConnectionFactory tcpNetClientConnectionFactory = new TcpNetClientConnectionFactory(host, port);        tcpNetClientConnectionFactory.setApplicationEventPublisher(applicationEventPublisher);
    return new CachingClientConnectionFactory(tcpNetClientConnectionFactory, connectionPoolSize);
}

@Bean
public MessageChannel outboundChannel() {
    return new DirectChannel();
}

@Bean
@ServiceActivator(inputChannel = "outboundChannel")
public MessageHandler outboundGateway(AbstractClientConnectionFactory clientConnectionFactory) {
    TcpOutboundGateway tcpOutboundGateway = new TcpOutboundGateway();
    tcpOutboundGateway.setConnectionFactory(clientConnectionFactory);
    return tcpOutboundGateway;
}

这是TcpClientGateway

@MessagingGateway(defaultRequestChannel = "outboundChannel")
public interface TcpClientGateway {

    void send(byte[] message);

}

这是一个调度程序

@Component
@EnableScheduler
public class MessageJobScheduler {

    private MessageService messageService;

    @Autowired
    public MessageJobScheduler(MessageService messageService) {
        this.messageService = messageService;
    }

    @Scheduled(fixedDelay = 1000L)
    public void sendMessageJob() {
        messageService.sendMessage();
    }

}

这是它发送消息并接收来自服务器的响应的部分。

@Service
public class MessageServiceImpl implements MessageService {

    private static final Logger LOGGER = 
    LoggerFactory.getLogger(MessageServiceImpl.class);

    private TcpClientGateway tcpClientGateway;

    @Autowired
    public MessageServiceImpl(TcpClientGateway tcpClientGateway) {
        this.tcpClientGateway = tcpClientGateway;
    }

    @Override
    public void sendMessage() {
        String message = LocalDateTime.now().toString();
        LOGGER.info("Send message: {}", message);
        tcpClientGateway.send(message.getBytes());
    }

}

这是服务器端的Java Config:

@Configuration
@EnableIntegration
@IntegrationComponentScan
public class TcpServerConfig {

    @Value("${tcp.server.port}")
    private int port;

    @Bean
    public AbstractServerConnectionFactory serverConnectionFactory() {
        TcpNetServerConnectionFactory serverConnectionFactory = new TcpNetServerConnectionFactory(port);
        return serverConnectionFactory;
    }

    @Bean
    public MessageChannel inboundChannel() {
        return new DirectChannel();
    }

    @Bean
    public TcpInboundGateway inboundGateway(AbstractServerConnectionFactory serverConnectionFactory, MessageChannel inboundChannel) {
        TcpInboundGateway tcpInboundGateway = new TcpInboundGateway();
        tcpInboundGateway.setConnectionFactory(serverConnectionFactory);
        tcpInboundGateway.setRequestChannel(inboundChannel);
        return tcpInboundGateway;
    }

}

这是服务器端的消息终结点

@MessageEndpoint
public class TcpServerEndpoint {

    private MessageService messageService;

    @Autowired
    public TcpServerEndpoint(MessageService messageService) {
        this.messageService = messageService;
    }

    @ServiceActivator(inputChannel = "inboundChannel")
    public void process(byte[] message) {
        messageService.processMessage(message);
    }

}

在服务器端,我只想接收从客户端发送的TCP消息,并打印出该消息,而无需任何回信给客户端(仅像侦听器一样)。

@Service
public class MessageServiceImpl implements MessageService {

    private static final Logger LOGGER = LoggerFactory.getLogger(MessageServiceImpl.class);

    @Override
    public void processMessage(byte[] message) {
        String messageContent = new String(message);
        LOGGER.info("Receive message: {}", messageContent); 
    }

}

但是,我在客户端收到此错误,并出现消息超时异常。每当我发送一条消息时,TcpOutboundGateway似乎都希望得到答复。这是我从控制台日志中得到的错误

org.springframework.integration.MessageTimeoutException: Timed out waiting for response
    at org.springframework.integration.ip.tcp.TcpOutboundGateway.getReply(TcpOutboundGateway.java:216)
    at org.springframework.integration.ip.tcp.TcpOutboundGateway.handleRequestMessage(TcpOutboundGateway.java:161)
    at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:127)
    at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:170)
    at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:133)
    at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:106)
    at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:73)
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:453)
    at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:403)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:187)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:233)
    at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:47)
    at org.springframework.messaging.core.AbstractMessageSendingTemplate.send(AbstractMessageSendingTemplate.java:46)

任何人都知道如何将配置设置为仅在客户端发送而服务器没有任何响应吗?

0 个答案:

没有答案
相关问题