Search code examples
javaapache-camelactivemq-classicendpointapache-servicemix

ExchangeTimedOutException: The OUT message was not received


I have a problem the InOnly exchange pattern what I use with aciveMq.

I wrote a module what run in ServiceMix. It works correctly except that it send every message to dead letter queue (ActiveMQ.DLQ). If I check the message then dlqDeliveryFailureCause contains this message: java.lang.Throwable: Message Expired.

I checked the JMSExpiration = 0.

The route:

    from("direct:" + reqOutQueue).id("reqInEnritch")
    .log("Start dispatch")
    .setExchangePattern(ExchangePattern.InOnly)
    .recipientList().method(EsbDynamicRouter.class, "systemRoute").parallelProcessing();

The function, what gives back the endpoint list:

@RecipientList
public String[] systemRoute(@Body Object body) throws Exception
{
    String[] result = null;

    List<DispConfView> targetList;
    int cikl = 0;
    SystemQueueHelper systemInfo;
    MessageHeaderHelper msgHeadHelp = new MessageHeaderHelper(body);

    // The object contains the affected elements
    targetList = dispHelp.getDispConfByMsgType(msgHeadHelp.getMsgType());

    result = new String[targetList.size()];

    for (DispConfView element : targetList)
    {
        // It builds the target andpoints
        systemInfo = new SystemQueueHelper(element.getSystemCode(), null, msgHeadHelp.getDirection());

        result[cikl] = systemInfo.getQueuName();

        cikl++;
    }

    return result;
}

The list contains these values:

activemq:queue:ERP.req.in?exchangePattern=InOnly
activemq:queue:WF.req.in?exchangePattern=InOnly

As you see, I try to set the correct pattern, but every messages go to dead letter queue.

Please help, what I have to set up!

Thank you!


Solution

  • The solution: It is settable in context file:

    <!-- JMS configuration -->  
    <bean id="pooledJmsConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory" init-method="start" destroy-method="stop">
        <property name="maxConnections" value="1" />
        <property name="connectionFactory" ref="jmsConnectionFactory" />
    </bean>
    
    <bean id="jmsConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
        <property name="brokerURL" value="failover:(tcp://localhost:61616)" />
        <property name="redeliveryPolicy">
            <bean class="org.apache.activemq.RedeliveryPolicy">
                <property name="maximumRedeliveries" value="5"/>
            </bean>
        </property>
    </bean>
    
    <bean id="jmsConfig" class="org.apache.camel.component.jms.JmsConfiguration">
        <property name="connectionFactory" ref="pooledJmsConnectionFactory"/>
        <property name="cacheLevelName" value="CACHE_CONSUMER" />
        <property name="disableReplyTo" value="true" />
    </bean>
    

    The "jmsConfig bean ""diasbleReplayTo" property solve the problem.