现在,我们发布到常规主题,并能够使用虚拟主题中的消息。是合法的方式吗?
不幸的是,从docs尚不清楚此方法的正确性。
但是,我们注意到一些odd behaviour。
如果还可以,那么我们现在就想使用它。否则,我们需要在所有队列中更改主题名称,以确保在没有待处理消息之前。
答案 0 :(得分:0)
好的,我在Active MQ in Action这本书中找到了答案:
需要一些命名约定才能允许虚拟主题 正确操作。首先,确定主题将被视为 虚拟主题,主题名称应始终遵循以下模式
pub struct Template { encoder: Box<Encoder> } impl Template { fn new(encoder: Box<Encoder>) -> Template { Template { encoder } } fn encoder(&self) -> &Box<Encoder> { &self.encoder } } pub trait Encoder { fn isEncoder(&self) -> bool { true } } pub struct FixedEncoder { length: usize } impl FixedEncoder { pub fn new(length: usize) -> FixedEncoder { FixedEncoder { length } } pub fn length(&self) -> usize { self.length } } impl Encoder for FixedEncoder {} fn main() { let fixed_encoder = FixedEncoder::new(1); let template = Template::new(Box::new(fixed_encoder)); assert_eq!(template.encoder().isEncoder(), true); // works assert_eq!(&template.encoder().length(), 1); // error[E0599]: no method named `length` found for type `&std::boxed::Box<(dyn Encoder + 'static)>` in the current scope }
。因此,如果您想创建一个虚拟主题 对于名称为orders的主题,您需要创建一个目标 名称为VirtualTopic.<topic name>
。这意味着发布者发送 消息发送到名为VirtualTopic.orders
的主题。为了消费 从虚拟主题支持的队列中,消费者必须 订阅名称遵循模式的队列VirtualTopic.orders
。