我可以将多种类型的实例写入给定的目的地,例如:
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) { ... }
但是由于 Spring 在幕后做了各种聪明的事情,我很惊讶我必须像这样明确地帮助它。
是否有更隐式/更好的方法来做到这一点?
最佳答案
JmsListener
不支持方法路由 - 每个带注释的方法都有自己的监听器容器。
唯一的替代方法是使用 ...(Object object)
并让自己沮丧。
关于java - 将@JmsListener 与多个负载类型一起用于同一目的地?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42656519/