将@JmsListener与多个有效负载类型一起用于同一目的地?

Geo*_*ins 5 java spring jms spring-jms

我可以将多种类型的实例写入给定的目的地,例如:

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

template.convertAndSend("my-destination", alpha);
template.convertAndSend("my-destination", beta);
Run Code Online (Sandbox Code Playgroud)

我以为我可以提供多种带@JmsListener注释的方法来接收不同的消息有效负载,如下所示:

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

@JmsListener(destination = "my-destination")
public void receiveBeta(Beta beta) { ... }
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试这种方法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) { ... }
Run Code Online (Sandbox Code Playgroud)

但是当Spring在幕后做各种聪明事时,我很惊讶我必须像这样明确地帮助它。

有没有更含蓄/更好的方式来做到这一点?

Gar*_*ell 3

JmsListener不支持方法路由 - 每个带注释的方法都有自己的侦听器容器。

唯一的选择就是利用...(Object object)和贬低自己。