Return-Path: Delivered-To: apmail-activemq-camel-user-archive@locus.apache.org Received: (qmail 82507 invoked from network); 30 Sep 2008 16:39:39 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 30 Sep 2008 16:39:39 -0000 Received: (qmail 12900 invoked by uid 500); 30 Sep 2008 16:39:37 -0000 Delivered-To: apmail-activemq-camel-user-archive@activemq.apache.org Received: (qmail 12882 invoked by uid 500); 30 Sep 2008 16:39:37 -0000 Mailing-List: contact camel-user-help@activemq.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: camel-user@activemq.apache.org Delivered-To: mailing list camel-user@activemq.apache.org Received: (qmail 12871 invoked by uid 99); 30 Sep 2008 16:39:37 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 30 Sep 2008 09:39:37 -0700 X-ASF-Spam-Status: No, hits=3.2 required=10.0 tests=HTML_MESSAGE,NORMAL_HTTP_TO_IP,SPF_NEUTRAL X-Spam-Check-By: apache.org Received-SPF: neutral (athena.apache.org: local policy) Received: from [209.85.217.15] (HELO mail-gx0-f15.google.com) (209.85.217.15) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 30 Sep 2008 16:38:32 +0000 Received: by gxk8 with SMTP id 8so11535659gxk.14 for ; Tue, 30 Sep 2008 09:39:05 -0700 (PDT) Received: by 10.142.140.15 with SMTP id n15mr2913385wfd.168.1222792744024; Tue, 30 Sep 2008 09:39:04 -0700 (PDT) Received: by 10.143.14.8 with HTTP; Tue, 30 Sep 2008 09:39:03 -0700 (PDT) Message-ID: <56b1dfc30809300939u16ac993dx4fd2e252c1df6d18@mail.gmail.com> Date: Tue, 30 Sep 2008 09:39:03 -0700 From: "Mick Knutson" To: camel-user@activemq.apache.org Subject: Re: issue routing Exchange to custom method in Processor In-Reply-To: <4C1FB9C00D24A140906239533638C4D205716B69@EXVS04.exserver.dk> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_Part_49058_32790025.1222792744025" References: <4C1FB9C00D24A140906239533638C4D205716B62@EXVS04.exserver.dk> <4C1FB9C00D24A140906239533638C4D205716B69@EXVS04.exserver.dk> X-Virus-Checked: Checked by ClamAV on apache.org ------=_Part_49058_32790025.1222792744025 Content-Type: text/plain; charset=WINDOWS-1252 Content-Transfer-Encoding: quoted-printable Content-Disposition: inline *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 =3D 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 =3D {"functional"}) public void testError() throws Exception { camelContext.addRoutes(createRouteBuilder()); log.debug("----------------------------------------------------"); log.debug("----------------------------------------------------"); log.debug("----------------------------------------------------"); log.debug("----------------------------------------------------"); log.debug("----------------------------------------------------"); MockEndpoint error =3D getMockEndpoint("mock:error"); MockEndpoint result =3D 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:* * * *Here is the console trace for this test: * *tson/camel,route=3D[direct]start,type=3Droute,name=3D[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=3D1]], DeadLetterChannel[Delegate(sendTo(Endpoint[mock:result])), sendTo(Endpoint[mock:error]), RedeliveryPolicy[maximumRedeliveries=3D1]]])]= ]]] 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 c= a 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(Instrumentatio= nProcessor.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(Instrumentatio= nProcessor.java:57) at org.apache.camel.processor.UnitOfWorkProcessor.process(UnitOfWorkProcessor.= java:39) at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.jav= a:41) at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProc= essor.java:66) at org.apache.camel.component.direct.DirectProducer.process(DirectProducer.jav= a: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(DefaultProducerTempl= ate.java:101) at org.apache.camel.impl.DefaultProducerTemplate.sendBody(DefaultProducerTempl= ate.java:107) at com.servepath.changerequest.ChangeRequestTest.testError(ChangeRequestTest.j= ava:72) * On Mon, Sep 29, 2008 at 9:49 PM, Claus Ibsen 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 sho= uld > try .. catch this no. See the ErrorHandlerTest#testError() method. > > http://svn.apache.org/viewvc?view=3Drev&revision=3D700334 > > > > Med venlig hilsen > > Claus Ibsen > ...................................... > Silverbullet > Skovsg=E5rdsv=E6nget 21 > 8362 H=F8rning > 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=E5rdsv=E6nget 21 > 8362 H=F8rning > 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 th= an > 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 channel= s > 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 list =3D > CamelContextHelper.getSingletonEndpoints(camelContext, MockEndpoint.class= ); > log.info("Found endpoints: " + list); > > // lets dump the messages sent to our test endpoint > List exchanges =3D resultEndpoint.getReceivedExchanges()= ; > log.info > > ("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%= %%%%%%%%%%%%%%%%%%%%%%%"); > for (Exchange exchange : exchanges) { > log.info("Received resultEndpoint: [" + exchange + "]\n"); > } > > // lets dump the messages sent to our test endpoint > List exchangesMock =3D > 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) | Receiv= ed > 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) | Receiv= ed > resultEndpoint: [Exchange[JmsMessage: ActiveMQTextMessage {commandId =3D = 5, > responseRequired =3D true, messageId =3D > ID:mickknutson-3837-1222725262920-2:12:1:1:1, originalDestination =3D nul= l, > originalTransactionId =3D null, producerI > d =3D ID:mickknutson-3837-1222725262920-2:12:1:1, destination =3D > queue://channel/gogrid/cloudstorage/command/status, transactionId =3D nul= l, > expiration =3D 0 > , timestamp =3D 1222725273779, arrival =3D 0, brokerInTime =3D 1222725273= 779, > brokerOutTime =3D 1222725273779, correlationId =3D null, replyTo =3D null= , > persisten > t =3D true, type =3D null, priority =3D 4, groupID =3D null, groupSequenc= e =3D 0, > targetConsumerId =3D null, compressed =3D false, userID =3D null, content= =3D null, > ma > rshalledProperties =3D null, dataStructure =3D null, redeliveryCounter = =3D 0, > size > =3D 1024, properties =3D null, readOnlyProperties =3D true, readOnlyBody = =3D true > , droppable =3D false, text =3D > > {"commandType":"jobCreated","changeRequestId":"1234567890","timeout":0,"j= obId":"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 > * > * > * count. Expected: > <0> but was: <1>]]> > * > > 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 wrote: > > > > > > https://svn.apache.org/repos/asf/activemq/camel/trunk/components/camel-te= stng/ > > > > It is in fact not promoted too much (or not at all) on our camel wiki > > documentation. > > > > > > > > Med venlig hilsen > > > > Claus Ibsen > > ...................................... > > Silverbullet > > Skovsg=E5rdsv=E6nget 21 > > 8362 H=F8rning > > 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.xm= l > to > > start camel like: > > > > * > > > > > xmlns=3D"http://activemq.apache.org/camel/schema/sprin= g"> > > > > com.servepath.gogrid.changerequest > > > > > > * > > > > > > The same as in my applicationContext-test.xml except I do not include a= ny > > 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 > 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=E5rdsv=E6nget 21 > > > 8362 H=F8rning > > > 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 > > 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 use= d. > > > > > > > > > > > > Med venlig hilsen > > > > > > > > Claus Ibsen > > > > ...................................... > > > > Silverbullet > > > > Skovsg=E5rdsv=E6nget 21 > > > > 8362 H=F8rning > > > > 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 =3D Constants.CHANNEL_GG_CS_COMMAND_STAT= US) > > > > >> 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).maximumRe= deliveries(2) > > > > >> .initialRedeliveryDelay(1) > > > > >> .loggingLevel(LoggingLevel.INFO) > > > > >> > > > > ).to("bean:changeRequestController?methodName=3DonMessage"); > > > > >> * > > > > >> > > > > >> 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 m= y > > > > >> 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 > --=20 --- Thank You=85 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 ------=_Part_49058_32790025.1222792744025--