/* * Copyright 2003-2009 the original author or authors. * Licensed 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 com.jdon.async.disruptor; import java.util.TreeSet; import java.util.concurrent.TimeUnit; import junit.framework.TestCase; import com.jdon.domain.message.DomainEventHandler; import com.jdon.domain.message.DomainMessage; import com.lmax.disruptor.AlertException; import com.lmax.disruptor.RingBuffer; import com.lmax.disruptor.SequenceBarrier; import com.lmax.disruptor.TimeoutBlockingWaitStrategy; import com.lmax.disruptor.TimeoutException; import com.lmax.disruptor.dsl.Disruptor; public class DisruptorFactoryTest extends TestCase { DisruptorFactory disruptorFactory; protected void setUp() throws Exception { super.setUp(); disruptorFactory = new DisruptorFactory(); } protected void tearDown() throws Exception { super.tearDown(); } public void testGetDisruptor() { TreeSet<DomainEventHandler> handlers = disruptorFactory.getTreeSet(); final DomainEventHandler<EventDisruptor> handler = new DomainEventHandler<EventDisruptor>() { @Override public void onEvent(EventDisruptor event, final boolean endOfBatch) throws Exception { System.out.println("\nMyEventA=" + event.getDomainMessage().getEventSource()); event.getDomainMessage().setEventResult("not null"); } }; final DomainEventHandler<EventDisruptor> handler2 = new DomainEventHandler<EventDisruptor>() { @Override public void onEvent(EventDisruptor event, final boolean endOfBatch) throws Exception { System.out.println("\nMyEventA2=" + event.getDomainMessage().getEventSource()); event.getDomainMessage().setEventResult(null); } }; handlers.add(handler2); handlers.add(handler); Disruptor disruptor = disruptorFactory.createSingleDw("test"); disruptorFactory.addEventMessageHandler(disruptor, "test", handlers); disruptor.start(); int i = 0; // while (i < 10) { RingBuffer ringBuffer = disruptor.getRingBuffer(); long sequence = ringBuffer.next(); DomainMessage domainMessage = new DomainMessage(sequence); EventDisruptor eventDisruptor = (EventDisruptor) ringBuffer.get(sequence); eventDisruptor.setTopic("test"); eventDisruptor.setDomainMessage(domainMessage); ringBuffer.publish(sequence); System.out.print("\n RESULT=" + domainMessage.getBlockEventResult()); System.out.print("\n RESULT=" + domainMessage.getBlockEventResult()); System.out.print("\n RESULT=" + domainMessage.getBlockEventResult()); i++; System.out.print(i); // } System.out.print("ok"); } public void testValueEventProcessor() throws AlertException, InterruptedException, TimeoutException { RingBuffer ringBuffer = RingBuffer.createSingleProducer(new EventResultFactory(), 4, new TimeoutBlockingWaitStrategy(10000, TimeUnit.MILLISECONDS)); ValueEventProcessor valueEventProcessor = new ValueEventProcessor(ringBuffer); int numMessages = ringBuffer.getBufferSize(); int offset = 0; for (int i = 0; i < numMessages + offset; i++) { valueEventProcessor.send(i); System.out.print("\n push=" + i); } long expectedSequence = numMessages + offset - 1; SequenceBarrier barrier = ringBuffer.newBarrier(); long available = barrier.waitFor(expectedSequence); assertEquals(expectedSequence, available); System.out.print("\n expectedSequence=" + expectedSequence); for (int i = 0; i < numMessages + offset; i++) { System.out.print("\n i=" + ((EventResultDisruptor) ringBuffer.get(i)).getValue() + " " + i); } } }