从一个通道接收RabbitMQ消息,在转换器中设置messageId,并使用Spring集成将其发送到另一个通道

从一个通道接收RabbitMQ消息,在转换器中设置messageId,并使用Spring集成将其发送到另一个通道,rabbitmq,spring-integration,Rabbitmq,Spring Integration,我是RabbitMQ和Spring集成的新手 我有一个用例来使用来自通道的JSON消息,并将其转换为对象。我需要在对象中设置的一个字段是我们从rabbitMQ接收的消息的消息Id(delivery.getEnvelope().getDeliveryTag()),在完成所有业务逻辑后,我们需要该消息进行ack处理 如何使用spring集成实现这一点? 这是我的xml配置 <bean id="devRabbitmqConnectionFactory" class="com.rab

我是RabbitMQ和Spring集成的新手

我有一个用例来使用来自通道的JSON消息,并将其转换为对象。我需要在对象中设置的一个字段是我们从rabbitMQ接收的消息的消息Id(delivery.getEnvelope().getDeliveryTag()),在完成所有业务逻辑后,我们需要该消息进行ack处理

如何使用spring集成实现这一点? 这是我的xml配置

       <bean id="devRabbitmqConnectionFactory" class="com.rabbitmq.client.ConnectionFactory">
            <property name="brokerURL" value="#{props[rabbitmq_inputjms_url]}" />
            <property name="redeliveryPolicy" ref="redeliveryPolicy" />
      </bean>   

     <bean id="devJMSCachingConnectionFactory"
            class="org.springframework.amqp.rabbit.connection.CachingConnectionFactory">
            <property name="targetConnectionFactory" ref="devRabbitmqConnectionFactory" />
            <property name="sessionCacheSize" value="10" />
            <property name="cacheProducers" value="false" />
      </bean>

      <int-jms:channel id="devJMSChannel" acknowledge="transacted"
            connection-factory="devJMSCachingConnectionFactory" message-driven="false"
            queue-name="devJMSChannel">

      </int-jms:channel> 
      <bean id="redeliveryPolicy" class="org.apache.activemq.RedeliveryPolicy">
        <property name="initialRedeliveryDelay" value="5000" />
        <property name="maximumRedeliveries" value="5" />
      </bean>

    <int:transformer id="devObjectTransformer" input-channel="devJMSChannel"  ref="devService" method="readEventFromRabbitMQ"
                output-channel="devPacketChannel">
        <int:poller fixed-rate="10" task-executor="devObjectTransformerExecutor" />
    </int:transformer>

转换器方法“readEventFromRabbitMQ”从msg获取消息字符串。getPayload()将其转换为对象并将其发送到输出通道。但不确定如何在transformer类中获取消息Id。有人能帮我吗

public List<DevEventRecord> readEventFromRabbitMQ(Message<EventsDetail> msg){
         DevEventRecord[] eventRecords=null;
         EventsDetail expEvent = null;
         long receivedTime =System.currentTimeMillis();
         int packetId = -1;
         try{
             monitorBean.incrementDeviceExceptionPacketCount();
             expEvent = msg.getPayload();
             LogUtil.debug("readExceptionEvent :: consumed JMS Q "+expEvent);
             eventRecords = dispatchPacket(expEvent);
         }
         catch(ProcessingException pe){
             notifyAck(expEvent.getUniqueId(),,,,);
         }
         catch(Exception ex){
             notifyAck(expEvent.getUniqueId(),,,,);
             LogUtil.error("Exception occured while reading object in readEvent , "+ex.toString());
         }
         return getEventRecordList(eventRecords);

    }
公共列表readEventFromRabbitMQ(消息消息消息){ devEventRecords[]eventRecords=null; EventsDetailExpEvent=null; long receivedTime=System.currentTimeMillis(); int packetId=-1; 试一试{ monitorBean.incrementDeviceExceptionPacketCount(); expEvent=msg.getPayload(); 调试(“readExceptionEvent::consumed JMS Q”+expEvent); eventRecords=调度包(expEvent); } 捕获(处理异常pe){ notifyAck(expEvent.getUniqueId(),,,); } 捕获(例外情况除外){ notifyAck(expEvent.getUniqueId(),,,); LogUtil.error(“读取readEvent中的对象时发生异常,”+ex.toString()); } 返回getEventRecordList(事件记录); }
在键
AmqpHeaders.DELIVERY\u标签
下的
之后,
deliveryTag
显示为消息头

我不明白为什么要混合使用
AMQP
JMS
,但无论如何,这些通道实现不会从收到的消息中填充头。这是他们的责任


请使用
,下面是使用
deliveryTag
标题手动确认
消息的方法。

请记住,通常不需要使用Spring AMQP手动确认消息-默认情况下,当消费者线程处理完消息后正常返回时,容器将确认消息。如果流引发异常,容器将拒绝(默认情况下重新查询)消息。交付标签仅在使用
MANUAL
acks时可用作标题。