从一个通道接收RabbitMQ消息,在转换器中设置messageId,并使用Spring集成将其发送到另一个通道
我是RabbitMQ和Spring集成的新手 我有一个用例来使用来自通道的JSON消息,并将其转换为对象。我需要在对象中设置的一个字段是我们从rabbitMQ接收的消息的消息Id(delivery.getEnvelope().getDeliveryTag()),在完成所有业务逻辑后,我们需要该消息进行ack处理 如何使用spring集成实现这一点? 这是我的xml配置从一个通道接收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
<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时可用作标题。