在创建动态控制模式的MDC发布时,为了让操作系统选择端口(设置了ssc=true
),将控制端点端口设置为0
,导致没有镜像可用于间谍订阅。
复制步骤:
- 创建出版物
aeron:udp?control=localhost:0|control-mode=dynamic|ssc=true
与streamId=0
- 通过
localSocketAddresses
方法检索localAddr
出版物 - 用
streamId=0
创建订阅aeron-spy:aeron:udp?control=<localAddr>|control-mode=dynamic
期望图像可以用于订阅,但它没有发生。
如果将端口设置为静态值而不是0
或从订阅中删除前缀aeron-spy:
,则完全相同的代码可以工作。
这是我的代码重现的问题
这个问题的简单答案是发布uri和间谍uri实际上并不匹配。假设绑定的端口是32456
publication: aeron:udp?control=localhost:0|control-mode=dynamic|ssc=true
spy: aeron:udp?control=localhost:32456|control-mode=dynamic|ssc=true
给定OP的代码,端口恰好在一段时间内匹配,但是如果关闭发布并再次打开,这种关联很容易被破坏,因为端口将不同。
当使用通配符端口时,推荐使用一种方法。如果你想引用另一个发布(例如从一个间谍)或创建多个订阅到同一个通配符端口,那么使用标签是合适的解决方案:
publication: aeron:udp?control=localhost:0|control-mode=dynamic|ssc=true|tags=1001
spy: aeron-spy:aeron:udp?tags=1001