每一条消息都通过RabbitMQ传递,应该通过每个消息

时间:2017-09-28 13:34:24

标签: spring rabbitmq spring-cloud-stream

我正试图从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

1 个答案:

答案 0 :(得分:1)

input频道上有2位消费者

@StreamListener("input")
public void on(String reservationName) {
}

 return IntegrationFlows
        .from(channels.input())

向流监听器添加System.out,您将看到。