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

Spring可能会导致ActiveMQ/JMS消息头丢失

贺皓
2023-03-14

版本:

  • SpringBoot: 2.3.12。发布
  • SpringCloud:Hoxton。SR12
  • SpringCloud Starter Sleuth: 3.0.3
  • 骆驼: 3.4.6

我想将Sleuth添加到一个预先存在的项目中,该项目现在使用ActiveMQ,以前它使用JMS。当我这样做时,ActiceMQ消息中的值会被阻止/删除(其中一个是“filename”,它是S2请求的键值)。其他JMS值似乎仍然通过OK。

我需要理解为什么非JMS值会被阻止/删除(我找不到任何关于导致这种情况发生的原因的信息),以防止错误发生。

我知道我可以用spring解除JMS的Sleuth。侦探。信息。jms。enabled=true但向前看,我希望能够跟踪ActiveMQ/JMS代码,这样解决方案就不会特别吸引人了。

由于这是预先退出的代码,我还希望尽可能避免重新编写它。

有没有人让SpringCloudSleuth与ActiveMQ/JMS合作,并指出哪里出了问题?

编辑:

根据Marcin的初始响应,我们发现以下版本

  • SpringBoot: 2.4.8
  • SpringCloud: 2020.0.3
  • 骆驼: 3.7.5

没有侦探

日志消息(文件名,CamelAwsS3Etag等):

2021-08-16 10:10:37.889  INFO [MyApp,,] 28775 --- [umer[taskQueue]] taskQueueConsumer: ***HEADERS IN***: {CamelAwsS3ETag=39d029a87fa4c6aaee5f1de643d9f3f6, Content-Type=application/json, filename=_bl001/group0/_bl001-group0-1629104686042.zip, JMSCorrelationID=null, JMSCorrelationIDAsBytes=null, JMSDeliveryMode=2, JMSDestination=queue://taskQueue, JMSExpiration=0, JMSMessageID=ID:server-44053-1629104652998-1:3:1:1:1, JMSPriority=4, JMSRedelivered=false, JMSReplyTo=null, JMSTimestamp=1629104686350, JMSType=null, JMSXGroupID=_bl001-group0, JMSXGroupSeq=0, JMSXUserID=null}

和侦探在一起

日志消息(“文件名”、“CamelAwsS3Etag”等缺失):

2021-08-16 10:24:33.821  INFO [MyApp,,] 31553 --- [umer[taskQueue]] taskQueueConsumer: ***HEADERS IN***: {JMSCorrelationID=null, JMSCorrelationIDAsBytes=null, JMSDeliveryMode=2, JMSDestination=queue://taskQueue, JMSExpiration=0, JMSMessageID=ID:server-42561-1629105658959-1:3:1:1:1, JMSPriority=4, JMSRedelivered=false, JMSReplyTo=null, JMSTimestamp=1629105675306, JMSType=null, JMSXGroupID=_bl000-group1, JMSXGroupSeq=0, JMSXUserID=null}

示例Java代码

@Component
public class MyAppCoreRouter extends RouteBuilder {

    /* Other code */

    @Override
    public void configure() {
        from("activemq:queue:taskQueue?concurrentConsumers=" + taskNumberOfConcurrentConsumers)
                .log("***HEADERS IN***: ${headers}")
                .routeId("taskQueueConsumer")
                .threads(taskNumberOfConcurrentConsumers)
                .pollEnrich().simple("aws-s3://myapp-task?amazonS3Client=#amazonS3Client&fileName=${header.filename}&operation=getObject")
                .choice()
                .when(header(S3Constants.KEY).endsWith(".zip"))
                .to("file://" + taskLocalUnCompressedEndpoint + "?fileName=${header.CamelAwsS3ETag}/${header.CamelAwsS3Key}")
                .process(exchange -> {
                    String camelAwsS3ETag = exchange.getIn().getHeader("CamelAwsS3ETag", String.class);
                    String camelAwsS3Key = exchange.getIn().getHeader("CamelAwsS3Key", String.class);
                    File uniqueDir = new File(taskLocalUnCompressedEndpoint, camelAwsS3ETag);
                    File taskZip = new File(uniqueDir, camelAwsS3Key);
                    new ZipFile(taskZip).extractAll(uniqueDir.getAbsolutePath());
                })
                .setHeader("resourceDirectory", simple(taskLocalUnCompressedEndpoint + "/${header.CamelAwsS3ETag}")).setHeader("schedule.time", simple("${date:now}"))
                .removeHeader("CamelAwsS3Headers")
                .log(LoggingLevel.DEBUG, "Processing batch job ${headers}")
                .to("spring-batch:importMyAppRecordJob")
                .endChoice()
                .otherwise()
                .log(LoggingLevel.WARN, "Unexpected file type, filtering file name ${header.CamelAwsS3Key} ")
                .end();

        /* Other code */
    }
}

共有1个答案

叶茂才
2023-03-14

您使用了错误的Boot、Cloud和Sleuth版本。使用Sleuth 3.0。x您需要使用云2020.0。x和Boot 2.4。x或2.5。十、

 类似资料:
  • 我错过了什么? AMQ版本5.13.2 Java 1.8.0\u 74 Windows 10 给定一个简单的测试用例,传输两条Object消息,一条带有数据,另一条是数据结束标记。只有数据结束标记被接收。 队列在作业开始时创建,并在作业完成后销毁。 如果我运行更多的事务,我会看到大约50%的接收率。 日志清楚地显示接收器在第一条消息被放入队列之前就已启动,两条消息都被放入队列,但实际上只有第二条消

  • spring XML中的jmsTemplate定义: 有人对问题有什么建议吗/关于如何实现延迟消息传递的其他想法?谢了!

  • 我有一个Spring JMS应用程序,它有一个JMS侦听器,在应用程序启动时连接到活动的MQ队列。这个JMS侦听器是an应用程序的一部分,该应用程序接收消息,用内容丰富消息,然后将消息传递给同一个ActiveMQ代理上的主题。 SessionTransact设置为true。我没有执行任何数据库事务,所以我没有@Transactional设置。从我所读到的内容来看,SessionTransact属性

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

  • 正常的在均衡比如:增加消费者或者增加分区,没有宕机的事故,会不会导致消息丢失或者重复消费呢? 我记得在均衡时会强制消费者提交偏移量,应该不会出现上述问题把?

  • 问题内容: 有没有一种方法可以抑制ActiveMQ服务器上定义的队列上的重复消息? 我尝试手动定义JMSMessageID((message.setJMSMessageID(“ uniqueid”)),但是服务器忽略此修改并使用内置的JMSMessageID传递消息。 根据规范,我没有找到有关如何删除邮件重复数据的参考。 在HornetQ中,要解决此问题,我们需要在消息定义中声明HQ特定的属性or