Как создать последнюю очередь Artemis с Spring Boot 2.2 и встроенным брокером? - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь создать очередь ActiveMQ Artemis с включенным свойством last-value .

Мое приложение использует Spring Boot 2.2.6, и я использую Artemis в качестве встроенного посредника .


Spring Boot имеет свойство spring.artemis.embedded.queues, которое я попытался установить следующим образом:

spring.artemis.embedded.queues: myqueue?last-value-key=code

Но, похоже, это не работает.

В документации Artemis упоминается 2 способа настройки очереди:

  1. Использование broker.xml файла конфигурации, но я не смог сделать эту работу.
  2. Получение сеанса CORE объект, но мне не удалось получить этот объект через Spring.

Есть ли простой способ настроить очередь с последним значением с помощью Spring Boot, либо через application.yml или через конфигурацию Java / Kotlin?


Вот мой тестовый код:

@ExtendWith(SpringExtension::class)
@SpringBootTest
class ArtemisTest(
  @Autowired private val jmsTemplate: JmsTemplate
) {

  @Test
  fun testMessage() {
    for(i in 1..5) {
      jmsTemplate.convertAndSend(
        "myqueue",
        "message $i"
      ) {
        it.also { it.setStringProperty("code", "1") }
      }
    }

    val size = jmsTemplate.browse("myqueue") { _: Session, browser: QueueBrowser ->
      browser.enumeration.toList().size
    }

    assertThat(size).isEqualTo(1)
  }
}

1 Ответ

0 голосов
/ 23 апреля 2020

Копаясь в коде Spring Boot, я обнаружил, что можно предоставить ArtemisConfigurationCustomizer для:

настройки конфигурации сервера JMS Artemis до того, как она будет использоваться автоматически настроенным EmbeddedActiveMQ экземпляр

@Configuration
class ArtemisConfig : ArtemisConfigurationCustomizer {
  override fun customize(configuration: org.apache.activemq.artemis.core.config.Configuration?) {
    configuration?.let {
      it.addQueueConfiguration(
        CoreQueueConfiguration()
          .setAddress("myqueue")
          .setName("myqueue")
          .setLastValueKey("code")
          .setRoutingType(RoutingType.ANYCAST)
      )
    }
  }
}
...