在春季靴子上以Dinatic的方式创建RabbitMQ组件
#java #springboot #rabbitmq #properties

如今,我遇到了以下挑战:在弹簧靴项目的Koud0上列出了该项目中使用的队列,并根据此列表在RabbitMQ上创建它们。同时,我一个一个声明@Bean示例1 )的一一创建了队列,因此每次启动应用程序时,都会创建适当的队列,如果已经存在。这里的问题是需要每次创建新行时都需要对其进行更改。

示例1

@Bean  
public Queue example1Queue() {  
    log.info("example1Queue created");  
    return QueueBuilder.durable("example1Queue").build();  
}

@Bean  
public Queue example2Queue() {  
    log.info("example2Queue created");  
    return QueueBuilder.durable("example2Queue").build();  
}

创建一个返回Queue@Bean是用春季创建队列的基本方法,但是如果我们需要更灵活和动态的东西,我们需要另一种媒介...我们需要 Declarables

声明

挑战的一般思想是在项目倾向文件中的列表中获得灵活性并集中了队列信息,而无需更改Java以配置新行。在这种情况下,能够立即创建徒劳的队列将很有趣,我发现使用koude4 Class1这是可能的。 Declarables是一个支持Declarable的实现的集合,例如Koud8,Koud3和Koud10(我认为其他人)。要使用它,我们遵循与示例1相同的羊毛,声明了@Bean,因此我们不再返回特定的组件,而是返回了Declarables的实例,其中包含我们需要创建的所有内容。否示例2 i使用koud4重新创建示例1。

示例2

@Bean  
public Declarables queues() {  
    return buildQueues();  
}

private Declarables buildQueues() {  
    return new Declarables(  
        QueueBuilder.durable("example1Queue")  
                    .build(),  
        QueueBuilder.durable("example2Queue")  
                    .build()  
    );
}

请参阅如何有趣,简单和打开我们的可能性,如何从任何地方获取队列清单,浏览它们并组装队列。那就是我们要做的!不过要小心!我警告我们必须使用责任。例如,在公司的项目中,我与她一起创造了许多东西,排队,绑定和交流,但单独地变成一团糟。应仔细添加灵活性,以使其成为一美元并使项目无法维护。

现在,我们知道如何使用Declarables类,让我们存储在项目属性中的队列列表。

在属性文件中创建队列列表

现在,让我们将队列保存在项目的属性(使用YAML)中,以便我们可以在bean中恢复它们并创建它们。为此,我考虑了示例3 的结构。

示例3

queues:  
    example1Queue:  
        name: example1Queue  
        tll: 1000
    example2Queue:  
        name: example2Queue
        tll: 1000

我使用了键和值结构,但我们也可以使用带队列或键 - free对象列表的字符串列表(示例4 < /strong>)(示例5 < /strong >)。我采用了示例3 的结构,使我们能够在其他地方参考队列,如@RabbitListener笔记中(例如:@RabbitListener(queues = "${queues.example1Queue.name}"))。我建议的结构(和示例5 )也使您可以在队列中添加其他相关属性,例如 ttl

示例4

queues:  example1Queue, example2Queue

示例5

queues: 
    - 
        name: example1Queue  
        tll: 1000
    -
        name: example2Queue
        tll: 1000

既然我们在属性中已经排队,我们必须将其映射到类,以便我们可以恢复所需的信息。

恢复队列的配置

要恢复队列列表的值,我们将创建QueuesProperties类(示例6 )。在其中,我们有一个代表Queue的课程,并且我们有Koud3的Koud19。 Queue类具有Koud22和tll属性。在属性上,我尝试使用 list ,但我创建了一个返回列表的koud24。

示例6

@Data 
public class QueuesProperties {  
    private Map<String, Queue> queues;  

    public Collection<Queue> getQueues() {  
        if (CollectionUtils.isEmpty(queues)) return new ArrayList<>();  
        return queues.values();  
    }

    @Data   
    public static class Queue {   
        private String name;  
        private int tll;  
    } 
}

我们设置坑以存储队列后,我们必须告诉Spring,此类代表属性,因此我们可以使用依赖的注入。为此,我们使用Notes @Component和Koud26(示例7 )。在@ConfigurationProperties中,我们将不得不通知我们财产的前缀,但是由于它是层次结构的顶部,我们不需要。

示例7

@Data 
@Component    
@ConfigurationProperties
public class QueuesProperties {  
    ...
}

我们还可以使用弹簧验证验证我们的笔记,并在丢失任何信息时防止执行应用程序。例如,我们知道Queuename属性必须有义务,我们可以用@NotBlank写下来,然后用koud31写下类,以便春天知道他们应该验证它们(示例8 < /strong>)。 / / P>

示例8

...
@Data  
@Validated  
public static class Queue {  
    @NotBlank  
    private String name;  
    private int tll;  
}
...

完成了所有这些,我们的全班就像这样:

示例9 QueuesProperties.java

@Data  
@Validated  
@Component    
@ConfigurationProperties
public class QueuesProperties {  

    private Map<String, Queue> queues;  

    public Collection<Queue> getQueues() {  
        if (CollectionUtils.isEmpty(queues)) return new ArrayList<>();  
        return queues.values();  
    }  

    @Data  
    @Validated  
    public static class Queue {  
        @NotBlank  
        private String name;  
        private int tll;  
    }  
}

现在,我们可以使用依赖任何支持类的弹簧来注入我们的属性类。

创建我们的队列

为了创建我们的行,我们将创建一个名为QueuesInitializer@Component注释的类,我们将在其中声明我们的@Bean。在其中,我们将使用最终方差注入我们的属性(必须创建一个构建器,以便春季可以实例化,因此我使用@RequiredArgsConstructor @RequiredArgsConstructor Note36)。

然后,我们声明了我们的@Bean,该@Bean返回使用我们的线路返回Declarables。如示例10:

所示

示例10 QueuesInitializer.java

@Component  
@RequiredArgsConstructor  
public class QueuesInitializer {  

    private final QueuesProperties queuesProperties;  

    @Bean  
    public Declarables queues() {  
        return buildQueues();  
    }  

    private Declarables buildQueues() {  
        List<Queue> queues = queuesProperties.getQueues().stream().map(queue -> {  
            return QueueBuilder.durable(queue.getName())  
                               .ttl(queue.getTll())  
                               .build();  
        }).collect(Collectors.toList());  

        return new Declarables(queues);  
    }  

}

准备就绪,这很简单又狂。

repsã³rio

您可以在此repositório中找到代码。