无法使用 azure-servicebus-jms-spring-boot-starter 从 Spring 引导应用程序写入 Azure 服务总线主题
Unable to write to Azure Service Bus Topic from Spring Boot Application using azure-servicebus-jms-spring-boot-starter
我正在尝试在 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>
作为指定 here
在指定主题客户端 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)
}
}
}
我无法将指定消息发送到给定主题目的地的原因是我的消息 class 不可序列化。结果,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)
例如,如果您添加一个不可序列化的新字段,则此消息 class 将不可序列化并且请求将再次停止工作(这可能很讨厌,因为您可能没有意识到直到后来才打破它!)
但是还有第二种可能的解决方案,即将 class 编组为 json 并将消息作为字符串发送。这个解决方案比序列化它更完整
val jsonMessage = ObjectMapper().writeValueAsString(message)
jmsTemplate.convertAndSend(topic.destination, jsonMessage)
我正在尝试在 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>
作为指定 here
在指定主题客户端 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)
}
}
}
我无法将指定消息发送到给定主题目的地的原因是我的消息 class 不可序列化。结果,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)
例如,如果您添加一个不可序列化的新字段,则此消息 class 将不可序列化并且请求将再次停止工作(这可能很讨厌,因为您可能没有意识到直到后来才打破它!)
但是还有第二种可能的解决方案,即将 class 编组为 json 并将消息作为字符串发送。这个解决方案比序列化它更完整
val jsonMessage = ObjectMapper().writeValueAsString(message)
jmsTemplate.convertAndSend(topic.destination, jsonMessage)