我正试图从Josh Long演示中运行一些例子。我删除了一些我现在不需要的东西,因为我想通过RabbitMQ评估Spring Cloud Stream。
不幸的是,每当我向我的发布者发布内容时,每一条消息都会传递给我的消费者。我担心我的PC上隐藏了一些额外的消费者(没有杀死线程或smth) - 所以我重新启动了PC。我还创建了单独的vhost,以确保它只是我的,并且每隔一条消息再次传递给消费者。
我的印象是某些东西在背景中消耗它,但它不应该。如果我运行少数几个发布者生成数据,那么消费者的输出可能会开始变得更好 - 就像那里涉及一些负载平衡一样。
所以,问题是 - 应该如何使用最小版本的发布者 - 消费者应用程序,其中一个是使用Spring Cloud Stream每隔一秒向该频道发布消息?
消费者:
@EnableBinding(ServerChannels.class)
@SpringBootApplication
public class ReservationServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ReservationServiceApplication.class, args);
}
@Bean
IntegrationFlow inboundReservationFlow(ServerChannels channels) {
return IntegrationFlows
.from(channels.input())
.handle((GenericHandler<String>) (reservationName, headers) -> {
System.out.println(reservationName);
return null;
})
.get();
}
}
@Component
class StreamListenerComponent {
@StreamListener("input")
public void on(String reservationName) {
}
}
interface ServerChannels {
@Input
SubscribableChannel input();
}
@NoArgsConstructor
@AllArgsConstructor
@Data
@Entity
class Reservation {
public Reservation(String reservationName) {
this.reservationName = reservationName;
}
@Id
@GeneratedValue
private Long id;
private String reservationName; // reservation_name
}
出版商:
@IntegrationComponentScan
@EnableBinding(DeviceChannels.class)
@SpringBootApplication
public class VehicleClientApplication {
private final EventWriter eventWriter;
private final int randomNum;
private int counter;
VehicleClientApplication(EventWriter eventWriter) {
this.eventWriter = eventWriter;
Random rn = new Random();
int range = 10;
randomNum = rn.nextInt(range) + 10;
}
public static void main(String[] args) {
SpringApplication.run(VehicleClientApplication.class, args);
}
@Scheduled(fixedRate = 50)
public void checkRecords() {
this.eventWriter
.write(randomNum + " " + counter);
System.out.println(counter);
counter++;
}
}
interface DeviceChannels {
String OUTPUT = "output";
@Output(OUTPUT)
MessageChannel output();
}
@MessagingGateway
interface EventWriter {
@Gateway(requestChannel = DeviceChannels.OUTPUT)
void write(String rn);
}
输入:
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
输出:
19 1
19 3
19 5
19 7
19 9
19 11
19 13
19 15
19 17
19 19
19 21
19 23
19 25
答案 0 :(得分:1)
input
频道上有2位消费者
@StreamListener("input")
public void on(String reservationName) {
}
和
return IntegrationFlows
.from(channels.input())
向流监听器添加System.out
,您将看到。