如何配置spring-cloud-azure-starter-servicus-jms?

ukdjmx9f  于 2023-06-24  发布在  Spring
关注(0)|答案(1)|浏览(113)

找到了this guide from Microsoft关于如何在Spring中使用JMS侦听Azure服务总线。我喜欢使用@JmsListener注解的简单而干净的实现。我已经让它工作了,并希望继续使用@JmsListener(destination = "QUEUENAME", containerFactory = "jmsListenerContainerFactory")和自动配置。我当前的JMS方法有两个问题;根据我对文档的理解,默认情况下没有注册错误处理程序,也没有启用事务。
我已经读到我可以用下面的配置代码替换默认的jmsListenerContainerFactory Bean,这将解决这两个问题。

@Bean
fun jmsListenerContainerFactory(
    connectionFactory: ConnectionFactory,
    errorHandler: CustomErrorHandler
): DefaultJmsListenerContainerFactory {
    val factory = DefaultJmsListenerContainerFactory()
    factory.setConnectionFactory(connectionFactory)
    factory.setErrorHandler(errorHandler)
    factory.setSessionTransacted(true)
    return factory
}

现在出现的新问题是No qualifying bean of type 'jakarta.jms.ConnectionFactory'
有没有办法让spring-cloud-azure-starter-servicebus-jms提供这个ConnectionFactory,就像它以前在自动配置一切时所做的那样?或者,是否有一种简单的方法来创建ConnectionFactory,以便我可以连接到服务总线?

bqjvbblv

bqjvbblv1#

没有得到这个工作,所以放弃了库spring-cloud-azure-starter-servicebus-jms,支持qpid-jms-client(我相信这是底层库)。下面的配置在我使用qpid-jms-client时有效。(客户端ID只是持久订阅所需的,它可以是任何值)

@Configuration
@EnableJms
class AzureServiceBusConfiguration(
    @Value("\${spring.jms.servicebus.client-id}") private val clientId: String,
    private val log: Logger,
) {

    private fun connection(credentials: ServiceBusCredentials) =
        JmsConnectionFactory(credentials.username(), credentials.password(), credentials.remoteUri()).apply {
            clientID = clientId
        }

    private fun connectionFactory(connectionString: String) = CachingConnectionFactory(
        connection(ServiceBusCredentials(connectionString))
    )

    private fun listenerContainerFactory(connectionString: String) = DefaultJmsListenerContainerFactory().apply {
        this.setConnectionFactory(connectionFactory(connectionString))
        this.setSubscriptionDurable(true)
        this.setSessionTransacted(true)
        this.setErrorHandler { t -> log.error("Error in listener!", t) }
    }

    @Bean
    fun jmsListenerContainerFactory(
        @Value("\${spring.jms.servicebus.connection-string}")
        connectionString: String
    ) = listenerContainerFactory(connectionString)
}

JmsConnectionFactory来自qpid-jms-client

相关问题