gpt4 book ai didi

java - 是否可以使用 Spring 配置在运行时设置 JMS 监听器目标

转载 作者:行者123 更新时间:2023-12-01 16:39:21 24 4
gpt4 key购买 nike

我们在 Spring 应用程序中使用 ActiveMQ,并且我正在设置使用基于定义要发送的数据的类名的虚拟主题的设计。所以如果我有课

public class SomeEvent implements JmsEvent<SomeEvent> {
...
}

其中JmsEvent是一个帮助器接口(interface),用于将实现类转换为Message,我有另一个类将通过可配置的覆盖来确定目标名称

public class DestinationNameHelper {
private Map<Class<?>, String> overrides;
...
public String getDestinationName(Class<?> type) {
return overrides.getOrDefault(type, type.getSimpleName());
}
}

这对于 JmsTemplate 效果很好,其中为每条发送的消息传递目标名称。我有一个类将 VirtualTopic. 添加到结果中,因此,如果您调用 publisher.publish(someEvent) ,则发送 SomeEvent 的实际目的地将是是VirtualTopic.SomeEvent

我想做的是为听众使用相同类型的东西,所以如果我有

public class SomeEventListener extends BaseMessageListener<SomeEvent> {
public void handleMessage(Message message) {}
}

我希望能够自动将其设置为监听目标 Consumer.SomeEventListener.VirtualTopic.SomeEvent,目前正在手动将其输入到 XML 配置文件中。让监听器类名可重写会很好,但我至少希望通过 DestinationNameHelper 检索虚拟主题名称(即 SomeEvent),以便监听器配置如果我们覆盖类的目标名称,则不必更改。

例如如果我们将 (SomeEvent.class, "OverrideName") 添加到 DestinationNameHelper 中的覆盖映射,则类 SomeEvent 的消息应发布于

VirtualTopic.OverrideName

监听者应该监听

Consumer.SomeEventListener.VirtualTopic.OverrideName

我无法弄清楚在 XML 配置中执行此操作的 SPEL 咒语,并且由于目标是使用 JmsListenerConfigurer 获得基于类名的目标名称,因此可能超出了范围。

有办法实现我想要的配置吗?

[编辑]我的配置看起来像这样:

<bean id="someEventListenerBean" class="com.example.SomeEventListener"/>
<bean id="someEventListener" class="org.springframework.jms.listener.adapter.MessageListenerAdapter">
<constructor-arg>
<bean class="com.example.SomeEventListener"/>
</constructor-arg>
<property name="messageConverter">
<null/>
</property>
</bean>

<jms:listener-container connection-factory="jmsConnectionFactory" acknowledge="transacted" concurrency="2-5">
<jms:listener destination="Consumer.SomeEventListener.VirtualTopic.Somevent" ref="testListener"/>
</jms:listener-container>

最佳答案

感谢贾斯汀和加里作为橡皮鸭。澄清并发布我的配置帮助我找到了答案,尽管它可能可以优化。

我修改了监听器接口(interface)以包含

Class<T> getEventType();

因此所有实现类都必须返回它们正在处理的类类型。然后我创建了一个类似的类

public class ListenerDestinationHelper {

private final DestinationHelper destinationHelper;

public ListenerDestinationHelper(DestinationHelper destinationHelper) {
this.destinationHelper = destinationHelper;
}

public <E extends JmsEvent<E>, M extends Message, T extends JmsEventListener<E, M>> String getDestinationName(T listener) {
final Class<E> eventClass = listener.getEventType();
return "Consumer." + listener.getClass().getSimpleName() + ".VirtualTopic." + destinationNameFactory.getDestinationBaseName(eventClass);
}

}

现在配置包括

<bean id="listenerDestinationHelper" class="com.example.ListenerDestinationHelper"/>

<jms:listener-container connection-factory="jmsConnectionFactory" acknowledge="transacted" concurrency="2-5">
<jms:listener destination="#{listenerDestinationHelper.getDestinationName(someEventListenerBean)}" ref="testListener"/>
</jms:listener-container>

从这里开始,为监听器类简单名称添加覆盖将变得很简单

关于java - 是否可以使用 Spring 配置在运行时设置 JMS 监听器目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61897637/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com