pom.xml
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.4.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Dalston.SR1</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-stream-binder-kafka</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
yml文件
spring: cloud: stream: defaultBinder: kafka bindings: issueInPutMessage: destination: devops-cca content-type: application/json group: default issueOutPutMessage: destination: devops-cca content-type: application/json producer: partitionKeyExpression: payload.id partitionCount: 2 kafka: binder: brokers: 10.40.64.53 zkNodes: 10.40.64.53 autoAddPartitions: true server: port: 9050
SenderApplication.java
@SpringBootApplication public class SenderApplication { public static void main(String[] args) { SpringApplication.run(SenderApplication.class, args); } }
MainController.java
@RestController @EnableBinding({IssueInputMessage.class, IssueOutputMessage.class}) public class MainController { @Autowired IssueOutputMessage issueOutputMessage; @Value("${spring.cloud.stream.bindings.issueOutPutMessage.producer.partitionCount}") private String partitionCount; private void sendMore() { for (int _index = 0; _index < 10; _index++) { int index = Integer.parseInt(String.valueOf(Math.round(Math.random() * Math.pow(10, partitionCount.length())) / Integer.parseInt(partitionCount))); IssueMessage chatMessage = new IssueMessage(); chatMessage.setMessage(String.format("message %s", _index)); chatMessage.setId(index); issueOutputMessage.issueOutPutMessage().send(MessageBuilder.withPayload(chatMessage).build()); } } private void sendOnlyOne() { int index = Integer.parseInt(String.valueOf(Math.round(Math.random() * Math.pow(10, partitionCount.length())) / Integer.parseInt(partitionCount))); IssueMessage chatMessage = new IssueMessage(); chatMessage.setMessage(String.format("message %s", Math.round(Math.random() * 10))); chatMessage.setId(index); issueOutputMessage.issueOutPutMessage().send(MessageBuilder.withPayload(chatMessage).build()); } @RequestMapping("/") public String index() { sendOnlyOne(); return "ok"; } @StreamListener(IssueInputMessage.ISSUE_INPUT_MESSAGE) public void analyzingCancel(Message<IssueMessage> message) { IssueMessage chatMessage = message.getPayload(); System.out.println(chatMessage.getMessage()); } }
public interface IssueInputMessage { String ISSUE_INPUT_MESSAGE = "issueInPutMessage"; @Input SubscribableChannel issueInPutMessage(); }
public class IssueMessage<T> { private int id; public int getId() { return id; } public void setId(int id) { this.id = id; } private T message; public T getMessage() { return message; } public void setMessage(T message) { this.message = message; } }
public interface IssueOutputMessage { @Output MessageChannel issueOutPutMessage(); }