camel-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Mick Knutson" <mknut...@baselogic.com>
Subject Re: issue routing Exchange to custom method in Processor
Date Tue, 30 Sep 2008 16:39:03 GMT
*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(com.servepath.changerequest.ChangeRequestTest$1$1@188f506),
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 <ci@silverbullet.dk> 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:ci@silverbullet.dk]
> 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:mknutson@baselogic.com]
> 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 <ci@silverbullet.dk> 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:mknutson@baselogic.com]
> > 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 <ci@silverbullet.dk>
> 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:mknutson@baselogic.com]
> > > 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 <ci@silverbullet.dk>
> > 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:mknutson@baselogic.com]
> > > > 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 <
> mknutson@baselogic.com
> > > > >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 <
> > mknutson@baselogic.com
> > > > >wrote:
> > > > >
> > > > >> I have a Processor with 2 different methods:
> > > > >>
> > > > >> The standard:
> > > > >> *public void process(Exchange exchange) {
> > > > >> *
> > > > >>
> > > > >> and a custom:
> > > > >>
> > > > >>     *@MessageDriven(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

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message