我在Spring boot 1.5.2上有Schema Registry服务器和Schema Registry客户端。
我正在向kafka活页夹发送avro消息。使用Brooklyn.SR3。模式被持久化到postgres DB。当我开始春季启动主课时,一切正常。
尝试在独立的tomcat上部署时,尝试向binder发送消息时出错:
caused by: org.springframework.web.client.HttpClientErrorException: 404 null
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:91)
at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:700)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:653)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:613)
at org.springframework.web.client.RestTemplate.postForEntity(RestTemplate.java:407)
at org.springframework.cloud.stream.schema.client.DefaultSchemaRegistryClient.register(DefaultSchemaRegistryClient.java:53)
at org.springframework.cloud.stream.schema.avro.AvroSchemaRegistryClientMess****ageConverter.resolveSchemaForWriting(AvroSchemaRegistryClientMessageConverter.java:187)****
at org.springframework.cloud.stream.schema.avro.AbstractAvroMessageConverter.convertToInternal(AbstractAvroMessageConverter.java:174)
at org.springframework.messaging.converter.AbstractMessageConverter.toMessage(AbstractMessageConverter.java:193)
at org.springframework.cloud.stream.binding.MessageConverterConfigurer$ContentTypeConvertingInterceptor.preSend(MessageConverterConfigurer.java:237)
at org.springframework.integration.channel.AbstractMessageChannel$ChannelInterceptorList.preSend(AbstractMessageChannel.java:538)
at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:415)
我切换到Tomcat 9,现在又出现了一些错误:
Caused by: org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [interface java.util.Map] and content type [text/html;charset=UTF-8]
at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:109)
at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:917)
at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:901)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:655)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:613)
at org.springframework.web.client.RestTemplate.postForEntity(RestTemplate.java:407)
at org.springframework.cloud.stream.schema.client.DefaultSchemaRegistryClient.register(DefaultSchemaRegistryClient.java:54)
at org.springframework.cloud.stream.schema.avro.AvroSchemaRegistryClientMessageConverter.resolveSchemaForWriting(AvroSchemaRegistryClientMessageConverter.java:219)
at org.springframework.cloud.stream.schema.avro.AbstractAvroMessageConverter.convertToInternal(AbstractAvroMessageConverter.java:174)
at org.springframework.messaging.converter.AbstractMessageConverter.toMessage(AbstractMessageConverter.java:193)
at org.springframework.cloud.stream.binding.MessageConverterConfigurer$ContentTypeConvertingInterceptor.preSend(MessageConverterConfigurer.java:238)
at org.springframework.integration.channel.AbstractMessageChannel$ChannelInterceptorList.preSend(AbstractMessageChannel.java:538)
at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:415)
更新:
导致404的问题是在独立tomcat上部署的应用程序的根。我解决了这个问题,但现在又出现了另一个错误:
Failed to register schema: <302 Found,{Location=[/csl/], Transfer-Encoding=[chunked], Date=[Mon, 27 Mar 2017 10:08:40 GMT]}>
at org.springframework.cloud.stream.schema.client.DefaultSchemaRegistryClient.register(DefaultSchemaRegistryClient.java:64)
at org.springframework.cloud.stream.schema.avro.AvroSchemaRegistryClientMessageConverter.resolveSchemaForWriting(AvroSchemaRegistryClientMessageConverter.java:219)
at org.springframework.cloud.stream.schema.avro.AbstractAvroMessageConverter.convertToInternal(AbstractAvroMessageConverter.java:174)
at org.springframework.messaging.converter.AbstractMessageConverter.toMessage(AbstractMessageConverter.java:193)
at org.springframework.cloud.stream.binding.MessageConverterConfigurer$ContentTypeConvertingInterceptor.preSend(MessageConverterConfigurer.java:238)
at org.springframework.integration.channel.AbstractMessageChannel$ChannelInterceptorList.preSend(AbstractMessageChannel.java:538)
at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:415)
答案 0 :(得分:0)
您是否将服务器作为独立进程运行?您的申请中spring.cloud.stream.schemaRegistryClient.endpoint
的价值是多少?我还建议碰到Chelsea RC1,我们在架构注册和缓存方面做了很多改进。
答案 1 :(得分:0)
我不确定你能错过什么。但我只是按照你提供的相同基础信息设置了一个项目,一切正常。这是配置属性:
spring.cloud.stream.bindings.output.contentType=application/*+avro
server.port=8080
spring.cloud.stream.schemaRegistryClient.endpoint=http://localhost:8080
spring.cloud.stream.schema.avro.dynamic-schema-generation-enabled=true
我有一个具有配置的类和一个用于发送消息的休息端点
@SpringBootApplication
@EnableSchemaRegistryServer
@EnableSchemaRegistryClient
@EnableBinding(Source.class)
@RestController
public class SchemaApplication {
@Autowired
private Source source;
public static void main(String[] args) {
SpringApplication.run(SchemaApplication.class, args);
}
@RequestMapping(value = "/messages", method = RequestMethod.POST)
public void sendMessage(){
User user = new User();
user.setName("Joe");
user.setFavoriteColor("Blue");
source.output().send(MessageBuilder.withPayload(user).build());
}
}
正在使用正确的标题application/vnd.user.v1+avro
我注意到的一件事是您的端点缺少协议http
,抛出的错误通常是启动期间格式错误的协议异常。
此外,我建议将服务器作为与您的应用程序分开的实体,您希望避免应用程序与业务实体和服务器之间发生任何类路径冲突。
同样在查询http://localhost/user/avro时,我会返回生成的架构:{"id":1,"version":1,"subject":"user","format":"avro","definition":"{\"type\":\"record\",\"name\":\"User\",\"namespace\":\"io.acme\",\"fields\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"favoriteColor\",\"type\":\"string\"}]}"}
答案 2 :(得分:0)
这是愚蠢的/在结束时 spring.cloud.stream.schemaRegistryClient.endpoint = http://localhost:8080/csl的 / 强>