这个想法是将消息发送到主题并通过pub / sub(没有队列)和使用PERSISTENT传送模式以条带形式消费它们。为简单起见,假设生产者将消息发布到具有以下层次结构的特定主题:bus/<componentId/<transactionId>
。
消费者希望收到主题“条纹”,为简单起见,我们假设有10个消费者,他们希望通过transactionId在他们自己之间划分流量:
bus/*/0*
bus/*/1*
bus/*/9*
当我尝试使用通配符订阅主题端点时,如下所示:
DurableTopicEndpoint topicEndpoint = JCSMPFactory.onlyInstance().createDurableTopicEndpoint("bus/*/1*");
ConsumerFlowProperties propsFlow = new ConsumerFlowProperties();
propsFlow.setEndpoint(topicEndpoint);
我得到以下异常:
Exception in thread "main" java.lang.IllegalArgumentException: Topic Endpoint name "bus/*/1*" contains illegal character [*]
at com.solacesystems.common.util.DestinationUtil.isValidEndpointName(DestinationUtil.java:234)
at com.solacesystems.common.util.DestinationUtil.isValidTopicEndpointPhysicalName(DestinationUtil.java:209)
at com.solacesystems.common.util.DestinationUtil.isValidDTEPhysicalName(DestinationUtil.java:213)
at com.solacesystems.jcsmp.impl.SessionModeSupport.createFlow(SessionModeSupport.java:247)
at com.solacesystems.jcsmp.impl.SessionModeSupport.createFlow(SessionModeSupport.java:170)
at com.solacesystems.jcsmp.impl.JCSMPBasicSession.createFlow(JCSMPBasicSession.java:953)
根据这个article的“向主题端点添加订阅”一节 - 是否可以使用Solace Java API?
答案 0 :(得分:1)
这里有两个问题。
您正在尝试创建名为TopicEndpoint
的{{1}}。请注意,这是bus/*/1*
的名称,而不是它订阅的主题。 TopicEndpoint
不是*
。
TopicEndpoint
只允许订阅一次。这意味着您只能订阅TopicEndpoints
。如果您想要bus/*/0*
一直订阅bus/*/0*
,则需要使用bus/*/9*
代替Queue
。