将spring integration jms消息发送到特定队列(动态)

时间:2015-03-26 09:58:26

标签: spring jms spring-integration messaging spring-jms

一个简单的消息发布者看起来像:

@Service("myPublisher")
public class MyPublisher{

   @Publisher(channel = "myChannel")
   public Message<?> sendMessage (Message<?> message) {
      return message;
   }
}

...并且配置如下:

<int:channel id="myChannel"/>   
<int-jms:outbound-channel-adapter channel="myChannel" destination="defaultDestination" session-transacted="true"/>
<bean class="org.springframework.integration.aop.PublisherAnnotationBeanPostProcessor"/>

问题是,此发布者将消息发送给准备好的defaultDestination,但我需要将消息发送到不同的队列。就我而言,我需要一个消息队列来处理我的应用程序中的每个任务。原因是,如果我想中止任务,我必须从代​​理中删除消息。如果一个任务有数千条消息,则使用选择器接收所有消息不是一个好习惯。我需要从消息代理中删除已中止任务的所有消息,而不接收客户端。 JMS仅支持发送和接收消息。我必须使用代理API(QPID)来删除消息。问题是,QPID不支持选择器删除消息,但它支持删除队列。

我想,我需要一个PublisherFactory,其功能如下:

public class PublisherFactory {
    public MyPublisher getPublisher(String destinationName){...};
}

factory.getPublisher("testQueue");

此方法应返回向testQueue发送邮件的发布商。

或具有以下功能的服务:

public class PublisherService {
    public Message<?> sendMessage(Message<?> message, String desinationName){...};
}

service.sendMessage(new Message("test"), "testQueue");

简而言之,我想要的只是一个将Message发送到特定目的地的服务。目标名称应设置为方法调用的参数或工厂的类变量。

我希望,有人能解决我的问题。谢谢:))

1 个答案:

答案 0 :(得分:1)

<int-jms:outbound-channel-adapter>不仅可以配置为静态destination,还可以使用一些动态行为在运行时使用SpEL对请求消息确定destination

destination-expression="headers.destination"

从另一方@Publisher开始,AOP允许构建一条消息,不仅可以将payload默认发布为return值,还可以使用更智能的逻辑。例如:

@Publisher(channel="annotationConfigRegistrationTest")
@Payload("#return + #args.lname")
public String setName(String fname, String lname, @Header("x") int num) {
    return fname + " " + lname;
}

在这种情况下,要发布的消息将具有payload类似的返回值,以及lname参数。 @Header("x")会在x标题中填充num作为值的sendMessage

由于您的Message<?>方法会返回整个destination,因此您只需在那里构建一条新消息,并根据当前状态的内容添加上面提到的{{1}}标题。

HTH