MIME类型和Java类型

类型转换Spring Cloud Stream提供的开箱即用如下表所示:“源有效载荷”是指转换前的有效载荷,“目标有效载荷”是指转换后的“有效载荷”。类型转换可以在“生产者”一侧(输出)或“消费者”一侧(输入)上进行。

来源有效载荷 目标有效载荷 content-type标题(来源讯息) content-type标题(转换后) 注释

POJO

JSON String

ignored

application/json

 

Tuple

JSON String

ignored

application/json

JSON是为Tuple量身定制的

POJO

String (toString())

ignored

text/plain, java.lang.String

 

POJO

byte[] (java.io serialized)

ignored

application/x-java-serialized-object

 

JSON byte[] or String

POJO

application/json (or none)

application/x-java-object

 

byte[] or String

Serializable

application/x-java-serialized-object

application/x-java-object

 

JSON byte[] or String

Tuple

application/json (or none)

application/x-spring-tuple

 

byte[]

String

any

text/plain, java.lang.String

将应用在content-type头中指定的任何Charset

String

byte[]

any

application/octet-stream

将应用在content-type头中指定的任何Charset

注意

转换适用于需要类型转换的有效内容。例如,如果应用程序生成带有outputType = application / json的XML字符串,则该有效载荷将不会从XML转换为JSON。这是因为发送到出站通道的有效载荷已经是一个String,所以在运行时不会应用转换。同样重要的是要注意,当使用默认的序列化机制时,必须在发送和接收应用程序之间共享有效负载类,并且与二进制内容兼容。当应用程序代码在两个应用程序中独立更改时,这可能会产生问题,因为二进制格式和代码可能会变得不兼容。

提示

虽然入站和出站渠道都支持转换,但特别推荐将其用于转发出站邮件。对于入站邮件的转换,特别是当目标是POJO时,@StreamListener支持将自动执行转换。

自定义邮件转换

除了支持开箱即用的转换,Spring Cloud Stream还支持注册您自己的邮件转换实现。这允许您以各种自定义格式(包括二进制)发送和接收数据,并将其与特定的contentTypes关联。Spring Cloud Stream将所有类型为org.springframework.messaging.converter.MessageConverter的bean注册为自定义消息转换器以及开箱即用消息转换器。

如果您的消息转换器需要使用特定的content-type和目标类(用于输入和输出),则消息转换器需要扩展org.springframework.messaging.converter.AbstractMessageConverter。对于使用@StreamListener的转换,实现org.springframework.messaging.converter.MessageConverter的消息转换器就足够了。

以下是在Spring Cloud Stream应用程序中创建消息转换器bean(内容类型为application/bar)的示例:

@EnableBinding(Sink.class)
@SpringBootApplication
public static class SinkApplication { ... @Bean
public MessageConverter customMessageConverter() {
return new MyCustomMessageConverter();
}
public class MyCustomMessageConverter extends AbstractMessageConverter {

	public MyCustomMessageConverter() {
super(new MimeType("application", "bar"));
} @Override
protected boolean supports(Class<?> clazz) {
return (Bar.class == clazz);
} @Override
protected Object convertFromInternal(Message<?> message, Class<?> targetClass, Object conversionHint) {
Object payload = message.getPayload();
return (payload instanceof Bar ? payload : new Bar((byte[]) payload));
}
}

Spring Cloud Stream还为基于Avro的转换器和模式演进提供支持。详情请参阅具体章节

@StreamListener和讯息转换

@StreamListener注释提供了一种方便的方式来转换传入的消息,而不需要指定输入通道的内容类型。在使用@StreamListener注释的方法的调度过程中,如果参数需要转换,将自动应用转换。

例如,让我们考虑一个带有{"greeting":"Hello, world"}的String内容的消息,并且在输入通道上收到application/jsonapplication/json标题。让我们考虑接收它的以下应用程序:

public class GreetingMessage {

  String greeting;

  public String getGreeting() {
return greeting;
} public void setGreeting(String greeting) {
this.greeting = greeting;
}
} @EnableBinding(Sink.class)
@EnableAutoConfiguration
public static class GreetingSink { @StreamListener(Sink.INPUT)
public void receive(Greeting greeting) {
// handle Greeting
}
}

该方法的参数将自动填充包含JSON字符串的未编组形式的POJO。

Schema进化支持

Spring Cloud Stream通过其spring-cloud-stream-schema模块为基于模式的消息转换器提供支持。目前,基于模式的消息转换器开箱即用的唯一序列化格式是Apache Avro,在将来的版本中可以添加更多的格式。

Apache Avro讯息转换器

spring-cloud-stream-schema模块包含可用于Apache Avro序列化的两种类型的消息转换器:

  • 使用序列化/反序列化对象的类信息的转换器,或者启动时已知位置的模式;

  • 转换器使用模式注册表 - 他们在运行时定位模式,以及随着域对象的发展动态注册新模式。

具有模式支持的转换器

AvroSchemaMessageConverter支持使用预定义模式或使用类中可用的模式信息(反射或包含在SpecificRecord)中的序列化和反序列化消息。如果转换的目标类型是GenericRecord,则必须设置模式。

对于使用它,您可以简单地将其添加到应用程序上下文中,可选地指定一个或多个MimeTypes将其关联。默认MimeTypeapplication/avro

以下是在注册Apache Avro MessageConverter的宿应用程序中进行配置的示例,而不需要预定义的模式:

@EnableBinding(Sink.class)
@SpringBootApplication
public static class SinkApplication { ... @Bean
public MessageConverter userMessageConverter() {
return new AvroSchemaMessageConverter(MimeType.valueOf("avro/bytes"));
}
}

相反,这里是一个应用程序,注册一个具有预定义模式的转换器,可以在类路径中找到:

@EnableBinding(Sink.class)
@SpringBootApplication
public static class SinkApplication { ... @Bean
public MessageConverter userMessageConverter() {
AvroSchemaMessageConverter converter = new AvroSchemaMessageConverter(MimeType.valueOf("avro/bytes"));
converter.setSchemaLocation(new ClassPathResource("schemas/User.avro"));
return converter;
}
}

为了了解模式注册表客户端转换器,我们将首先描述模式注册表支持。

Schema注册表支持

大多数序列化模型,特别是旨在跨不同平台和语言进行可移植性的序列化模型,依赖于描述数据如何在二进制有效载荷中被序列化的模式。为了序列化数据然后解释它,发送方和接收方都必须访问描述二进制格式的模式。在某些情况下,可以从序列化的有效载荷类型或从反序列化时的目标类型中推断出模式,但是在许多情况下,应用程序可以从访问描述二进制数据格式的显式模式中受益。模式注册表允许您以文本格式(通常为JSON)存储模式信息,并使该信息可访问需要它的各种应用程序以二进制格式接收和发送数据。一个模式可以作为一个元组引用,它由

  • 作为模式的逻辑名称的主题 ;

  • 模式版本 ;

  • 描述数据 的二进制格式的模式格式

Schema注册服务器

Spring Cloud Stream提供了模式注册表服务器实现。为了使用它,您可以简单地将spring-cloud-stream-schema-server工件添加到项目中,并使用@EnableSchemaRegistryServer注释,将模式注册表服务器REST控制器添加到应用程序中。此注释旨在与Spring Boot Web应用程序一起使用,服务器的监听端口由server.port设置控制。spring.cloud.stream.schema.server.path设置可用于控制模式服务器的根路径(特别是嵌入其他应用程序时)。spring.cloud.stream.schema.server.allowSchemaDeletion布尔设置可以删除模式。默认情况下,这是禁用的。

模式注册表服务器使用关系数据库来存储模式。默认情况下,它使用一个嵌入式数据库。您可以使用Spring Boot SQL数据库和JDBC配置选项自定义模式存储。

启用模式注册表的Spring Boot应用程序如下所示:

@SpringBootApplication
@EnableSchemaRegistryServer
public class SchemaRegistryServerApplication {
public static void main(String[] args) {
SpringApplication.run(SchemaRegistryServerApplication.class, args);
}
}

Schema注册服务器API

Schema注册服务器API由以下操作组成:

POST /

注册一个新的架构

接受具有以下字段的JSON有效载荷:

  • subject模式主题;

  • format模式格式;

  • definition模式定义。

响应是JSON格式的模式对象,包含以下字段:

  • id模式标识;

  • subject模式主题;

  • format模式格式;

  • version模式版本;

  • definition模式定义。

GET /{subject}/{format}/{version}

根据其主题,格式和版本检索现有模式。

响应是JSON格式的模式对象,包含以下字段:

  • id模式标识;

  • subject模式主题;

  • format模式格式;

  • version模式版本;

  • definition模式定义。

GET /{subject}/{format}

根据其主题和格式检索现有模式的列表。

响应是JSON格式的每个模式对象的模式列表,包含以下字段:

  • id模式标识;

  • subject模式主题;

  • format模式格式;

  • version模式版本;

  • definition模式定义。

GET /schemas/{id}

通过其id来检索现有的模式。

响应是JSON格式的模式对象,包含以下字段:

  • id模式标识;

  • subject模式主题;

  • format模式格式;

  • version模式版本;

  • definition模式定义。

DELETE /{subject}/{format}/{version}

按其主题,格式和版本删除现有模式。

DELETE /schemas/{id}

按其ID删除现有模式。

DELETE /{subject}

按其主题删除现有模式。

注意

本说明仅适用于Spring Cloud Stream 1.1.0.RELEASE的用户。Spring Cloud Stream 1.1.0.RELEASE使用表名schema存储Schema对象,这是一些数据库实现中的关键字。为了避免将来发生任何冲突,从1.1.1.RELEASE开始,我们选择了存储表的名称SCHEMA_REPOSITORY。建议任何正在升级的Spring Cloud Stream 1.1.0.RELEASE用户在升级之前将其现有模式迁移到新表。

MIME类型和Java类型的更多相关文章

  1. [mysql]MySql数据类型和java类型对照表

    MySQL Type Name Return value ofGetColumnClassName Returned as Java Class BIT(1) (new in MySQL-5.0) B ...

  2. JdbcType类型和Java类型的对应关系

    在Oracle中有些字段不是必填时在用户使用的时候会出现数据null的情况.这个时候在Oracle中是无法进行插入的. JDBC Type Java Type CHAR String VARCHAR ...

  3. java中XMLGregorianCalendar类型和Date类型之间的相互转换

    import java.text.SimpleDateFormat;import java.util.Date;import java.util.GregorianCalendar;import ja ...

  4. Qt迭代器(Java类型和STL类型)详解

    迭代器为访问容器类里的数据项提供了统一的方法,Qt 有两种迭代器类:Java 类型的迭代器和 STL 类型的迭代器. 两者比较,Java 类型的迭代器更易于使用,且提供一些高级功能,而 STL 类型的 ...

  5. Date类型和Long类型的相互转换

    Date类型和Long类型的相互转换: import java.text.SimpleDateFormat; import java.util.Date; public class T { publi ...

  6. 着重基础之—MySql Blob类型和Text类型

    着重基础之—MySql Blob类型和Text类型 在经历了几个Java项目后,遇到了一些问题,在解决问题中体会到基础需要不断的回顾与巩固. 最近做的项目中,提供给接口调用方数据同步接口,传输的数据格 ...

  7. DATETIME类型和BIGINT 类型互相转换

    项目中使用BIGINT来存放时间,以下代码用来转换时间类型和BIGINT类型 SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ========= ...

  8. Timestame类型和String 类型的转化

    Timestame类型和String 类型的转化 String转化为Timestamp: SimpleDateFormat df = new SimpleDateFormat("yyyy-M ...

  9. Python3.x中bytes类型和str类型深入分析

    Python 3最重要的新特性之一是对字符串和二进制数据流做了明确的区分.文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示.Python 3不会以任意隐式的方式混用str和b ...

随机推荐

  1. Linux系统MySQL的常用操作命令

    安装好MySQL服务后添加环境变量: #vi /etc/profile export MYSQL_HOME=/usr/local/mysql export PATH=$PATH:$MYSQL_HOME ...

  2. java web的转发与重定向

    java web的转发与重定向 原创 2012年12月15日 11:51:39 19312 转发和重定向的区别 一.使用方法 转发:request.getRequestDispatcher(" ...

  3. 生产环境OOM\死锁问题排查修复

    OOM: 1.快速恢复业务:如果是集群中的一台机器故障,先隔离故障服务器:如果是多台,则根据Nginx转发策略,对该功能转发到单独的集群,与其他流量隔离,确保其他业务不受影响 2.收集内存溢出Dump ...

  4. Idea中SpringBoot引入thymeleaf没有提示

    问题描述: 最近使用Idea搭建SpringBoot时,用到了 thymeleaf,但是出现了点问题:输入th: 代码有没有提示. 解决方法: <html lang="en" ...

  5. springboot读取静态资源文件的方式

    springboot的请求路径一般会经过Controller处理,但是静态资源文件在请求之后是直接返回的.这涉及到俩个配置项. spring.mvc.static-path-pattern=/** s ...

  6. Lnmp环境安装禅道项目管理软件

    1.本地环境 CentOS Linux release 7.5.1804 (Core) PHP 7.1.0-dev (cli) mysql Ver 14.14 Distrib 5.7.22 nginx ...

  7. 【Mysql】Mysql root用户误删了或只剩下没有任何操作权限的用户怎么办

     一.操作步骤 1.停止mysql服务:在mysql安装目录下找到mysqld.cnf:在mysqld.cnf中找到以下片段[mysqld]:另起一行加入代码:skip-grant-tables 并保 ...

  8. Mock Server之flask_restful(python+flask)

    一.结构设计 上一篇,写了Mock Server的基础实现与被测系统的对接 当我们要mock 的 api越来越多的时候,路由与相关的方法都堆在app.py中就不合适了,不可拔插,可读性也比较差,因此要 ...

  9. 如何测试Web服务.2

    -->全文字数:2700,需要占用你几分钟的阅读时间 ,您也可以收藏后,时间充足时再阅读- -->上一节讲了<Web服务基础介绍>,本节介绍可用于测试web服务的开源测试工具. ...

  10. 排序算法合集(C++实现)

    摘要 排序操作在程序设计中是非常基础和常见的,也是算法的基础部分,我对几种常见的比较排序算法进行了整理. 暴力排序(violence sort) 思想:遍历数组,每次遍历都在未排序的部分找到最小元素的 ...