2017-03-07 30 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) { ... } 
相关问题