当前位置: 首页 > 知识库问答 >
问题:

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

马哲
2023-03-14

简单的消息发布器如下所示:

@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"/>

问题是,此发布服务器将消息发送到准备好的默认目标,但我需要将消息发送到不同的队列。在我的情况下,我的应用程序中的每个任务都需要一个消息队列。原因是,如果要中止任务,必须从代理中删除消息。如果一个任务有数千条消息,那么使用选择器接收所有消息不是一个好的做法。我需要从消息代理中删除中止任务的所有消息,而不接收客户端。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");

简而言之,我想要的就是一个服务,它可以向特定的目的地发送一条消息。目标名称应设置为方法调用上的参数或工厂上的类变量。

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

共有1个答案

巩光誉
2023-03-14

<代码>

destination-expression="headers.destination"

从另一边@Publisher的AOP允许构建消息以发布,默认情况下,不仅使用有效负载作为返回值,而且使用更智能的逻辑。例如:

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

在这种情况下,要发布的消息将有一个类似有效负载的返回值,加上一个lname参数。标题(“x”)将向该消息填充一个标题,标题的值为num

由于您的sendMessage方法返回整个消息

HTH

 类似资料:
  • 我是Spring JMS的新手。我的应用程序是使用Spring Boot开发的,并部署在JBoss EAP7.2.0中。我有一个远程队列,它是一个活动的MQ Artemis队列,也嵌入在JBoss EAP7.2.0中。有人能建议我如何使用Spring Boot的JmsTemplate向远程JMS队列发送消息吗?基本上,我不知道应该如何定义远程connectionFactory来连接到远程队列。

  • 我设置了一个EJB项目,使用JMS将持久性实体对象发送到MDB。我使用JBoss EAP 7,使用Apache ActiveMQ作为消息传递提供程序。我像这样设置ConnectionFactory和队列: 这是我的消息生成器,它接收“Account”实体对象作为参数并将其发送到队列: EntityEnqueueBean。Java语言 MDB从队列接收消息并对其进行处理: java账户 不确定我做错

  • 在Spring集成中使用出站网关时,我试图在JMS标头中发送回复Q详细信息。我了解到JIRA#INT-97中的增强功能在将Spring消息标头发送到JMS目标之前将其复制到JMS标头。 在将消息发送到出站网关之前,将消息头设置如下。message.getHeader(). setAtcm(JmsTargetAdapter.JMS_REPLY_TO, myReplyDestation); 但是我无法

  • 我正在使用Spring4.3.5.Release和ActiveMQ5.14.3来处理消息队列。 下面是我的单元测试: 这个测试工作得很好,并且消息会正确地进入队列! 因为单元测试是事务性的,所以我希望当测试结束时,消息会从队列中回滚,但似乎并非如此。 我知道这是一个“集成”测试,因为它实际上是接触ActiveMQ服务器并将消息放入队列。 那么,我如何使这真正事务性,使我刚刚放在队列上的消息真的在它

  • 我正在开发一个使用Spring Boot版本2.0.4的Java应用程序。RELEASE和RabbitMQ版本3.7.7。该应用程序正在Redis数据库中缓存RabbitMQ中的所有消息,并且在RabbitMQ中创建新队列时必须重新发送。目前,我设法使用Event Exchange Plugin和队列名称捕获了队列创建。我正在使用AMQP出站适配器将消息发送回RabbitMQ。 流出 我可以使用r

  • 问题内容: 我试图将字符串消息发送到在weblogic服务器中创建的JMS队列中。我使用Eclipse IDE,当我运行Web应用程序时,出现以下错误,tomcat服务器关闭。错误是 请帮助我。谢谢和最诚挚的问候 问题答案: 基于对该问题的一些快速研究,它似乎是由于在应用服务器和客户端之间使用不同的JDK级别引起的。我看到的大多数示例都表明,在Java 5上运行Weblogic时在客户端上使用Ja