【python】基于python实现solace的消息收发

一、场景

  测试过程中,需要对solace的消息进行模拟,进而模拟相关业务

 

二、环境

主要的sdk

pip3 install solace-pubsubplus

 

三、代码实现

import asyncio
import json
import logging
from solace.messaging.messaging_service import MessagingService
from solace.messaging.resources.topic import Topic
from solace.messaging.resources.topic_subscription import TopicSubscription
from solace.messaging.config.transport_security_strategy import TLS
from solace.messaging.publisher.direct_message_publisher import PublishFailureListener
from solace.messaging.receiver.message_receiver import MessageHandler
from solace.messaging.receiver.inbound_message import InboundMessage



# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

class PublishCallback(PublishFailureListener):
    def on_failed_publish(self, failed_publish_event):
        logging.error(f"Failed to publish message: {failed_publish_event.get_exception()}")

class SimpleMessageHandler(MessageHandler):
    def on_message(self, message: InboundMessage):
        try:
            payload = message.get_payload_as_string()
            topic = message.get_destination_name()
            logging.info(f"Received message on topic '{topic}': {payload}")
        except Exception as ex:
            logging.error(f"Error processing message: {ex}")

class SolaceDemo:
    def __init__(self, host, port, username, password, vpn_name="default"):
        self.host = host
        self.port = port
        self.username = username
        self.password = password
        self.vpn_name = vpn_name
        self.messaging_service = None
        self.publisher = None
        self.receiver = None

    async def connect(self):
        try:
            # 构建服务配置
            broker_props = {
                "solace.messaging.transport.host": f"tcp://{self.host}:{self.port}",
                "solace.messaging.service.vpn-name": self.vpn_name,
                "solace.messaging.authentication.scheme.basic.username": self.username,
                "solace.messaging.authentication.scheme.basic.password": self.password,
                "solace.messaging.transport.security.strategy": TLS.create().without_certificate_validation()
            }

            # 创建并连接消息服务
            self.messaging_service = MessagingService.builder().from_properties(broker_props).build()
            self.messaging_service.connect()
            logging.info("Successfully connected to Solace")

            # 创建发布者
            self.publisher = self.messaging_service.create_direct_message_publisher_builder().build()
            self.publisher.set_publish_failure_listener(PublishCallback())
            self.publisher.start()
            logging.info("Publisher started")

            # 创建订阅者
            self.receiver = self.messaging_service.create_direct_message_receiver_builder().build()
            self.receiver.start()
            logging.info("Receiver started")

            return True
        except Exception as ex:
            logging.error(f"Failed to connect to Solace: {ex}")
            return False

    async def subscribe(self, topic):
        try:
            if not self.receiver:
                logging.error("Receiver not initialized")
                return False

            subscription = TopicSubscription.of(topic)
            self.receiver.add_subscription(subscription)
            self.receiver.receive_async(SimpleMessageHandler())
            logging.info(f"Subscribed to topic: {topic}")
            return True
        except Exception as ex:
            logging.error(f"Failed to subscribe to topic {topic}: {ex}")
            return False

    async def publish(self, topic, message):
        try:
            if not self.publisher or not self.publisher.is_ready():
                logging.error("Publisher not ready")
                return False

            # 构建消息
            solace_message = self.messaging_service.message_builder() \
                .build(message)

            # 发布消息
            self.publisher.publish(destination=Topic.of(topic), message=solace_message)
            logging.info(f"Published message to topic '{topic}': {message}")
            return True
        except Exception as ex:
            logging.error(f"Failed to publish message: {ex}")
            return False

    async def disconnect(self):
        try:
            if self.publisher:
                self.publisher.terminate()
            if self.receiver:
                self.receiver.terminate()
            if self.messaging_service:
                self.messaging_service.disconnect()
            logging.info("Disconnected from Solace")
        except Exception as ex:
            logging.error(f"Error during disconnect: {ex}")

async def main():
    # 创建SolaceDemo实例
    solace = SolaceDemo(
        host="127.0.0.1",
        port=55555,
        username="admin",
        password="admin",
        vpn_name="default"
    )

    try:
        # 连接到Solace
        if not await solace.connect():
            return

        # 发布一些测试消息
        data = "hello world"
        # 订阅主题
        topic = "flight/boarding/fl1234/yow/ewr"
        await solace.subscribe(topic)
        while True:
            try:
                # 发送消息
                await solace.publish(topic, data)
                await asyncio.sleep(1)
                break
            except KeyboardInterrupt:
                break

    except KeyboardInterrupt:
        logging.info("Shutting down...")
    finally:
        await solace.disconnect()

if __name__ == "__main__":
    asyncio.run(main())

检查日志输出

image

 检查web界面订阅输出

image

 可以看到,发布和订阅正常

 

参考资料:

Home | Solace - PubSub+ for Developers

官方github也有一些介绍,可以自行查阅

 

posted @ 2025-09-30 16:18  代码诠释的世界  阅读(10)  评论(0)    收藏  举报