0

我正在尝试在 Spring Boot 中使用 JMS 将消息推送到 azure 服务总线主题。

正如你在下面看到的,我已经依赖于azure-servicebus-jms-spring-boot-starter

我已经@EnableJms在我的应用程序中进行了配置,并且我还在我的 application.yml 文件中设置了连接字符串,我已经验证它是正确的,我可以看到它正确连接到服务总线,如这些日志中所示 -

2020-12-15 13:36:18.431  INFO 4487 --- [windows.net:-1]] o.a.qpid.jms.sasl.SaslMechanismFinder    : Best match for SASL auth was: SASL-PLAIN
2020-12-15 13:36:18.704  INFO 4487 --- [windows.net:-1]] org.apache.qpid.jms.JmsConnection        : Connection ID:MY_CONNECTION connected to remote Broker: amqps://**-****-*****.servicebus.windows.net

设置此连接后,我将尝试使用我在下面指定的服务向我的服务总线上的主题发送消息,但是我在服务总线上没有看到任何事务。我已经确认目的地是正确的。

因为我没有在此应用程序上使用订阅,所以我没有按照此处spring.jms.servicebus.topic-client-id=<ServiceBusSubscriptionID>指定的方式指定这样做

在我指定主题客户端 ID(一个不同的应用程序)的消费端,我创建了一个虚拟控制器来将示例消息发送到服务总线,它工作正常,这会让我相信我在这个应用程序上缺少一些配置.

但是我不需要在这里指定任何特定的主题客户端 ID,因为我只想推送到主题。一旦我有了服务总线连接字符串,我应该能够将消息推送到我指定的任何主题 -jmsTemplate.convertAndSend(<TOPIC_NAME>, <MESSAGE>)

@Service
class MessageServiceImpl : MessageService {

    private val logger: Logger = LoggerFactory.getLogger(this.javaClass)

    @Autowired
    lateinit var jmsTemplate: JmsTemplate

    override fun sendMessage(topic: Topic, message: Message): Result<Unit> = Result {
        logger.info("Sending message $message to topic ${topic.destination}")
        jmsTemplate.convertAndSend(topic.destination, message)
    }
}

enum class Topic(val destination: String) {
    AWARDS("awards")
}

open class Message(
    val eventTrigger: String,
    val eventTriggeredBy: String,
    val eventTimestamp: LocalDateTime,
    val eventSourceSystem: String
)
  jms:
    servicebus:
      connection-string: ${JMS_CONNECTION_STRING:''}
      idle-timeout: 180000
compile 'com.microsoft.azure:azure-servicebus-jms-spring-boot-starter:2.2.5'
@SpringBootApplication
@EnableJms
class WebServiceApplication {
    companion object {
        @JvmStatic
        fun main(args: Array<String>) {
            SpringApplication.run(WebServiceApplication::class.java, *args)
        }
    }
}
4

1 回答 1

0

我无法将指定的消息发送到给定主题目标的原因是因为我的 Message 类不可序列化。结果,jms 请求以静默方式失败。

我上面遇到的问题有两种可能的解决方案。

第一个是序列化对象,正如我已经提到的 -

open class Message(
    val eventTrigger: String,
    val eventTriggeredBy: String,
    val eventTimestamp: LocalDateTime,
    val eventSourceSystem: String
) : Serializable

然而,这种方法存在一个主要问题。

open class Message(
    val eventTrigger: String,
    val eventTriggeredBy: String,
    val eventTimestamp: LocalDateTime,
    val eventSourceSystem: String,
    val newField: NewField
) : Serializable

data class NewField(val sampleField: String)

例如,如果您添加一个不可序列化的新字段,则此 Message 类将不可序列化并且请求将再次停止工作(这可能很讨厌,因为您可能直到稍后才知道您破坏了它!)

然而,还有第二种可能的解决方案,即将类编组为 json 并将消息作为字符串发送。这个解决方案比序列化更完整

val jsonMessage = ObjectMapper().writeValueAsString(message)
jmsTemplate.convertAndSend(topic.destination, jsonMessage)

于 2020-12-17T19:33:03.557 回答