Spring Cloud Stream Kafka Channel在Spring Boot应用程序中不起作用

时间:2018-04-30 01:57:48

标签: spring-boot apache-kafka spring-cloud-stream

我一直在尝试在Spring启动应用程序中使用入站的SubscribableChannel和出站MessageChannel。

我已成功设置kafka频道并成功测试。

此外,我创建了一个基本的Spring启动应用程序,用于测试从频道添加和接收内容。

我遇到的问题是当我将等效代码放在它所属的应用程序中时,似乎邮件永远不会被发送或接收。通过调试很难确定发生了什么,但对我来说唯一不同的是频道名称。在工作impl中,通道名称类似于非工作应用程序中的application.channel,其localhost:8080 / channel。

我想知道是否有一些弹簧启动配置阻止或改变通道创建到不同的通道源?

有人有类似的问题吗?

application.yml

spring:
  datasource:
    url: jdbc:h2:mem:dpemail;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
    platform: h2
    username: hello
    password: 
    driverClassName: org.h2.Driver    
  jpa:
    properties:
      hibernate:
        show_sql: true
        use_sql_comments: true
        format_sql: true

  cloud:
    stream:
      kafka:
        binder:
          brokers: localhost:9092
      bindings:
        email-in:
          destination: email
          contentType: application/json
        email-out:
          destination: email
          contentType: application/json

电子邮件

public class Email {

    private long timestamp;

    private String message;

    public long getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(long timestamp) {
        this.timestamp = timestamp;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

}

绑定配置

@EnableBinding(EmailQueues.class)
public class EmailQueueConfiguration {    
}

接口

public interface EmailQueues {

    String INPUT = "email-in";
    String OUTPUT = "email-out";

    @Input(INPUT)
    SubscribableChannel inboundEmails();

    @Output(OUTPUT)
    MessageChannel outboundEmails();
}

控制器

 @RestController
    @RequestMapping("/queue")
    public class EmailQueueController {

        private EmailQueues emailQueues;


        @Autowired
        public EmailQueueController(EmailQueues emailQueues) {
            this.emailQueues = emailQueues;
        }

        @RequestMapping(value = "sendEmail", method = POST)
        @ResponseStatus(ACCEPTED)
        public void sendToQueue() {
            MessageChannel messageChannel = emailQueues.outboundEmails();
            Email email = new Email();
            email.setMessage("hello world: " + System.currentTimeMillis());
            email.setTimestamp(System.currentTimeMillis());

            messageChannel.send(MessageBuilder.withPayload(email).setHeader(MessageHeaders.CONTENT_TYPE, MimeTypeUtils.APPLICATION_JSON).build());

        }

        @StreamListener(EmailQueues.INPUT)
        public void handleEmail(@Payload Email email) {
            System.out.println("received: " + email.getMessage());
        }
    }

我不确定是否有一个使用Spring-Cloud,Spring-Cloud-Sleuth的继承配置项目可能阻止它工作,但即使我删除它仍然没有。但与我使用上述代码的应用程序不同,我从未看到ConsumeConfig正在配置,例如:

o.a.k.clients.consumer.ConsumerConfig    : ConsumerConfig values: 
    auto.commit.interval.ms = 100
    auto.offset.reset = latest
    bootstrap.servers = [localhost:9092]
    check.crcs = true
    client.id = consumer-2
    connections.max.idle.ms = 540000
    enable.auto.commit = false
    exclude.internal.topics = true

(这个配置是我在运行上面的代码时在我的基本Spring Boot应用程序中看到的,代码可以从kafka频道编写和读取)....

我认为我正在使用的其中一个库中有一些弹簧启动配置创建了一个不同类型的通道我只是找不到那个配置。

2 个答案:

答案 0 :(得分:1)

您发布的内容包含许多不相关的配置,因此很难确定是否有任何障碍。此外,当您说" ..似乎邮件永远不会被发送或接收.." 日志中是否有例外?另外,请说明您使用的Kafka版本以及Spring Cloud Stream。 现在,我确实尝试根据您的代码重新创建它(在清理了一些只留下相关部分之后)并且能够成功发送/接收。

我的Kafka版本是0.11和Spring Cloud Stream 2.0.0。 以下是相关代码:

git remote set-url origin <URL>

答案 1 :(得分:0)

好的,经过大量的调试......我发现有些东西正在创建一个测试支持Binder(当前还不知道),所以很明显这用于不影响向真实频道添加消息。

添加

@SpringBootApplication(exclude = TestSupportBinderAutoConfiguration.class)

kafka频道配置已经工作,消息正在添加..知道地球上正在设置这个测试支持绑定器会很有趣..我最终会找到那个吸盘。