Spring Cloud Stream集成kafka

1. 添加maven依赖

<dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-stream</artifactId>
      </dependency>
      <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-stream-kafka</artifactId>
      </dependency>

2. 生成者

(1)properties 配置
spring:
  cloud:
    stream:
      bindings:
        outboundOrg: #默认为output,可自定义
            destination: orgChangeTopic
            content-type: application/json
      kafka:
        binder:
          zk-nodes: localhost
          brokers: localhost
(2) Application增加注解@EnableBinding(Source.class)
(3)定义输出通道
import org.springframework.cloud.stream.annotation.Output;
import org.springframework.messaging.MessageChannel;

public interface SourceChannels {
	@Output("outboundOrg")
	MessageChannel outboundOrg();
}
(4) 生产者代码
import com.thoughtmechanix.organization.events.models.OrganizationChangeModel;
import com.thoughtmechanix.organization.utils.UserContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.stream.messaging.Source;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Component;

@Component
public class SimpleSourceBean {
	@Autowired
	private Source source;

	private static final Logger logger = LoggerFactory.getLogger(SimpleSourceBean.class);

	public void publishOrgChannel(String action,String orgId){
		logger.debug("Sending Kafka message {} for Organization Id: {}", action, orgId);
		OrganizationChangeModel change = new OrganizationChangeModel(OrganizationChangeModel.class.getTypeName(),action,orgId, UserContext.getCorrelationId());
		source.output().send(MessageBuilder.withPayload(change).build());
	}
}
import com.thoughtmechanix.organization.events.source.SimpleSourceBean;
import com.thoughtmechanix.organization.model.Organization;
import com.thoughtmechanix.organization.repository.OrganizationRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.UUID;

@Service
public class OrganizationService {
    @Autowired
    private OrganizationRepository orgRepository;
    @Autowired
    SimpleSourceBean simpleSourceBean;

    public Organization getOrg(String organizationId) {
        return orgRepository.findById(organizationId);
    }

    public void saveOrg(Organization org){
        org.setId( UUID.randomUUID().toString());

        orgRepository.save(org);
        simpleSourceBean.publishOrgChannel("SAVE",org.getId());
    }

    public void updateOrg(Organization org){
        orgRepository.save(org);
        simpleSourceBean.publishOrgChannel("UPDATE",org.getId());
    }

    public void deleteOrg(Organization org){
        orgRepository.delete( org.getId());
        simpleSourceBean.publishOrgChannel("DELETE",org.getId());
    }
}

3. 消费者

(1)properties 配置
spring:
  cloud:
    stream:
      kafka:
        binder:
          brokers: localhost
          zk-nodes: localhost
      bindings:
        inboundOrgChanges:   #默认为input
          destination: orgChangeTopic
          content-type: application/json
          group: licensingGroup #消费者组保证消息只被一组服务实例处理一次
(2) Application增加注解@EnableBinding(Sink.class)
(3)定义输入通道
import org.springframework.cloud.stream.annotation.Input;
import org.springframework.messaging.SubscribableChannel;

public interface CustomChannels {
	@Input("inboundOrgChanges")
	SubscribableChannel orgs();
}
(4)消费者代码
import com.thoughtmechanix.licenses.events.CustomChannels;
import com.thoughtmechanix.licenses.events.models.OrganizationChangeModel;
import com.thoughtmechanix.licenses.repository.OrganizationRedisRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.annotation.StreamListener;

@EnableBinding(CustomChannels.class)
public class OrganizationChangeHandler {
	private static final Logger logger = LoggerFactory.getLogger(OrganizationChangeHandler.class);
	@Autowired
	private OrganizationRedisRepository organizationRedisRepository;

	@StreamListener("inboundOrgChanges")
	public void loggerSink(OrganizationChangeModel orgChange){
		logger.debug("Received a message of type " + orgChange.getType());
		switch (orgChange.getAction()){
			case "GET":
				logger.debug("Received a GET event from the organization service for organization id {}", orgChange.getOrganizationId());
				break;
			case "SAVE":
				logger.debug("Received a SAVE event from the organization service for organization id {}", orgChange.getOrganizationId());
				break;
			case "UPDATE":
				logger.debug("Received a UPDATE event from the organization service for organization id {}", orgChange.getOrganizationId());
				organizationRedisRepository.deleteOrganization(orgChange.getOrganizationId());
				break;
			case "DELETE":
				logger.debug("Received a DELETE event from the organization service for organization id {}", orgChange.getOrganizationId());
				organizationRedisRepository.deleteOrganization(orgChange.getOrganizationId());
				break;
			default:
				logger.error("Received an UNKNOWN event from the organization service of action {}", orgChange.getAction());
				break;
		}
	}
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值