在独立的tomcat上部署的Spring云流模式注册表

时间:2017-03-24 10:33:24

标签: spring-cloud-stream

我在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)

3 个答案:

答案 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 /