python: Publish/Subscribe Pattern

项目结构:

发布者不直接发送消息给特定接收者,而是将消息发布到「主题」;订阅者按需订阅「主题」,仅接收自己关注的消息,完美解耦消息发送方和接收方,是珠宝行业多部门协同的理想消息通信模式。

业务流程包含 6 大核心环节,对应6 个消息主题,各部门按需订阅:
原材料采购(RawMaterialPurchase):采购部发布,仓库、财务部订阅
珠宝生产(JewelryProduction):生产部发布,质检部、仓库订阅
质量检测(QualityInspection):质检部发布,销售部、仓库、财务部订阅
门店铺货(StoreDistribution):仓库发布,各门店、销售部订阅
珠宝销售(JewelrySale):门店发布,财务部、库存部订阅
售后保养(AfterSalesCare):客服部发布,客户部、技术部订阅

# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Publish/Subscribe Pattern 发布订阅模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/23 21:15
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : topics.py
"""
统一消息主题配置,杜绝硬编码
"""
class Topic:
    """
 
    """
    # 珠宝全业务流程主题
    RAW_MATERIAL_PURCHASE = "RawMaterialPurchase"
    JEWELRY_PRODUCTION = "JewelryProduction"
    QUALITY_INSPECTION = "QualityInspection"
    STORE_DISTRIBUTION = "StoreDistribution"
    JEWELRY_SALE = "JewelrySale"
    AFTER_SALES_CARE = "AfterSalesCare"
 
 
 
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Publish/Subscribe Pattern 发布订阅模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/23 21:16
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : models.py
from dataclasses import dataclass
from typing import Optional
 
"""
珠宝行业领域消息模型
"""
@dataclass
class JewelryMessage:
    """
    基础消息
    """
    title: str
    content: str
    department: str
 
@dataclass
class RawMaterialPurchaseMsg(JewelryMessage):
    """
 
    """
    material: str
    quantity: str
 
@dataclass
class JewelryProductionMsg(JewelryMessage):
    """
 
    """
    product_count: int
    product_type: str
 
@dataclass
class QualityInspectionMsg(JewelryMessage):
    """
 
    """
    qualified_count: int
    has_certificate: bool
 
@dataclass
class StoreDistributionMsg(JewelryMessage):
    """
 
    """
    store_name: str
    distribute_count: int
 
@dataclass
class JewelrySaleMsg(JewelryMessage):
    """
 
    """
    product_name: str
    amount: float
    store: str
 
@dataclass
class AfterSalesCareMsg(JewelryMessage):
    """
 
    """
    customer_name: str
    service_type: str
 
 
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Publish/Subscribe Pattern 发布订阅模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/23 21:17
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : exceptions.py
"""
消息模块自定义异常
"""
class PubSubException(Exception):
    """
    基础异常
    """
    pass
 
class TopicNotExistError(PubSubException):
    """
    主题不存在异常
    """
    pass
 
class SubscriberInvalidError(PubSubException):
    """
    订阅者无效异常
    """
    pass
 
 
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Publish/Subscribe Pattern 发布订阅模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/23 21:20
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : broker.py
from collections import defaultdict
from typing import Callable, Dict, List, Any
from .exceptions import SubscriberInvalidError
 
"""
企业级 Pub/Sub 消息代理(单例、线程安全、可扩展)
"""
class PubSubBroker:
    """
 
    """
    _instance = None
 
    def __new__(cls):
        # 单例模式:全局唯一消息引擎
        if cls._instance is None:
            cls._instance = super().__new__(cls)
            cls._instance.topic_subscribers: Dict[str, List[Callable]] = defaultdict(list)
        return cls._instance
 
    def subscribe(self, topic: str, callback: Callable[[Any], None]) -> None:
        if not callable(callback):
            raise SubscriberInvalidError("订阅者必须是可调用对象")
        self.topic_subscribers[topic].append(callback)
 
    def unsubscribe(self, topic: str, callback: Callable[[Any], None]) -> None:
        if callback in self.topic_subscribers[topic]:
            self.topic_subscribers[topic].remove(callback)
 
    def publish(self, topic: str, message: Any) -> None:
        subscribers = self.topic_subscribers.get(topic, [])
        if not subscribers:
            return
 
        for cb in subscribers:
            try:
                cb(message)
            except Exception as e:
                print(f"[消息引擎] 订阅者处理异常: {e}")
 
# 全局单例
broker = PubSubBroker()

订阅者服务

# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Publish/Subscribe Pattern 发布订阅模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/23 21:24
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : customer.py
from PublishSubscribePattern.domain.models import JewelryMessage
 
class CustomerSubscriber:
    """
 
    """
    @staticmethod
    def handle(message: JewelryMessage):
        print(f"👥 客户部 | 接收: {message.title} | {message.content}")
 
 
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Publish/Subscribe Pattern 发布订阅模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/23 21:21
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : finance.py
from PublishSubscribePattern.domain.models import JewelryMessage
 
class FinanceSubscriber:
    """
 
    """
    @staticmethod
    def handle(message: JewelryMessage):
        print(f"💰 财务部 | 接收: {message.title} | {message.content}")
 
 
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Publish/Subscribe Pattern 发布订阅模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/23 21:22
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : quality.py
from PublishSubscribePattern.domain.models import JewelryMessage
 
class QualitySubscriber:
    @staticmethod
    def handle(message: JewelryMessage):
        print(f"🔍 质检部 | 接收: {message.title} | {message.content}")
 
 
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Publish/Subscribe Pattern 发布订阅模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/23 21:23
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : sales.py
from PublishSubscribePattern.domain.models import JewelryMessage
 
class SalesSubscriber:
    """
 
    """
    @staticmethod
    def handle(message: JewelryMessage):
        print(f"🛍️ 营销部 | 接收: {message.title} | {message.content}")
 
 
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Publish/Subscribe Pattern 发布订阅模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/23 21:23
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : store.py
from PublishSubscribePattern.domain.models import JewelryMessage
 
class StoreSubscriber:
    """
 
    """
    @staticmethod
    def handle(message: JewelryMessage):
        print(f"🏪 品牌门店 | 接收: {message.title} | {message.content}")
 
 
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Publish/Subscribe Pattern 发布订阅模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/23 21:25
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : tech.py
from PublishSubscribePattern.domain.models import JewelryMessage
 
class TechSubscriber:
    """
 
    """
 
    @staticmethod
    def handle(message: JewelryMessage):
        print(f"🔧 资讯科技部 | 接收: {message.title} | {message.content}")
 
 
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Publish/Subscribe Pattern 发布订阅模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/23 21:21
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : warehouse.py
from PublishSubscribePattern.domain.models import JewelryMessage
 
class WarehouseSubscriber:
    """
 
    """
    @staticmethod
    def handle(message: JewelryMessage):
        print(f"🏬 仓库部 | 接收: {message.title} | {message.content}")


发布者服务

# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Publish/Subscribe Pattern 发布订阅模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/23 21:34
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : after_sales.py
from PublishSubscribePattern.messaging.broker import broker
from PublishSubscribePattern.config.topics import Topic
from PublishSubscribePattern.domain.models import AfterSalesCareMsg
 
class AfterSalesPublisher:
    """
 
    """
 
    @staticmethod
    def publish(customer_name: str, service_type: str):
        msg = AfterSalesCareMsg(
            title="客户售后保养申请",
            content=f"客户{customer_name}申请{service_type}服务,已受理",
            department="客服部",
            customer_name=customer_name,
            service_type=service_type
        )
        print(f"\n📢 发布: {Topic.AFTER_SALES_CARE}")
        broker.publish(Topic.AFTER_SALES_CARE, msg)
 
 
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Publish/Subscribe Pattern 发布订阅模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/23 21:33
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : distribution.py
from PublishSubscribePattern.messaging.broker import broker
from PublishSubscribePattern.config.topics import Topic
from PublishSubscribePattern.domain.models import StoreDistributionMsg
 
class DistributionPublisher:
    """
 
    """
    @staticmethod
    def publish(store_name: str, distribute_count: int):
        msg = StoreDistributionMsg(
            title="门店铺货完成",
            content=f"向{store_name}铺货{distribute_count}件珠宝,已出库发货",
            department="仓库部",
            store_name=store_name,
            distribute_count=distribute_count
        )
        print(f"\n📢 发布: {Topic.STORE_DISTRIBUTION}")
        broker.publish(Topic.STORE_DISTRIBUTION, msg)
 
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Publish/Subscribe Pattern 发布订阅模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/23 21:32
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : inspection.py
from PublishSubscribePattern.messaging.broker import broker
from PublishSubscribePattern.config.topics import Topic
from PublishSubscribePattern.domain.models import QualityInspectionMsg
 
class InspectionPublisher:
    """
 
    """
 
    @staticmethod
    def publish(qualified_count: int, has_certificate: bool):
        cert_str = "已出具证书" if has_certificate else "未出具证书"
        msg = QualityInspectionMsg(
            title="珠宝质量检测完成",
            content=f"总计{qualified_count}件珠宝,全部合格,{cert_str}",
            department="质检部",
            qualified_count=qualified_count,
            has_certificate=has_certificate
        )
        print(f"\n📢 发布: {Topic.QUALITY_INSPECTION}")
        broker.publish(Topic.QUALITY_INSPECTION, msg)
 
 
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Publish/Subscribe Pattern 发布订阅模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/23 21:27
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : production.py
from PublishSubscribePattern.messaging.broker import broker
from PublishSubscribePattern.config.topics import Topic
from PublishSubscribePattern.domain.models import JewelryProductionMsg
 
class ProductionPublisher:
    """
 
    """
 
    @staticmethod
    def publish(product_type: str, count: int):
        msg = JewelryProductionMsg(
            title="珠宝生产完成",
            content=f"{product_type}{count}件,待质检",
            department="生产部",
            product_count=count,
            product_type=product_type
        )
        print(f"\n📢 发布: {Topic.JEWELRY_PRODUCTION}")
        broker.publish(Topic.JEWELRY_PRODUCTION, msg)
 
 
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Publish/Subscribe Pattern 发布订阅模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/23 21:27
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : purchase.py
from PublishSubscribePattern.messaging.broker import broker
from PublishSubscribePattern.config.topics import Topic
from PublishSubscribePattern.domain.models import RawMaterialPurchaseMsg
 
class PurchasePublisher:
    """
 
    """
 
    @staticmethod
    def publish(material: str, quantity: str):
        msg = RawMaterialPurchaseMsg(
            title="原材料采购完成",
            content=f"{material} {quantity},待入库",
            department="采购部",
            material=material,
            quantity=quantity
        )
        print(f"\n📢 发布: {Topic.RAW_MATERIAL_PURCHASE}")
        broker.publish(Topic.RAW_MATERIAL_PURCHASE, msg)
 
 
# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Publish/Subscribe Pattern 发布订阅模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/23 21:33
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : sale.py
from PublishSubscribePattern.messaging.broker import broker
from PublishSubscribePattern.config.topics import Topic
from PublishSubscribePattern.domain.models import JewelrySaleMsg
 
class SalePublisher:
    """
 
    """
    @staticmethod
    def publish(product_name: str, amount: float, store: str):
        msg = JewelrySaleMsg(
            title="珠宝销售成功",
            content=f"{store}售出{product_name},收款{amount:.2f}元,库存已扣减",
            department="门店",
            product_name=product_name,
            amount=amount,
            store=store
        )
        print(f"\n📢 发布: {Topic.JEWELRY_SALE}")
        broker.publish(Topic.JEWELRY_SALE, msg)

调用:

# encoding: utf-8
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:Publish/Subscribe Pattern 发布订阅模式
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : PyCharm 2024.3.6 python 3.11
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/6/23 21:29
# User      :  geovindu
# Product   : PyCharm
# Project   : pydesginpattern
# File      : PublishSubscribeBll.py
from PublishSubscribePattern.messaging.broker import broker
from PublishSubscribePattern.config.topics import Topic
 
# 订阅者
from PublishSubscribePattern.service.subscribers.warehouse import WarehouseSubscriber
from PublishSubscribePattern.service.subscribers.finance import FinanceSubscriber
from PublishSubscribePattern.service.subscribers.quality import QualitySubscriber
from PublishSubscribePattern.service.subscribers.sales import SalesSubscriber
from PublishSubscribePattern.service.subscribers.store import StoreSubscriber
from PublishSubscribePattern.service.subscribers.customer import CustomerSubscriber
from PublishSubscribePattern.service.subscribers.tech import TechSubscriber
 
# 发布者
from PublishSubscribePattern.service.publishers.purchase import PurchasePublisher
from PublishSubscribePattern.service.publishers.production import ProductionPublisher
from PublishSubscribePattern.service.publishers.inspection import InspectionPublisher
from PublishSubscribePattern.service.publishers.distribution import DistributionPublisher
from PublishSubscribePattern.service.publishers.sale import SalePublisher
from PublishSubscribePattern.service.publishers.after_sales import AfterSalesPublisher
 
 
class PublishSubscribeBll(object):
    """
 
    """
 
    def register_subscribers(self):
        """统一注册订阅者"""
        broker.subscribe(Topic.RAW_MATERIAL_PURCHASE, WarehouseSubscriber.handle)
        broker.subscribe(Topic.RAW_MATERIAL_PURCHASE, FinanceSubscriber.handle)
 
        broker.subscribe(Topic.JEWELRY_PRODUCTION, QualitySubscriber.handle)
        broker.subscribe(Topic.JEWELRY_PRODUCTION, WarehouseSubscriber.handle)
 
        broker.subscribe(Topic.QUALITY_INSPECTION, SalesSubscriber.handle)
        broker.subscribe(Topic.QUALITY_INSPECTION, WarehouseSubscriber.handle)
        broker.subscribe(Topic.QUALITY_INSPECTION, FinanceSubscriber.handle)
 
        broker.subscribe(Topic.STORE_DISTRIBUTION, StoreSubscriber.handle)
        broker.subscribe(Topic.STORE_DISTRIBUTION, SalesSubscriber.handle)
 
        broker.subscribe(Topic.JEWELRY_SALE, FinanceSubscriber.handle)
        broker.subscribe(Topic.JEWELRY_SALE, WarehouseSubscriber.handle)
 
        broker.subscribe(Topic.AFTER_SALES_CARE, CustomerSubscriber.handle)
        broker.subscribe(Topic.AFTER_SALES_CARE, TechSubscriber.handle)
 
    def demo(self):
        """
 
        :return:
        """
        print("=" * 70)
        print("珠宝企业 - 企业级发布/订阅系统启动")
        print("=" * 70)
 
        # 1. 注册订阅
        self.register_subscribers()
 
        # 2. 执行业务流程
        PurchasePublisher.publish("18K金+钻石", "500克+100颗")
        ProductionPublisher.publish("钻石戒指+金项链", 80)
        InspectionPublisher.publish(80, True)
        DistributionPublisher.publish("北京/上海门店", 80)
        SalePublisher.publish("钻石戒指", 12800.0, "上海店")
        AfterSalesPublisher.publish("张先生", "钻石清洗保养")
 
        # 3. 测试取消订阅
        print("\n--- 取消仓库订阅销售主题 ---")
        broker.unsubscribe(Topic.JEWELRY_SALE, WarehouseSubscriber.handle)
        SalePublisher.publish("金项链", 3800.0, "北京店")


输出:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值