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

标签 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);

我想我可以提供多个 @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/

相关文章:

使用注释和全局拒绝的 Spring Security 白名单方法

java - Spring 中有多个事务管理器并在运行时选择一个

filter - JMS 选择器与单独队列

java - Java中垃圾回收的合格变量

java - 如何添加 Artifactory WAR 作为 Gradle 依赖项

java - WAS Liberty - EJB - bean 没有不带参数的公共(public)构造函数 & java.lang.NoClassDefFoundError

java - activemq中未加载页面文件异常

java - 计算 jButton 数组中的点击次数

java - 我应该使用哪种 bean 来提供对 EJB 中对象池的访问?

Java SWING : How to fix size of components in GridLayout