2017-03-07 58 views
3

我能寫多種類型的實例給定的目的地,如:將@JmsListener與多個有效內容類型用於相同的目的地?

JmsTemplate template = ... 
Alpha alpha = new Alpha(...); 
Beta beta = new Beta(...); 

template.convertAndSend("my-destination", alpha); 
template.convertAndSend("my-destination", beta); 

我當時認爲我能夠提供多種@JmsListener註解的方法接收不同的消息負載 - 像這樣:

@JmsListener(destination = "my-destination") 
public void receiveAlpha(Alpha alpha) { ... } 

@JmsListener(destination = "my-destination") 
public void receiveBeta(Beta beta) { ... } 

但如果我試試這個,我得到的PayloadArgumentResolver.resolveArgument例外,因爲它不能區分Beta值應該被髮送到一個方法和Alpha值到另一個。

我該如何處理?正如我編碼的有效載荷類型的消息屬性我可以指定一個選擇得到的東西,像這樣的工作:

@JmsListener(destination = "my-destination", selector = "_type = 'Alpha'") 
public void receiveAlpha(Alpha alpha) { ... } 

@JmsListener(destination = "my-destination", selector = "_type = 'Beta'") 
public void receiveBeta(Beta beta) { ... } 

但隨着春天做各種聰明的幕後我很驚訝我已經幫它顯然是這樣的。

有沒有更隱含/更好的方法來做到這一點?

回答

1

JmsListener不支持路由 - 每個註釋的方法都有自己的偵聽器容器。

唯一的另一種替代方法是使用...(Object object)並向下傾倒。

1

嘗試在消息後處理器中設置選擇器屬性。在使用方法中使用與選擇器相同的屬性。檢查這個JMSListener selector not working

要發送到隊列:

template.convertAndSend("my-destination", alpha, m -> { 
     m.setStringProperty("classType", "alpha"); 
     return m; 
    }); 



舉消息從隊列:

@JmsListener(destination = "my-destination", selector = "classType = 'alpha'")<br/> 
    public void receiveAlpha(Alpha alpha) { ... } 
相關問題