从一个通道接收RabbitMQ消息,在变换器中设置messageId并使用Spring Integration将其发送到其他通道

时间:2014-09-22 08:57:48

标签: rabbitmq spring-integration

我是RabbitMQ和Spring Integration的新手。

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

如何使用弹簧集成进行操作? 这是我的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>

变压器方法&#34; readEventFromRabbitMQ&#34;从msg.getPayload()获取消息字符串将其转换为对象并将其发送到输出通道。但不确定如何在变换器类中获取消息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);

    }

1 个答案:

答案 0 :(得分:0)

deliveryTag在密钥<int-amqp:inbound-channel-adapter>下的AmqpHeaders.DELIVERY_TAG后显示为邮件标题。

我不明白为什么要混用AMQPJMS,但无论如何,这些渠道实施都不会从收到的邮件中填充标题。这是出于他们的反应。

请使用<int-amqp:inbound-channel-adapter>sample ack如何使用deliveryTag标题手动{{1}}消息。