2017-02-15 47 views
0

我使用下面的服務器端重新輸送構造如何處理消息之前將其發送到DLQ

<plugins> 
    <redeliveryPlugin fallbackToDeadLetter="true" sendToDlqIfMaxRetriesExceeded="true"> 
     <redeliveryPolicyMap> 
      <redeliveryPolicyMap> 
       <redeliveryPolicyEntries> 
        <redeliveryPolicy 
         queue = "com.api.RequestQueue.v1" 
         maximumRedeliveries="20"       
         initialRedeliveryDelay="60000" 
         redeliveryDelay="60000" /> 

        <redeliveryPolicy 
         queue = "com.api.RequestQueue.v2" 
         maximumRedeliveries="10"       
         initialRedeliveryDelay="30000" 
         redeliveryDelay="30000" /> 
        <redeliveryPolicy 
         queue = "com.api.ResponseQueue.v1" 
         maximumRedeliveries="3"       
         initialRedeliveryDelay="34000" 
         redeliveryDelay="34000" />       
       </redeliveryPolicyEntries> 
      </redeliveryPolicyMap> 
     </redeliveryPolicyMap> 
    </redeliveryPlugin> 
</plugins> 

如何設置自定義端點處理試之後,只是將其發送之前失敗的消息到DLQ? 我做參考以下鏈接,但無法找到任何有關服務器端或redeliveryPlugin配置提及

1. dead-letter-channel

2. logging-camel-exceptions-and-sending-to-the-dead-letter-channel

回答

0

我使用彈簧,但重新配送配置位於單獨的經紀人容器中,目前無法更改。

但是下面的配置工作。

路線:

 public class MyMessageRoute extends RouteBuilder { 
     public void configure() throws Exception { 
      onException(Exception.class) 
      .handled(true) 
      .bean(PreDLQLogWriter.class) ; 

      from(fromQueueName).id("RouteId") 
      .transacted() 
      //process message 

      ; 
     }} 

public class PreDLQLogWriter { 
private static final org.slf4j.Logger LOG = 
       org.slf4j.LoggerFactory.getLogger(PreDLQLogWriter.class); 

int configuredDeliveryCount = maximumRedeliveries+1; 
public void logMessageDetails(Exchange exchange) throws Exception { 

    int actualDeliveryCount = exchange.getIn().getHeader("JMSXDeliveryCount") 
        != null ? exchange.getIn().getHeader("JMSXDeliveryCount", 
        Integer.class) : 0 ; 
    if(actualDeliveryCount = configuredDeliveryCount) { 
      LOG.info(" Pre-DLQ Log: Log the message with message id "); 
    }} 
2

如果您使用的藍圖或彈簧話,就可以很容易地做這樣:

<!-- Redelivery Policy --> 
<bean class="org.apache.camel.processor.RedeliveryPolicy" id="redeliveryPolicyConfig"> 
    <property name="5" /> 
    <property name="redeliveryDelay" value="5000" /> 
    <property name="logRetryAttempted" value="true" /> 
</bean> 

<!-- Error Handler --> 
<bean class="org.apache.camel.builder.DeadLetterChannelBuilder" id="errorHandler"> 
    <property name="deadLetterUri" value="direct:error" /> 
    <property name="useOriginalMessage" value="true" /> 
    <property name="redeliveryPolicy" ref="redeliveryPolicyConfig" /> 
</bean> 

然後添加你的路線,該錯誤處理程序中的「deadLetterUri」屬性爲這樣的指向:

<!-- Perform custom logic and send to DLQ --> 
<route id="myDLQ-route"> 
    <from uri="direct:error" /> 
    <!-- Maybe some logic here, logging perhaps? --> 
    <to uri="activemq:queue:myDLQ" /> 
</route> 
相關問題