0
我有一個JMS生產者發送2種消息:業務邏輯和心跳信息。目前,兩者都由同一個接收器處理,但我現在正在嘗試通過使用選擇器爲每個接收器分配專用類。我遇到的問題是每當將選擇器添加到接收器時,它都會停止接收消息。這是我到目前爲止。爲簡單起見,我只增加了心臟的跳動代碼:JMSListener選擇器不工作
要發送信息,我有這樣的:
private void sendHeartBeat() {
this.buildTemplate().send(new HeartbeatMessageCreator(this.someId));
}
private JmsTemplate buildTemplate() {
if (this.cachedJmsTemplate == null) {
final ActiveMQTopic activeMQTopic = new ActiveMQTopic(this.topic);
this.cachedJmsTemplate = new JmsTemplate(this.config.getCachedConnectionFactory());
this.cachedJmsTemplate.setDefaultDestination(activeMQTopic);
this.cachedJmsTemplate.setPubSubDomain(true);
}
return this.cachedJmsTemplate;
}
HeartbeatMessageCreator:
class HeartbeatMessageCreator implements MessageCreator {
private final String someID;
HeartbeatMessageCreator(final String someID) {
this.someID = someID;
}
@Override
public Message createMessage(final Session session) throws JMSException {
final Serializable message = new ZHeartBeat(this.someID);
final Message jmsMessage = session.createObjectMessage(message);
jmsMessage.setJMSType(message.getClass().getName());
jmsMessage.setStringProperty("InternalMessageType", "HeartBeat"); // <-- Setting my separator here
return jmsMessage;
}
消費情況如下:
@Component
public class MyListener {
@JmsListener(destination = "${myTopic}", containerFactory = "myJmsContainer", selector = "InternalMessageType = 'HeartBeat'")
public final void onMessage(final Message message) {
...
}
}
在此配置中,消費者從未看到消息進入,但如果我刪除了sele ctor部分來自@JmsListener註釋,它們被交付。我不確定我在這裏做錯了什麼。任何想法 ?
你是絕對正確的。我在我的案例中發現了這個問題:在生產者和消費者之間有一個組件,它應該簡單地轉發消息。但是它的完成方式意味着消息屬性沒有達到最終目的地。 Thx爲你的時間。 –