2017-03-24 44 views
0

我在Spring引導1.5.2上有Schema Registry服務器和Schema Registry客戶端。部署在獨立tomcat上的Spring雲流模式註冊表

我正在發送avro消息給kafka活頁夾。使用Brooklyn.SR3。模式被持續到postgres數據庫。一切正常,而我開始春季引導主要類。

當嘗試在獨立部署到Tomcat存在時,試圖將消息發送到粘合劑中的錯誤:

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) 

UPDATE :

導致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

您是否將服務器作爲獨立進程運行? spring.cloud.stream.schemaRegistryClient.endpoint對您的應用程序有什麼價值?我也會推薦碰到切爾西RC1,我們在模式註冊和緩存方面做了很多改進。

+0

年底切換到切爾西RC1 。 Tomcat作爲獨立進程運行。架構註冊表位於同一臺服務器上:spring.cloud.stream.schemaRegistryClient.endpoint = http:// localhost:8080仍然收到相同的錯誤。謝謝。 –

+0

我不確定你可能會錯過什麼。但我只是按照您提供的相同基礎信息設置了一個項目,並且所有工作都正常。以下是配置屬性: –

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\"}]}"}

+0

在單獨的tomcat上部署了Schema Registry war。我在url前面有協議http。但仍然獲得302發現...在發佈架構,並嘗試發送消息給卡夫卡。 –

+0

經紀人的類型並不重要。您是否試圖直接使用POST訪問架構服務器,然後重新獲取架構。文檔在服務器的端點上有一節。看看你是否可以直接與它聯繫 –

+0

我在另一個tomcat上部署了Registry Server,我可以通過(http):// localhost:8090/sr/schemas/1獲得模式。嘗試從另一個具有spring.cloud.stream.schemaRegistryClient.endpoint =(http):// localhost:8090/sr的應用程序發送消息給活頁夾並仍然找到302。 Spring正在做這個重定向,但看不出爲什麼。 –