如今,我遇到了以下挑战:在弹簧靴项目的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();
}
创建一个返回 挑战的一般思想是在项目倾向文件中的列表中获得灵活性并集中了队列信息,而无需更改Java以配置新行。在这种情况下,能够立即创建徒劳的队列将很有趣,我发现使用koude4 Class1这是可能的。 示例2 请参阅如何有趣,简单和打开我们的可能性,如何从任何地方获取队列清单,浏览它们并组装队列。那就是我们要做的!不过要小心!我警告我们必须使用责任。例如,在公司的项目中,我与她一起创造了许多东西,排队,绑定和交流,但单独地变成一团糟。应仔细添加灵活性,以使其成为一美元并使项目无法维护。 现在,我们知道如何使用 现在,让我们将队列保存在项目的属性(使用YAML)中,以便我们可以在bean中恢复它们并创建它们。为此,我考虑了示例3 的结构。 示例3 我使用了键和值结构,但我们也可以使用带队列或键 - free对象列表的字符串列表(示例4 < /strong>)(示例5 < /strong >)。我采用了示例3 的结构,使我们能够在其他地方参考队列,如 示例4 示例5 既然我们在属性中已经排队,我们必须将其映射到类,以便我们可以恢复所需的信息。 要恢复队列列表的值,我们将创建Queue
的@Bean
是用春季创建队列的基本方法,但是如果我们需要更灵活和动态的东西,我们需要另一种媒介...我们需要 Declarables
strong>。 P>
声明
Declarables
是一个支持Declarable
的实现的集合,例如Koud8,Koud3和Koud10(我认为其他人)。要使用它,我们遵循与示例1相同的羊毛,声明了@Bean
,因此我们不再返回特定的组件,而是返回了Declarables
的实例,其中包含我们需要创建的所有内容。否示例2 i使用koud4重新创建示例1。
@Bean
public Declarables queues() {
return buildQueues();
}
private Declarables buildQueues() {
return new Declarables(
QueueBuilder.durable("example1Queue")
.build(),
QueueBuilder.durable("example2Queue")
.build()
);
}
Declarables
类,让我们存储在项目属性中的队列列表。
在属性文件中创建队列列表
queues:
example1Queue:
name: example1Queue
tll: 1000
example2Queue:
name: example2Queue
tll: 1000
@RabbitListener
笔记中(例如:@RabbitListener(queues = "${queues.example1Queue.name}")
)。我建议的结构(和示例5 )也使您可以在队列中添加其他相关属性,例如 ttl 。
queues: example1Queue, example2Queue
queues:
-
name: example1Queue
tll: 1000
-
name: example2Queue
tll: 1000
恢复队列的配置
QueuesProperties
类(示例6 )。在其中,我们有一个代表Queue
的课程,并且我们有Koud3的Koud19。 Queue
类具有Koud22和tll
属性。在属性上,我尝试使用 list
示例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 {
...
}
我们还可以使用弹簧验证验证我们的笔记,并在丢失任何信息时防止执行应用程序。例如,我们知道 示例8 完成了所有这些,我们的全班就像这样: 示例9 (QueuesProperties.java) 现在,我们可以使用依赖任何支持类的弹簧来注入我们的属性类。 为了创建我们的行,我们将创建一个名为 然后,我们声明了我们的 示例10 (QueuesInitializer.java) 准备就绪,这很简单又狂。 您可以在此repositório中找到代码。Queue
的name
属性必须有义务,我们可以用@NotBlank
写下来,然后用koud31写下类,以便春天知道他们应该验证它们(示例8 < /strong>)。 / / P>
...
@Data
@Validated
public static class Queue {
@NotBlank
private String name;
private int tll;
}
...
@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:
@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