将 spring 集成 jms 消息发送到特定队列(动态)
Sending spring integration jms message to specific queue (dynamically)
一个简单的消息发布器如下所示:
@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");
此方法应该 return 将消息发送到 testQueue
的发布者。
或者具有如下功能的服务:
public class PublisherService {
public Message<?> sendMessage(Message<?> message, String desinationName){...};
}
service.sendMessage(new Message("test"), "testQueue");
简而言之,我想要的是一种将 Message
发送到特定目的地的服务。目标名称应设置为方法调用的参数或工厂的 class 变量。
我希望有人能解决我的问题。谢谢:)
<int-jms:outbound-channel-adapter>
不仅可以配置为静态 destination
,还可以配置一些动态行为来确定 destination
在运行时使用 SpEL 针对请求消息。
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
类似 return 的值,外加一个 lname
参数。
@Header("x")
将向该消息填充一个 x
header,其中 num
作为值。
因为你的 sendMessage
方法 return 是完整的 Message<?>
,你只需要在那里建立一个新消息并添加上面提到的 destination
header,基于当前状态的东西。
HTH
一个简单的消息发布器如下所示:
@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");
此方法应该 return 将消息发送到 testQueue
的发布者。
或者具有如下功能的服务:
public class PublisherService {
public Message<?> sendMessage(Message<?> message, String desinationName){...};
}
service.sendMessage(new Message("test"), "testQueue");
简而言之,我想要的是一种将 Message
发送到特定目的地的服务。目标名称应设置为方法调用的参数或工厂的 class 变量。
我希望有人能解决我的问题。谢谢:)
<int-jms:outbound-channel-adapter>
不仅可以配置为静态 destination
,还可以配置一些动态行为来确定 destination
在运行时使用 SpEL 针对请求消息。
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
类似 return 的值,外加一个 lname
参数。
@Header("x")
将向该消息填充一个 x
header,其中 num
作为值。
因为你的 sendMessage
方法 return 是完整的 Message<?>
,你只需要在那里建立一个新消息并添加上面提到的 destination
header,基于当前状态的东西。
HTH