aos.camel.RiderAutoPartsCallbackTest.java Source code

Java tutorial

Introduction

Here is the source code for aos.camel.RiderAutoPartsCallbackTest.java

Source

/****************************************************************
 * Licensed to the AOS Community (AOS) under one or more        *
 * contributor license agreements.  See the NOTICE file         *
 * distributed with this work for additional information        *
 * regarding copyright ownership.  The AOS licenses this file   *
 * to you under the Apache License, Version 2.0 (the            *
 * "License"); you may not use this file except in compliance   *
 * with the License.  You may obtain a copy of the License at   *
 *                                                              *
 *   http://www.apache.org/licenses/LICENSE-2.0                 *
 *                                                              *
 * Unless required by applicable law or agreed to in writing,   *
 * software distributed under the License is distributed on an  *
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
 * KIND, either express or implied.  See the License for the    *
 * specific language governing permissions and limitations      *
 * under the License.                                           *
 ****************************************************************/
package aos.camel;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

import org.apache.camel.Exchange;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.impl.SynchronizationAdapter;
import org.apache.camel.spi.Synchronization;
import org.apache.camel.test.junit4.CamelTestSupport;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.junit.Test;

/**
 * Demonstrating how to use callback to gather a number of concurrent replies within a
 * given time period.
 *
 * @version $Revision: 171 $
 */
public class RiderAutoPartsCallbackTest extends CamelTestSupport {

    private static Log LOG = LogFactory.getLog(RiderAutoPartsCallbackTest.class);
    private int numPartners = 5;

    @Test
    public void testCallback() throws Exception {
        // related is the list of related items
        final List<String> relates = new ArrayList<String>();

        // latch to count down every time we got a reply
        final CountDownLatch latch = new CountDownLatch(numPartners);

        // use this callback to gather the replies and add it to the related list
        Synchronization callback = new SynchronizationAdapter() {
            @Override
            public void onComplete(Exchange exchange) {
                // get the reply and add it to related
                relates.add(exchange.getOut().getBody(String.class));
                // count down the latch
                latch.countDown();
            }

            @Override
            public void onFailure(Exchange exchange) {
                // count down the latch even if we failed
                latch.countDown();
            }
        };

        // send the same message to the business partners so they can return their feedback
        String body = "bumper";
        for (int i = 0; i < numPartners; i++) {
            template.asyncCallbackRequestBody("seda:partner:" + i, body, callback);
        }
        LOG.info("Send " + numPartners + " messages to partners.");

        // wait at most 1.5 seconds or until we got all replies
        boolean all = latch.await(1500, TimeUnit.MILLISECONDS);

        // log what we got as reply
        LOG.info("Got " + relates.size() + " replies, is all? " + all);
        for (String related : relates) {
            LOG.info("Related item category is: " + related);
        }

        // assert the unit test
        assertEquals(3, relates.size());
        assertEquals("bumper extension", relates.get(0));
        assertEquals("bumper filter", relates.get(1));
        assertEquals("bumper cover", relates.get(2));
    }

    @Override
    protected RouteBuilder createRouteBuilder() throws Exception {
        return new RouteBuilder() {
            @Override
            public void configure() throws Exception {
                // business partner routes with different delays
                // so some will answer within the period and others wont

                from("seda:partner:0").delay(500).transform().simple("bumper filter");

                from("seda:partner:1").delay(3000).transform().simple("nose panel");

                from("seda:partner:2").delay(1000).transform().simple("bumper cover");

                from("seda:partner:3").delay(250).transform().simple("bumper extension");

                from("seda:partner:4").delay(2000).transform().simple("tow hooks");
            }
        };
    }
}