Hi If you stay with 1.4 then remove the try .. catch around the producer template. This is new behavior in 1.5.
See release notes: http://activemq.apache.org/camel/camel-150-release.html Mind that 1.5 is still work in progress, however we are closing in on the first RC sooner than later. Med venlig hilsen Claus Ibsen ...................................... Silverbullet Skovsgårdsvænget 21 8362 Hørning Tlf. +45 2962 7576 Web: www.silverbullet.dk -----Original Message----- From: Mick Knutson [mailto:[EMAIL PROTECTED] Sent: 30. september 2008 19:15 To: camel-user@activemq.apache.org Subject: Re: issue routing Exchange to custom method in Processor 1.4 Let me do a test with 1.5 On Tue, Sep 30, 2008 at 10:10 AM, Claus Ibsen <[EMAIL PROTECTED]> wrote: > Hi Mick > > What version are you using? > > The unit test I created is with camel 1.5-SNAPSHOT. > > > > > Med venlig hilsen > > Claus Ibsen > ...................................... > Silverbullet > Skovsgårdsvænget 21 > 8362 Hørning > Tlf. +45 2962 7576 > Web: www.silverbullet.dk > > -----Original Message----- > From: Mick Knutson [mailto:[EMAIL PROTECTED] > Sent: 30. september 2008 18:39 > To: camel-user@activemq.apache.org > Subject: Re: issue routing Exchange to custom method in Processor > > *I took the exact test method and create Route you had in that test:* > > > *protected RouteBuilder createRouteBuilder() throws Exception { > return new RouteBuilder() { > public void configure() throws Exception { > from("direct:start") > > .errorHandler(deadLetterChannel("mock:error").maximumRedeliveries(1)) > .process(new Processor() { > public void process(Exchange exchange) throws > Exception { > String body = > exchange.getIn().getBody(String.class); > if ("Boom".equals(body)) { > throw new > IllegalArgumentException("Forced exception by unit test"); > } > exchange.getIn().setBody("Bye World"); > } > }) > .to("mock:result"); > } > }; > } > > @Test(groups = {"functional"}) > public void testError() throws Exception { > > camelContext.addRoutes(createRouteBuilder()); > > log.debug("----------------------------------------------------"); > log.debug("----------------------------------------------------"); > log.debug("----------------------------------------------------"); > log.debug("----------------------------------------------------"); > log.debug("----------------------------------------------------"); > MockEndpoint error = getMockEndpoint("mock:error"); > MockEndpoint result = getMockEndpoint("mock:result"); > error.expectedMessageCount(1); > result.expectedMessageCount(0); > > try { > producerTemplate.sendBody("direct:start", "Boom"); > Assert.fail("Should have thrown a RuntimeCamelException"); > } catch (RuntimeCamelException e) { > //assertIsInstanceOf(IllegalArgumentException.class, > e.getCause()); > } > > MockEndpoint.assertIsSatisfied(error, result); > log.debug("----------------------------------------------------"); > log.debug("----------------------------------------------------"); > log.debug("----------------------------------------------------"); > log.debug("----------------------------------------------------"); > log.debug("----------------------------------------------------"); > } > * > > > > > > > *And ran that in my TestNG and no failure occures:* > > *<test name="MockTest"> > <class name="com.servepath.changerequest.ChangeRequestTest"> > <test-method status="FAIL" signature="testError()" name="testError" > duration-ms="375" started-at="2008-09-30T09:34:04Z" > finished-at="2008-09-30T09:34:04Z"> > <exception class="java.lang.AssertionError"> > <message> > <![CDATA[Should have thrown a RuntimeCamelException]]> > </message> > <full-stacktrace> > <![CDATA[java.lang.AssertionError: Should have thrown a > RuntimeCamelException > at org.testng.Assert.fail(Assert.java:84) > at > > com.servepath.changerequest.ChangeRequestTest.testError(ChangeRequestTest.java:73) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) > at > > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) > at java.lang.reflect.Method.invoke(Method.java:597) > at org.testng.internal.MethodHelper.invokeMethod(MethodHelper.java:580) > at > org.testng.internal.MethodHelper$1.runTestMethod(MethodHelper.java:698) > at > > org.springframework.test.context.testng.AbstractTestNGSpringContextTests.run(AbstractTestNGSpringContextTests.java:140) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) > at > > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) > at java.lang.reflect.Method.invoke(Method.java:597) > at > org.testng.internal.MethodHelper.invokeHookable(MethodHelper.java:706) > at org.testng.internal.Invoker.invokeMethod(Invoker.java:468) > at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:617) > at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:885) > at > > org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:126) > at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:110) > at org.testng.TestRunner.runWorkers(TestRunner.java:712) > at org.testng.TestRunner.privateRun(TestRunner.java:582) > at org.testng.TestRunner.run(TestRunner.java:477) > at org.testng.SuiteRunner.runTest(SuiteRunner.java:324) > at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:319) > at org.testng.SuiteRunner.privateRun(SuiteRunner.java:292) > at org.testng.SuiteRunner.run(SuiteRunner.java:198) > at org.testng.TestNG.createAndRunSuiteRunners(TestNG.java:821) > at org.testng.TestNG.runSuitesLocally(TestNG.java:788) > at org.testng.TestNG.run(TestNG.java:708) > at > org.apache.maven.surefire.testng.TestNGExecutor.run(TestNGExecutor.java:74) > at > > org.apache.maven.surefire.testng.TestNGXmlTestSuite.execute(TestNGXmlTestSuite.java:92) > at org.apache.maven.surefire.Surefire.run(Surefire.java:177) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) > at > > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) > at java.lang.reflect.Method.invoke(Method.java:597) > at > > org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:338) > at > > org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:997) > ]]> > </full-stacktrace> > * > > > *Here is the console trace for this test: > * > *tson/camel,route=[direct]start,type=route,name=[direct]start > [myproject] DEBUG [main] DefaultCamelContext.addRoutes(341) | Adding routes > from: Routes: [Route[ [From[direct:start]] -> [Interceptor[Delegate(Pipeli > > ne[DeadLetterChannel[Delegate([EMAIL PROTECTED] > ), > sendTo(Endpoint[mock:error]), RedeliveryPolicy[maximumRedeli > veries=1]], DeadLetterChannel[Delegate(sendTo(Endpoint[mock:result])), > sendTo(Endpoint[mock:error]), > RedeliveryPolicy[maximumRedeliveries=1]]])]]]] > ro > utes: [] > [myproject] DEBUG [main] ProducerCache.sendExchange(147) | >>>> > Endpoint[direct:start] Exchange[Message: Boom] > [myproject] ERROR [main] DeadLetterChannel.log(189) | Failed delivery for > exchangeId: ID-mickknutson/2161-1222792429368/0-0. On delivery attempt: 0 > ca > ught: java.lang.IllegalArgumentException: Forced exception by unit test > java.lang.IllegalArgumentException: Forced exception by unit test > at > > com.servepath.changerequest.ChangeRequestTest$1$1.process(ChangeRequestTest.java:46) > at > > org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:69) > at > > org.apache.camel.processor.DeadLetterChannel.process(DeadLetterChannel.java:155) > at > > org.apache.camel.processor.DeadLetterChannel.process(DeadLetterChannel.java:91) > at org.apache.camel.processor.Pipeline.process(Pipeline.java:101) > at org.apache.camel.processor.Pipeline.process(Pipeline.java:85) > at > > org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:57) > at > > org.apache.camel.processor.UnitOfWorkProcessor.process(UnitOfWorkProcessor.java:39) > at > > org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:41) > at > > org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:66) > at > > org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:47) > at > org.apache.camel.impl.ProducerCache.sendExchange(ProducerCache.java:149) > at org.apache.camel.impl.ProducerCache.send(ProducerCache.java:86) > at > > org.apache.camel.impl.DefaultProducerTemplate.send(DefaultProducerTemplate.java:84) > at > > org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:101) > at > > org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTemplate.java:107) > at > > com.servepath.changerequest.ChangeRequestTest.testError(ChangeRequestTest.java:72) > * > > > > On Mon, Sep 29, 2008 at 9:49 PM, Claus Ibsen <[EMAIL PROTECTED]> wrote: > > > Hi Mick > > > > Check out this unit test I just added: > > > > If you are using 1.5-SNAPSHOT remember that the producer template now > > rethrows the exception that caused the failure in the routing. So you > should > > try .. catch this no. See the ErrorHandlerTest#testError() method. > > > > http://svn.apache.org/viewvc?view=rev&revision=700334 > > > > > > > > Med venlig hilsen > > > > Claus Ibsen > > ...................................... > > Silverbullet > > Skovsgårdsvænget 21 > > 8362 Hørning > > Tlf. +45 2962 7576 > > Web: www.silverbullet.dk > > > > -----Original Message----- > > From: Claus Ibsen [mailto:[EMAIL PROTECTED] > > Sent: 30. september 2008 06:25 > > To: camel-user@activemq.apache.org > > Subject: RE: issue routing Exchange to custom method in Processor > > > > Hi > > > > Could you put the error handler outside the from, so its like this: > > > > errorHandler(xxx); > > from(yyy).process(zzz); > > > > > > > > Med venlig hilsen > > > > Claus Ibsen > > ...................................... > > Silverbullet > > Skovsgårdsvænget 21 > > 8362 Hørning > > Tlf. +45 2962 7576 > > Web: www.silverbullet.dk > > -----Original Message----- > > From: Mick Knutson [mailto:[EMAIL PROTECTED] > > Sent: 30. september 2008 00:33 > > To: camel-user@activemq.apache.org > > Subject: Re: issue routing Exchange to custom method in Processor > > > > I have looked through this whole thing, and there is nothing different > than > > what I am doing. > > > > My valid tests work fine. They get the expected messages and validate > > accordingly. But the issue seems to be with processing deadLetter > channels > > in Mocks. > > > > So basically, in my test, the message is sent through to the > > *resultEndpoint > > *instead of the *resultErrorEndpoint *which is causing my test to fail. > > > > > > Now just before I test my Mock's, I added this code to: > > > > *Assert.assertNotNull(camelContext); > > Assert.assertNotNull(resultEndpoint); > > Assert.assertNotNull(resultErrorEndpoint); > > > > //MockEndpoint.assertIsSatisfied(camelContext); > > > > // lets show the endpoints in the test > > List<MockEndpoint> list = > > CamelContextHelper.getSingletonEndpoints(camelContext, > MockEndpoint.class); > > log.info("Found endpoints: " + list); > > > > // lets dump the messages sent to our test endpoint > > List<Exchange> exchanges = resultEndpoint.getReceivedExchanges(); > > log.info > > > > > ("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"); > > for (Exchange exchange : exchanges) { > > log.info("Received resultEndpoint: [" + exchange + "]\n"); > > } > > > > // lets dump the messages sent to our test endpoint > > List<Exchange> exchangesMock = > > resultErrorEndpoint.getReceivedExchanges(); > > log.info > > > > > ("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"); > > for (Exchange exchange : exchangesMock) { > > log.info("Received resultErrorEndpoint: [" + exchange + > "]\n"); > > } > > log.info > > > > > ("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"); > > * > > > > > > *And there is nothing happening to my error mock at all.* > > > > > > *[myproject] INFO [main] ChangeRequestTest.testMocksAreValid(152) | > > testMocksAreValid > > [myproject] INFO [main] ChangeRequestTest.testMocksAreValid(162) | Found > > endpoints: [Endpoint[mock:outputDestinationURI], > > Endpoint[mock:outputErrorDes > > tinationURI]] > > [myproject] DEBUG [VMTransport] AbstractRegion.addConsumer(215) | Adding > > consumer: ID:mickknutson-3837-1222725262920-2:21:1:1 > > [myproject] INFO [main] ChangeRequestTest.testMocksAreValid(166) | > > > > > %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% > > %%%%%%%%%%% > > [myproject] INFO [main] ChangeRequestTest.testMocksAreValid(168) | > Received > > resultEndpoint: [Exchange[JmsMessage: > {"changeRequestId":"99907","custId": > > "70999","requestType":"provision","quota":"102400","backend":" > > 192.168.0.0/16 > > ","password":"abcd1234"}]] > > > > [myproject] INFO [main] ChangeRequestTest.testMocksAreValid(168) | > Received > > resultEndpoint: [Exchange[JmsMessage: ActiveMQTextMessage {commandId = 5, > > responseRequired = true, messageId = > > ID:mickknutson-3837-1222725262920-2:12:1:1:1, originalDestination = null, > > originalTransactionId = null, producerI > > d = ID:mickknutson-3837-1222725262920-2:12:1:1, destination = > > queue://channel/gogrid/cloudstorage/command/status, transactionId = null, > > expiration = 0 > > , timestamp = 1222725273779, arrival = 0, brokerInTime = 1222725273779, > > brokerOutTime = 1222725273779, correlationId = null, replyTo = null, > > persisten > > t = true, type = null, priority = 4, groupID = null, groupSequence = 0, > > targetConsumerId = null, compressed = false, userID = null, content = > null, > > ma > > rshalledProperties = null, dataStructure = null, redeliveryCounter = 0, > > size > > = 1024, properties = null, readOnlyProperties = true, readOnlyBody = true > > , droppable = false, text = > > > > > {"commandType":"jobCreated","changeRequestId":"1234567890","timeout":0,"jobId":"bdceca38-8bba-11dd-b4f0-0030488bd1fd"}}]] > > > > [myproject] INFO [main] ChangeRequestTest.testMocksAreValid(173) | > > > > > %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% > > %%%%%%%%%%% > > [myproject] INFO [main] ChangeRequestTest.testMocksAreValid(177) | > > > > > %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% > > %%%%%%%%%%% > > * > > > > So there are 2 exchanges only. The first in green was for my initial add > > request which was successful. The second for for my status update in > > orange, > > which was also successful. > > > > What I do NOT have is any exchange whatsoever for my failed request. > > > > > > > > So according to my <test name="*InvalidProvisionChangeRequest*"> > > *<message> > > * > > * <![CDATA[mock:outputDestinationURI Received message > > count. Expected: > > <0> but was: <1>]]> > > </message>* > > > > Which means that nothing is getting routed to my deadLetter Channel in my > > tests only. > > > > > > > > > > On Mon, Sep 29, 2008 at 11:21 AM, Claus Ibsen <[EMAIL PROTECTED]> > wrote: > > > > > > > > > > > https://svn.apache.org/repos/asf/activemq/camel/trunk/components/camel-testng/ > > > > > > It is in fact not promoted too much (or not at all) on our camel wiki > > > documentation. > > > > > > > > > > > > Med venlig hilsen > > > > > > Claus Ibsen > > > ...................................... > > > Silverbullet > > > Skovsgårdsvænget 21 > > > 8362 Hørning > > > Tlf. +45 2962 7576 > > > Web: www.silverbullet.dk > > > > > > -----Original Message----- > > > From: Mick Knutson [mailto:[EMAIL PROTECTED] > > > Sent: 29. september 2008 19:57 > > > To: camel-user@activemq.apache.org > > > Subject: Re: issue routing Exchange to custom method in Processor > > > > > > I deploy this as a war to Tomcat and use a single > applicationContext.xml > > to > > > start camel like: > > > > > > *<import resource="classpath:META-INF/spring/camel-context.xml"/> > > > > > > <camelContext id="camel" > > > xmlns="http://activemq.apache.org/camel/schema/spring > "> > > > <!-- The routes are defined in --> > > > <package>com.servepath.gogrid.changerequest</package> > > > > > > </camelContext> > > > * > > > > > > > > > The same as in my applicationContext-test.xml except I do not include > any > > > routing declarations as I have my test create the route like: > > > > > > > > > public void setRoutes(final String inputUri, final Processor > > processor) > > > throws Exception { > > > // Add Routes to Camel Context > > > camelContext.addRoutes(new RouteBuilder() { > > > public void configure() { > > > from(inputUri) > > > .errorHandler( > > > > > > deadLetterChannel(MOCK_OUTPUT_DESTINATION_URI) > > > > .loggingLevel(LoggingLevel.TRACE) > > > > > > ) > > > .process(changeRequestController) > > > .to(MOCK_OUTPUT_DESTINATION_URI); > > > } > > > }); > > > > > > }//setRoutes > > > > > > > > > PS, where can I find this camel TestNG component you are talking about? > > > > > > > > > > > > > > > > > > On Mon, Sep 29, 2008 at 10:34 AM, Claus Ibsen <[EMAIL PROTECTED]> > > wrote: > > > > > > > Hi > > > > > > > > I think it could be how you start camel. When you deploy to Jetty do > > you > > > > deploy it as OSGi bundles, or as a web application? > > > > > > > > Either way then its usually Spring that is starting up as normal and > it > > > > will starup Camel properly. > > > > > > > > I am not sure this is happening correctly in your unit tests. > > > > > > > > Your BaseCamelTestNG class also starts Camel. It is only supposed to > be > > > > started once. As well as stopped, let Spring handle this. > > > > > > > > There must be a hook somewhere where you can add your routes. However > > we > > > > use either plain junit or spring junit based in the testing of camel > > > itself > > > > - not TestNG so I am afraid I have not used it that much. > > > > > > > > Could you check out the camel-testng component. It might have some > > > pointers > > > > there. > > > > > > > > > > > > Med venlig hilsen > > > > > > > > Claus Ibsen > > > > ...................................... > > > > Silverbullet > > > > Skovsgårdsvænget 21 > > > > 8362 Hørning > > > > Tlf. +45 2962 7576 > > > > Web: www.silverbullet.dk > > > > > > > > -----Original Message----- > > > > From: Mick Knutson [mailto:[EMAIL PROTECTED] > > > > Sent: 29. september 2008 19:26 > > > > To: camel-user@activemq.apache.org > > > > Subject: Re: issue routing Exchange to custom method in Processor > > > > > > > > I have seperated them and that solves the first item. Thanks. > > > > But I still can't seem to get my errorMock to work. > > > > > > > > But when I deploy this to Jetty, the route and errors act as > expected. > > > > > > > > > > > > On Mon, Sep 29, 2008 at 10:22 AM, Claus Ibsen <[EMAIL PROTECTED]> > > > wrote: > > > > > > > > > Hi > > > > > > > > > > I don't think you should have both @MessageDriven and Processor in > > the > > > > same > > > > > java class. You should separate these two. This is not commonly > used. > > > > > > > > > > > > > > > Med venlig hilsen > > > > > > > > > > Claus Ibsen > > > > > ...................................... > > > > > Silverbullet > > > > > Skovsgårdsvænget 21 > > > > > 8362 Hørning > > > > > Tlf. +45 2962 7576 > > > > > Web: www.silverbullet.dk > > > > > -----Original Message----- > > > > > From: Mick Knutson [mailto:[EMAIL PROTECTED] > > > > > Sent: 29. september 2008 18:12 > > > > > To: Camel; Active MQ > > > > > Subject: Re: issue routing Exchange to custom method in Processor > > > > > > > > > > Can someone help me? > > > > > > > > > > On Fri, Sep 26, 2008 at 3:10 PM, Mick Knutson < > > [EMAIL PROTECTED] > > > > > >wrote: > > > > > > > > > > > The funny thing is, when I have an error with the message coming > > from > > > > > this > > > > > > queue, which I do because process(Exchange) does not expect my > > > message > > > > > body, > > > > > > the message gets routed to the proper deadLetter channel. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > On Fri, Sep 26, 2008 at 12:22 PM, Mick Knutson < > > > [EMAIL PROTECTED] > > > > > >wrote: > > > > > > > > > > > >> I have a Processor with 2 different methods: > > > > > >> > > > > > >> The standard: > > > > > >> *public void process(Exchange exchange) { > > > > > >> * > > > > > >> > > > > > >> and a custom: > > > > > >> > > > > > >> [EMAIL PROTECTED](uri = > Constants.CHANNEL_GG_CS_COMMAND_STATUS) > > > > > >> public void onMessage(Exchange exchange) * > > > > > >> > > > > > >> Now here is my route: > > > > > >> > > > > > >> * from(Constants.CHANNEL_GG_CS_CR_ADD) > > > > > >> .errorHandler( > > > > > >> > > > > > >> deadLetterChannel(Constants.CHANNEL_GG_CS_CR_ADD_ERROR) > > > > > >> //.maximumRedeliveries(2) > > > > > >> //.initialRedeliveryDelay(1) > > > > > >> > .loggingLevel(LoggingLevel.DEBUG) > > > > > >> ).processRef("changeRequestController") > > > > > >> .to(Constants.CHANNEL_GG_CS_COMMAND_CLUSTER); > > > > > >> > > > > > >> > > > > > >> // Route for command status updates. > > > > > >> from(Constants.CHANNEL_GG_CS_COMMAND_STATUS) > > > > > >> .errorHandler( > > > > > >> > > > > > >> > > > > > > > > > > > > > > > deadLetterChannel(Constants.CHANNEL_GG_CS_COMMAND_STATUS_ERROR).maximumRedeliveries(2) > > > > > >> .initialRedeliveryDelay(1) > > > > > >> .loggingLevel(LoggingLevel.INFO) > > > > > >> > > > > > ).to("bean:changeRequestController?methodName=onMessage"); > > > > > >> * > > > > > >> > > > > > >> So when I get a message on *Constants.CHANNEL_GG_CS_CR_ADD my > > > > > >> process(Exchange) method is called, and that rout is fine. > > > > > >> > > > > > >> However, I get a response message back on > > > > > **Constants.CHANNEL_GG_CS_COMMAND_STATUS > > > > > >> but it is also processed by *the *process(Exchange) instead of > my > > > > > >> onMessage**(Exchange)* > > > > > >> > > > > > >> I have tried @MessageDriven annotation as well as the route > > builder > > > > but > > > > > >> neither works. > > > > > >> > > > > > >> Am I forced to have each process in a single class? > > > > > >> > > > > > >> > > > > > >> > > > > > >> -- > > > > > >> --- > > > > > >> Thank You... > > > > > >> > > > > > >> Mick Knutson > > > > > >> BASE Logic, inc. > > > > > >> (415) 354-4215 > > > > > >> > > > > > >> Website: http://baselogic.com > > > > > >> Blog: http://baselogic.com/blog > > > > > >> BLiNC Magazine: http://blincmagazine.com > > > > > >> Linked IN: http://linkedin.com/in/mickknutson > > > > > >> DJ Mick: http://djmick.com > > > > > >> MySpace: http://myspace.com/mickknutson > > > > > >> Vacation Rental: http://tahoe.baselogic.com > > > > > >> > > > > > >> > > > > > > > > > > > > > > > > > > -- > > > > > > --- > > > > > > Thank You... > > > > > > > > > > > > Mick Knutson > > > > > > BASE Logic, inc. > > > > > > (415) 354-4215 > > > > > > > > > > > > Website: http://baselogic.com > > > > > > Blog: http://baselogic.com/blog > > > > > > BLiNC Magazine: http://blincmagazine.com > > > > > > Linked IN: http://linkedin.com/in/mickknutson > > > > > > DJ Mick: http://djmick.com > > > > > > MySpace: http://myspace.com/mickknutson > > > > > > Vacation Rental: http://tahoe.baselogic.com > > > > > > > > > > > > > > > > > > > > > > > > > > > -- > > > > > --- > > > > > Thank You... > > > > > > > > > > Mick Knutson > > > > > BASE Logic, inc. > > > > > (415) 354-4215 > > > > > > > > > > Website: http://baselogic.com > > > > > Blog: http://baselogic.com/blog > > > > > BLiNC Magazine: http://blincmagazine.com > > > > > Linked IN: http://linkedin.com/in/mickknutson > > > > > DJ Mick: http://djmick.com > > > > > MySpace: http://myspace.com/mickknutson > > > > > Vacation Rental: http://tahoe.baselogic.com > > > > > > > > > > > > > > > > > > > > > -- > > > > --- > > > > Thank You... > > > > > > > > Mick Knutson > > > > BASE Logic, inc. > > > > (415) 354-4215 > > > > > > > > Website: http://baselogic.com > > > > Blog: http://baselogic.com/blog > > > > BLiNC Magazine: http://blincmagazine.com > > > > Linked IN: http://linkedin.com/in/mickknutson > > > > DJ Mick: http://djmick.com > > > > MySpace: http://myspace.com/mickknutson > > > > Vacation Rental: http://tahoe.baselogic.com > > > > > > > > > > > > > > > > -- > > > --- > > > Thank You... > > > > > > Mick Knutson > > > BASE Logic, inc. > > > (415) 354-4215 > > > > > > Website: http://baselogic.com > > > Blog: http://baselogic.com/blog > > > BLiNC Magazine: http://blincmagazine.com > > > Linked IN: http://linkedin.com/in/mickknutson > > > DJ Mick: http://djmick.com > > > MySpace: http://myspace.com/mickknutson > > > Vacation Rental: http://tahoe.baselogic.com > > > > > > > > > > > -- > > --- > > Thank You... > > > > Mick Knutson > > BASE Logic, inc. > > (415) 354-4215 > > > > Website: http://baselogic.com > > Blog: http://baselogic.com/blog > > BLiNC Magazine: http://blincmagazine.com > > Linked IN: http://linkedin.com/in/mickknutson > > DJ Mick: http://djmick.com > > MySpace: http://myspace.com/mickknutson > > Vacation Rental: http://tahoe.baselogic.com > > > > > > -- > --- > Thank You... > > Mick Knutson > BASE Logic, inc. > (415) 354-4215 > > Website: http://baselogic.com > Blog: http://baselogic.com/blog > BLiNC Magazine: http://blincmagazine.com > Linked IN: http://linkedin.com/in/mickknutson > DJ Mick: http://djmick.com > MySpace: http://myspace.com/mickknutson > Vacation Rental: http://tahoe.baselogic.com > -- --- Thank You... Mick Knutson BASE Logic, inc. (415) 354-4215 Website: http://baselogic.com Blog: http://baselogic.com/blog BLiNC Magazine: http://blincmagazine.com Linked IN: http://linkedin.com/in/mickknutson DJ Mick: http://djmick.com MySpace: http://myspace.com/mickknutson Vacation Rental: http://tahoe.baselogic.com