首页 > 其他分享 >使用Spring Integration接收TCP与UDP请求

使用Spring Integration接收TCP与UDP请求

时间:2023-10-21 11:13:45浏览次数:29  
标签:UDP Spring Integration springframework org import

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. 总结

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

标签:UDP,Spring,Integration,springframework,org,import
From: https://www.cnblogs.com/jonil/p/17778628.html

相关文章

  • SpringBoot中启用虚拟线程
    1.什么是虚拟线程虚拟线程是JDK21版本正式发布的一个新特性。虚拟线程和平台线程主要区别在于,虚拟线程在运行周期内不依赖操作系统线程:它们与硬件脱钩,因此被称为“虚拟”。这种解耦是由JVM提供的抽象层赋予的。虚拟线程的运行成本远低于平台线程。它们消耗的内存要少得多。这就......
  • 基于Vue.js和Spring Boot的口罩自助售卖系统:设计、实现与技术深度解析
    本文介绍了一种基于Vue.js和SpringBoot的口罩自助售卖系统的设计与实现。该系统通过前端Vue.js框架和后端SpringBoot框架的结合,实现了用户注册登录、口罩浏览购买、订单管理等功能。通过详细的代码示例和技术深度的解析,读者能够全面了解系统的设计思路和实现方法。1.引言随着全......
  • SpringBoot Vue3打造企业级一体化SaaS系统[最新版完结]
    点击下载:SpringBoot+Vue3打造企业级一体化SaaS系统     提取码:3ixbSpringBoot和Vue3是目前十分盛行的JavaWeb开发技术栈。SpringBoot能够快速构建Web应用程序,并提供许多有用的功用,如自动配置、快速开发、高效性能、易于部署等。Vue3是一种盛行的前端框架,它能够协助开发......
  • SpringCloudAlibaba Seata在Openfeign跨节点环境出现全局事务Xid失效原因底层探究
    原创/朱季谦曾经在SpringCloudAlibaba的Seata分布式事务搭建过程中,跨节点通过openfeign调用不同服务时,发现全局事务XID在当前节点也就是TM处,是正常能通过RootContext.getXID()获取到分布式全局事务XID的,但在下游节点就出现获取为NULL的情况,导致全局事务失效,出现异常时无法正常回......
  • springdatajpa编写入门接口
    SDJ的一个牛逼的地方就是,它可以只编写JPA规范的接口,然后可以不用写实现类,然后,只要写了这个dao层接口,就可以实现最基本的CRUD操作,然而,要怎么实现JPA规范呢 写这个所谓的JPA规范接口,就是继承JpaRepository和JpaSpecificationExecutor两个接口说说第一个JR,就是它要放一个泛型,然......
  • springdatajpa和Jpa规范和hibiernate的联系
    通过编写Java代码去调用springdatajpa规范,然后SDJ里面封装了JPA规范,jpa规范都是些抽象类和接口,因此它也不干活,把活儿都交还给可以实现JPA规范的hibiernate,hibernate则用于与mysql数据库产生连接,所以hibernate也封装了jdbc操作,可以用来操作数据库,实现orm思想......
  • SpringMVC自定义处理返回值demo和异步处理模式DeferredResult demo
    搭建自定义返回值处理器demo新建springboot项目修改pom.xml<!--新增依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><gro......
  • 基于Spring boot电商平台-计算机毕业设计源码+LW文档
    一.毕业设计的内容本设计是基于Springboot技术结合MySQL数据库,采用Myeclipse开发工具以及Java语言设计的网上商品购物系统。网上商品购物系统分为前台和后台,前台用于用户查看各种商品,检索想要的商品,还可以进行会员注册和商品选购等功能,而且在购物车提交订单后可以把订单数据传递到......
  • 基于spring boot的健身房管理系统-计算机毕业设计源码+LW文档
    1、题  目:基于springboot的健身房管理系统    2、题目来源:生产实践3、意  义:随着时代的发展,人们对健身和健康的也越来越重视,在很多城市中健身房也随处可见,更多的年轻人喜欢在下班和空闲时间去健身房进行健身和锻炼以提高自己的体质和改变自己的形体。通常健身有......
  • 基于Spring Boot的图书馆管理系统-计算机毕业设计源码+LW文档
    摘要随着时代的发展,图书的重要性显示的越来越突出了,尤其是知识大爆炸的这个年代,人们需要掌握的知识也越来越多,只有不断的提高自己才能够更好的立足于社会,但是通常情况下很多图书的价格比较高,这个时候就可以通过图书馆借阅图书来达到图书阅读的目的,为了让图书借阅变的更加的方便我......