【发布时间】:2021-11-29 15:04:18
【问题描述】:
我创建了 2 个jmsTemplate Bean 以便能够相应地处理向Solace Queue 和Solace Topic 发送消息,现在当我在下面的exampleChannel 上传递消息时,我想如果MessageHandler 可以动态选择 jmsTemplate ?如果我用MessageHeader 传递消息,可以说destinationType=Topic/Queue
下面是配置
@Autowired
@Qualifier("topic")
private JmsTemplate jmsTemplate;
@Autowired
@Qualifier("queue")
private JmsTemplate jmsTemplate1;
@Bean
@ServiceActivator(inputChannel = "exampleMessageChannel" )
public MessageHandler archiveOutboundHandler() {
/*
I need to select between jmsTemplate & jmsTemplate1 on the basis on header
information.
**/
JmsSendingMessageHandler messageHandler = new JmsSendingMessageHandler(jmsTemplete);
messageHandler.setDestinationExpression(new FunctionExpression<Message<?>>(m->m.getHeaders().get("destination")));
return messageHandler;
}
有可能吗?或者有更好的方法吗?
更新 1:
@Artem 建议将destinationExpression 的实现更改为返回Destination 后,我这样做了
@Bean
@ServiceActivator(inputChannel = "outMessageChannel" )
public MessageHandler archiveOutboundHandler() {
JmsSendingMessageHandler messageHandler = new JmsSendingMessageHandler(jmsTemplate);
messageHandler.setDestinationExpression(new FunctionExpression<Message<?>>(message -> {
if((Objects.equals(message.getHeaders().get("destinationType"), "topic"))){
return (Topic) () -> (String) message.getHeaders().get("destination");
}else{
return (Queue) () -> (String) message.getHeaders().get("destination");
}
}));
return messageHandler;
}
我遇到了异常
$$Lambda$821/1572602632 cannot be cast to com.solacesystems.jms.SolDestination)
更新 2
我能够使用JndiDestinationResolver解析目的地
正如 Artem 建议使用 BeanFactoryDestinationResolver 那样,我无法使用它,因为目的地太多,BeanFactoryDestinationResolver 需要为每个目的地创建特定的 bean。
我已经配置了JndiDestinationResolver,所以我只需要注入DestinationResolver 来解析目的地。
下面是sn-p,
@Autowired
private JmsTemplate jmsTemplate;
@Autowired
private DestinationResolver destinationResolver;
@Bean
@ServiceActivator(inputChannel = "exampleChannel" )
public MessageHandler jmsOutboundHandler() {
JmsSendingMessageHandler messageHandler = new JmsSendingMessageHandler(jmsTemplate);
messageHandler.setDestinationExpression(new FunctionExpression<Message<?>>(message -> {
if(message.getHeaders().get("dest_type").equals("topic")){
return destinationResolver.resolveDestinationName(null,(String) message.getHeaders().get("dest"),true);
}else{
return destinationResolver.resolveDestinationName(null,(String) message.getHeaders().get("dest"),false);
}
}));
return messageHandler;
}
感谢所有输入,我将提出 GH 问题以在 DynamicJmsTemplate 中包含 pubsub 功能
【问题讨论】:
-
为什么需要不同的
JmsTemplate实例?它是一个无状态组件,可以为不同的用例共享。因此,您可以简单地生产到队列以及主题。请用两个不同的JmsTemplate实例详细说明您的情况 -
我正在查看一些 spring 文档,默认情况下 spring 使用 pubsub 作为 false,如果我们想发送关于需要设置为 'true' 的主题的消息,这就是我创建 2 个 bean 的原因对于主题和其他队列,你能告诉我我们如何使用相同的实例,以便它在队列和主题上产生
标签: spring-integration spring-jms