一个简单的消息发布者看起来像:
@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
发送到特定目的地的服务。目标名称应设置为方法调用的参数或工厂的类变量。
我希望,有人能解决我的问题。谢谢:))
答案 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