Spring Integration接收TCP与UDP请求

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

1. 简介

Spring Integration 是一个开源的项目它是 Spring 生态系统的一部分旨在简化企业集成Enterprise Integration的开发。它提供了一种构建消息驱动的、松散耦合的、可扩展的企业应用集成解决方案的方式。Spring Integration 基于 Spring Framework 构建使开发者能够更容易地将不同的系统、应用程序和服务整合到一个协调的整体中。

Spring Integration 主要有以下作用

  1. 消息驱动的集成Spring Integration 基于消息传递的模式允许系统和应用程序通过消息进行通信。这种模式可以用于异步集成以确保系统能够松散耦合以及在高负载和大规模情况下具有良好的性能。
  2. 模块化和可扩展Spring Integration 提供了一组模块每个模块都用于处理特定类型的集成需求。这些模块可以按需组合和扩展使开发者能够根据应用程序的需要选择合适的模块并自定义它们。
  3. 集成各种传输协议和数据格式Spring Integration 支持各种传输协议例如HTTP、JMS、FTP、SMTP等和数据格式例如JSON、XML、CSV等以便实现不同系统之间的数据传输和转换。
  4. 企业模式的集成Spring Integration 提供了一些企业集成模式的实现例如消息路由、消息转换、消息过滤、消息聚合等以帮助解决不同场景下的集成挑战。
  5. 与 Spring 生态系统的集成Spring Integration 与 Spring Framework 和 Spring Boot 紧密集成开发者可以轻松整合已有的 Spring 应用程序同时利用 Spring 的依赖注入和 AOP面向切面编程等功能。

2. 代码实战

本文主要介绍 Spring Integration 接收TCP与UDP请求的示例。在项目中我们偶尔需要接收其他服务的TCP与UDP请求此时使用Netty可能会过度设计想要一个轻量级nio的TCP、UDP服务端的话我们可以选择 Spring Integration。

环境

  1. JDK21
  2. SpringBoot 3.1.4
  3. Spring Integration 6.1.3

2.1 导入依赖

 
<!-- 父工程主要用作版本管控 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.4</version>
<relativePath />
</parent>
<!-- springboot-web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- spring-integration -->
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-ip</artifactId>
</dependency>

注意如果你的SpringBoot版本是2.x版本那么你需要使用JDK21以下的版本因为JDK中的包名有所更改。

2.2 建立TCP服务端

新建配置类TcpServerConfig其中tcp.server.port需要到application.yml或者application.properties中进行配置。或者你也可以直接填写端口。

 
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.integration.ip.tcp.TcpReceivingChannelAdapter;
import org.springframework.integration.ip.tcp.connection.AbstractServerConnectionFactory;
import org.springframework.integration.ip.tcp.connection.TcpNioServerConnectionFactory;
@Slf4j
@Configuration
public class TcpServerConfig {
@Value("${tcp.server.port}")
private int PORT;
/**
* 创建连接工厂
* @return
*/
@Bean
public AbstractServerConnectionFactory serverConnectionFactory() {
TcpNioServerConnectionFactory tcpNioServerConnectionFactory = new TcpNioServerConnectionFactory(PORT);
tcpNioServerConnectionFactory.setUsingDirectBuffers(true);
return tcpNioServerConnectionFactory;
}
/**
* 创建消息通道
* @return
*/
@Bean
public DirectChannel tcpReceiveChannel() {
return new DirectChannel();
}
/**
* 创建tcp接收通道适配器
* @return
*/
@Bean
public TcpReceivingChannelAdapter inboundAdapter() {
TcpReceivingChannelAdapter adapter = new TcpReceivingChannelAdapter();
adapter.setConnectionFactory(serverConnectionFactory());
adapter.setOutputChannelName("tcpReceiveChannel");
return adapter;
}
/**
* 处理请求器
* @param message
*/
@ServiceActivator(inputChannel = "tcpReceiveChannel")
public void messageReceiver(byte[] message) {
// 处理接收到的TCP消息
log.info("处理TCP请求");
}
}

注意在发送tcp报文的时候tcp报文需要以\r\n结尾否则无法正常接收报文。

2.3 建立UDP服务端

新建配置类UdpServerConfig其中udp.server.port需要到application.yml或者application.properties中进行配置。或者你也可以直接填写端口。

 
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.integration.dsl.IntegrationFlow;
import org.springframework.integration.ip.dsl.Udp;
import org.springframework.messaging.Message;
@Slf4j
@Configuration
public class UdpServerConfig {
@Value("${udp.server.port}")
private int PORT;
/**
* 创建UDP服务器接收通道适配器
* @return
*/
@Bean
public IntegrationFlow udpIn() {
return IntegrationFlow.from(Udp.inboundAdapter(PORT))
.channel("udpReceiveChannel")
.get();
}
/**
* 创建消息接收通道
* @return
*/
@Bean
public DirectChannel udpReceiveChannel() {
return new DirectChannel();
}
/**
* 处理接收到的UDP消息
* @param message
*/
@ServiceActivator(inputChannel = "udpReceiveChannel")
public void udpHandleMessage(Message<byte[]> message) {
// 处理接收到的UDP消息
byte[] payload = message.getPayload();
log.info("处理UDP请求");
}
}

3. 总结

对比NettySpring Integration比较轻量级也更容易集成到 SpringBoot 中但是性能肯定不如Netty。这里也只是给接收TCP、UDP请求设计方面多一个选择。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
返回列表

上一篇:CentOS 7入门指南

下一篇:loki named

“Spring Integration接收TCP与UDP请求” 的相关文章

关于新冠的几点总结

关于新冠的几点总结 一、前言:二、病程阶段1. 第一阶段 反复发热2. 第二极端 退烧虚弱3. 第三阶段 咳嗽嗜睡 三、处置措施:1. 思想准备2. 药/物准备3. 退烧方式4. 保持体温5. 通则不痛,痛则不通6. 营养补充7. 恢复关键期 四、写在最后...

Python基础入门之二进制的负数

刚刚介绍了位运算符里面涉及到了二进制的运算出现了a = 60~a = 1100 0011 = -61的计算所以这里记录一下二进制的负数表示和计算。 二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。 它的基数为2进位规则是“逢二进一”借位规则是...

ubuntu10.10,qt4.7,boost1.45

首先总结一下:安装从网上找了两篇文章: Qt:http://glendong.blogbus.com/logs/86484035.html boost:http://blog.csdn.net/singno116/archive/2010/11/28/604...

shell sed修改源文件

sed -i 's /currValue/changeValue/' xxx.xml $ sed 's/pattern/replace_string/g' file 后缀/g意味着sed会替换每一处匹配 sed '/^$/d' file 移除空白行...

在PHP中怎么修改数据库内容表单 - 编程语言

这篇文章主要介绍“在PHP中怎么修改数据库内容表单”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“在PHP中怎么修改数据库内容表单”文章能帮助大家解决问题。 首先,让我们了解如何与数据库进行连接。在P...

java前后端加密解密crypto-js

项目场景 适用于接口数据敏感信息比如 明文传输姓名、居住地址、手机号等信息如果存在明文传输敏感数据问题、及数据泄漏风险则可使用此方法加密解密。 一、下载crypot-js 1.如果为vue项目安装cnpm,采用命令安装即可 安装命令cnpm install crypto-js 2.如果为...