Friday, 12 September 2014

COLOURIZED LOGGING IN RUBY(IRB) PROMPT

Wirble is a set of enhancements for ruby(irb). Wirble enables several items mentioned on the RubyGarden "Irb Tips and Tricks" page, including tab-completion, history, and a built-in ri command, as well as colorized results and a couple other goodies.

Wirble even works with rvm , lets hack the trick to do so:

Step 1:
When we start irb prompt it first checks for .irbrc file in home folder. ~/.irbrc.

Step 2 :
To enable wirble in irb prompt, Open the ~/.irbrc file (Create a new one if Not present.), and Paste the contents of the below code.
require 'irb/completion'
 require 'irb/ext/save-history'
 require 'rubygems'
 unless Gem::Specification.find_all_by_name('wirble').any?
   puts "Installing Wirble"
   %x{gem install 'wirble' --no-ri --no-rdoc}
 end
 Gem.refresh 
 require 'wirble'
# Initializing Wirble
Wirble.init
Wirble.colorize
# Customize according to your will.
colors = Wirble::Colorize.colors.merge({
  :object_class => :purple,
  :symbol => :purple,
  :symbol_prefix => :purple
})
Wirble::Colorize.colors = colors

Step 3:
Move out of the blog for a colourfull irb prompt and Njoy Coding in Ruby. Thanks to Santosh for writing this post .



Tuesday, 2 September 2014

Mule SFTP : Verify false Error

The following error might occur while using SFTP inbound or outbound endpoint in mule :
Error during login to x@192.168.2.18: verify: false
java.io.IOException: Error during login to x@192.168.2.18: verify: false
 at org.mule.transport.sftp.SftpClient.logAndThrowLoginError(SftpClient.java:200)
 at org.mule.transport.sftp.SftpClient.login(SftpClient.java:146)
 at org.mule.transport.sftp.SftpConnectionFactory.createClient(SftpConnectionFactory.java:98)
 at org.mule.transport.sftp.SftpConnector.createSftpClient(SftpConnector.java:191)
 at org.mule.transport.sftp.SftpConnector.createSftpClient(SftpConnector.java:174)
 at org.mule.transport.sftp.SftpReceiverRequesterUtil.getAvailableFiles(SftpReceiverRequesterUtil.java:75)
 at org.mule.transport.sftp.SftpMessageReceiver.poll(SftpMessageReceiver.java:62)
 at org.mule.transport.AbstractPollingMessageReceiver.performPoll(AbstractPollingMessageReceiver.java:219)
 at org.mule.transport.PollingReceiverWorker.poll(PollingReceiverWorker.java:84)
 at org.mule.transport.PollingReceiverWorker.run(PollingReceiverWorker.java:53)
 at org.mule.work.WorkerContext.run(WorkerContext.java:311)
 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
 at java.lang.Thread.run(Thread.java:722)
Mule SFTP uses JSch to connect to SFTP location . This error occurs with particular Java JDK updates . You might get this error If you are using following versions of jdk :
java7u6
java7u7
java7u15
This error does not occur if we use JDK version < java7u6 .

For more information please read this link.

Post Comments And Suggestions !!


Wednesday, 20 August 2014

JAXB Error : FWK005 parse may not be called while parsing

org.xml.sax.SAXException: FWK005 parse may not be called while parsing.
Above Error occurs because you might have SchemaFactory instance , which is shared by multiple threads. Like declaring it at class level , and using it in methods .
private SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
The SchemaFactory is not thread safe . It should always be initialized and accessed in local scope. So whenever you need SchemaFactory instance , just create it locally instead of using it at instance level.


Post Comments And Suggestions !!


Tuesday, 19 August 2014

How To Link Git Tag with Rails app

I use Git tags to manage the version numbers of my Rails apps.

Every time a new version is ready, I tag the current commit like this :
git tag -a v1.10 -m "FIXED PC-43/67/78"
I have created a ruby file in initializers which defines a constant to hold this information (in this case “v1.10”):
APP_VERSION = `git describe --always` unless defined? APP_VERSION
This constant simply contains the output of Git describe.
Now I can use it anywhere in my app where I would like to display the version number.

This post is written by Santosh.

Post Comments And Suggestions

Sunday, 17 August 2014

How to Print Full Stack Trace In Mule Flow

To print full exception stack trace in mule , you need to add a grrovy scripting element like this :
<?xml version="1.0" encoding="UTF-8"?>

<mule xmlns:scripting="http://www.mulesoft.org/schema/mule/scripting"
 xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:spring="http://www.springframework.org/schema/beans" version="CE-3.3.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="
http://www.mulesoft.org/schema/mule/scripting http://www.mulesoft.org/schema/mule/scripting/current/mule-scripting.xsd 
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd 
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd 
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd ">
    
    <flow name="muleMavenSampleFlow1" doc:name="muleMavenSampleFlow1">
        <http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8081" doc:name="HTTP"/>
        <catch-exception-strategy doc:name="Catch Exception Strategy">
         <scripting:transformer doc:name="Print StackTrace">
    <scripting:script engine="Groovy">
                    <scripting:text><![CDATA[org.apache.log4j.Logger.getLogger("").error("Error Trace is : \n",exception)]]></scripting:text>
    </scripting:script>
   </scripting:transformer>
        </catch-exception-strategy>
       
    </flow>
</mule>

Post Comments And Suggestions !!



Wednesday, 16 July 2014

Mule Cron Job : Job Name Can Not be Empty Error

Writing cron job is very easy in mule.You might get error like this in mule application start up :
Caused by: org.mule.api.lifecycle.LifecycleException: Failed to start inbound endpoint "endpoint.quartz.test.job"
 at org.mule.endpoint.DefaultInboundEndpoint.start(DefaultInboundEndpoint.java:122)
 at org.mule.construct.AbstractFlowConstruct.startIfStartable(AbstractFlowConstruct.java:317)
 at org.mule.construct.AbstractPipeline.doStart(AbstractPipeline.java:302)
 at org.mule.construct.AbstractFlowConstruct$2.onTransition(AbstractFlowConstruct.java:143)
 at org.mule.construct.AbstractFlowConstruct$2.onTransition(AbstractFlowConstruct.java:139)
 at org.mule.lifecycle.AbstractLifecycleManager.invokePhase(AbstractLifecycleManager.java:141)
 at org.mule.construct.FlowConstructLifecycleManager.fireStartPhase(FlowConstructLifecycleManager.java:95)
 at org.mule.construct.AbstractFlowConstruct.start(AbstractFlowConstruct.java:138)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 at java.lang.reflect.Method.invoke(Method.java:601)
 at org.mule.lifecycle.phases.DefaultLifecyclePhase.applyLifecycle(DefaultLifecyclePhase.java:225)
 at org.mule.lifecycle.RegistryLifecycleManager$RegistryLifecycleCallback.onTransition(RegistryLifecycleManager.java:276)
 at org.mule.lifecycle.RegistryLifecycleManager.invokePhase(RegistryLifecycleManager.java:155)
 at org.mule.lifecycle.RegistryLifecycleManager.fireLifecycle(RegistryLifecycleManager.java:126)
 at org.mule.registry.AbstractRegistryBroker.fireLifecycle(AbstractRegistryBroker.java:80)
 at org.mule.registry.MuleRegistryHelper.fireLifecycle(MuleRegistryHelper.java:120)
 at org.mule.lifecycle.MuleContextLifecycleManager$MuleContextLifecycleCallback.onTransition(MuleContextLifecycleManager.java:94)
 at org.mule.lifecycle.MuleContextLifecycleManager$MuleContextLifecycleCallback.onTransition(MuleContextLifecycleManager.java:90)
 at org.mule.lifecycle.MuleContextLifecycleManager.invokePhase(MuleContextLifecycleManager.java:72)
 at org.mule.lifecycle.MuleContextLifecycleManager.fireLifecycle(MuleContextLifecycleManager.java:64)
 at org.mule.DefaultMuleContext.start(DefaultMuleContext.java:250)
 at org.mule.module.launcher.application.DefaultMuleApplication.start(DefaultMuleApplication.java:151)
 ... 4 more
Caused by: org.mule.api.lifecycle.LifecycleException: Failed to start Quartz receiver
 at org.mule.lifecycle.AbstractLifecycleManager.invokePhase(AbstractLifecycleManager.java:156)
 at org.mule.transport.ConnectableLifecycleManager.fireStartPhase(ConnectableLifecycleManager.java:51)
 at org.mule.transport.AbstractTransportMessageHandler.start(AbstractTransportMessageHandler.java:318)
 at org.mule.transport.AbstractConnector.registerListener(AbstractConnector.java:1259)
 at org.mule.endpoint.DefaultInboundEndpoint.start(DefaultInboundEndpoint.java:108)
 ... 27 more
Caused by: org.mule.api.endpoint.EndpointException: Failed to start Quartz receiver
 at org.mule.transport.quartz.QuartzMessageReceiver.doStart(QuartzMessageReceiver.java:195)
 at org.mule.transport.AbstractMessageReceiver.doStartHandler(AbstractMessageReceiver.java:484)
 at org.mule.transport.AbstractTransportMessageHandler$3.onTransition(AbstractTransportMessageHandler.java:322)
 at org.mule.lifecycle.AbstractLifecycleManager.invokePhase(AbstractLifecycleManager.java:141)
 ... 31 more
Caused by: java.lang.IllegalArgumentException: Job name cannot be empty.
 at org.quartz.JobDetail.setName(JobDetail.java:192)
 at org.mule.transport.quartz.QuartzMessageReceiver.doStart(QuartzMessageReceiver.java:95)
 ... 34 more

Here's the xml file :
<?xml version="1.0" encoding="UTF-8"?>

<mule xmlns:quartz="http://www.mulesoft.org/schema/mule/quartz" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:spring="http://www.springframework.org/schema/beans" version="CE-3.3.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="
http://www.mulesoft.org/schema/mule/quartz http://www.mulesoft.org/schema/mule/quartz/current/mule-quartz.xsd 
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd 
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd ">
    <flow name="crontestFlow1" doc:name="crontestFlow1">
        <quartz:inbound-endpoint jobName="test_job" cronExpression="0 0/100 * * * ?" responseTimeout="10000" doc:name="Price File Report Quartz Job" >
   <quartz:event-generator-job>
   </quartz:event-generator-job>
  </quartz:inbound-endpoint>
        <logger level="INFO" doc:name="Logger"/>
    </flow>
</mule>

Notice that your jobName is not empty . The issue is with underscore . you can not have underscore in jobName property. Just remove underscore from jobName and it will run fine.You can not have white space characters in job name either

Here's the bug.

Post Comments And Suggestions !!

Wednesday, 25 June 2014

Mule File Inbound And Threads

Requirement : File inbound endpoint should pick only limited number of files , once these files are processed then only file inbound should pick other files in the directory .


For this situation , we can use processing strategy as synchronous in our flow . This strategy will pick only one file at a time which is not good .

If we set receiver threading profile on file inbound , it also does not work because file poller keeps acquiring the files after the time period, while some files are still being processed . The other solution is to use fork and join pattern of mule which is explained below .

First we create a custom file component which will give us the list of required number of files .Number of files will be configurable.
package com.javaroots;
import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.mule.api.MuleEventContext;
import org.mule.api.lifecycle.Callable;


public class FilePollerComponent implements Callable
{

 private String pollDir ;
 
 private int numberOfFiles;
 
 public String getPollDir()
 {
  return pollDir;
 }

 public void setPollDir(String pollDir)
 {
  this.pollDir = pollDir;
 }
 
 

 public int getNumberOfFiles()
 {
  return numberOfFiles;
 }

 public void setNumberOfFiles(int numberOfFiles)
 {
  if(numberOfFiles < 1 )
   throw new RuntimeException("Number of files can not be less than 1");
  this.numberOfFiles = numberOfFiles;
 }

 @Override
 public Object onCall(MuleEventContext eventContext) throws Exception
 {
  File f = new File(pollDir);
  List filesToReturn = new ArrayList(numberOfFiles);
  if(f.isDirectory())
  {
   File[] files = f.listFiles();
   int i = 0;
   for(File file : files)
   {
    if(i==numberOfFiles)
     break ;
    if(file.isFile())
    {
     filesToReturn.add(file);
     i++;
    }
   }
  }
  else
  {
   throw new Exception("Invalid Directory");
  }
  return filesToReturn;
 }

}
And the flow will be like this :
<?xml version="1.0" encoding="UTF-8"?>

<mule xmlns:vm="http://www.mulesoft.org/schema/mule/vm"
 xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:spring="http://www.springframework.org/schema/beans" version="CE-3.3.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="
http://www.mulesoft.org/schema/mule/vm http://www.mulesoft.org/schema/mule/vm/current/mule-vm.xsd 
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd 
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd ">

<spring:beans>
<spring:bean id="filePoller" class="com.javaroots.FilePollerComponent">
<spring:property name="pollDir" value="E:/fileTest"></spring:property>
<spring:property name="numberOfFiles" value="3"></spring:property>


</spring:bean>

</spring:beans>

<flow name="fileInboundTestFlow" doc:name="fileInboundTestFlow" processingStrategy="synchronous">
     <poll frequency="200000">
      <component doc:name="File Poller">
       <spring-object bean="filePoller"/>
      </component>
     </poll>
     <logger message="Size of payload is : #[message.payload.size()]" level="INFO"/>
       <choice doc:name="Choice"> 
                <when expression="#[message.payload.size() &gt; 0]"> 
       <request-reply >
      <vm:outbound-endpoint path="out" >
        <collection-splitter />
      </vm:outbound-endpoint>
      <vm:inbound-endpoint path="response">
       <message-properties-transformer>
        <add-message-property key="MULE_CORRELATION_GROUP_SIZE" value="3" />
       </message-properties-transformer>
      <collection-aggregator/>
      </vm:inbound-endpoint>      
    </request-reply>
   </when>
   <otherwise>
     <logger />
   </otherwise>
  </choice>
    </flow>
    
    <flow name="processor" >
     <vm:inbound-endpoint path="out"/>
      <component class="com.javaroots.SleepComponent" doc:name="sleep"/>
      <vm:outbound-endpoint path="response"/>
    </flow>

</mule>


In the flow , first we put our custom file poller component which will give us list of files not more than 3 . Then we create request reply which will process this list , and it will wait untill all three files are processed . The actual processing of each individual file will happen in another flow , where i have put a sleep component .Request reply passes each payload to vm outbound and at the same vm , the other flow will listen .

Once the flow completes its processing , it returns the response to request reply flow . Collection aggregator blocks untill response from all the three files comes back .So in this way we can control number of files to be processed .

make sure that MULE_CORRELATION_GROUP_SIZE is equal to numberOfFiles which we want to be processed concurrently.

This solution is provided by David Dossot on my stack overflow question

You can see the full source code here

Post Comments and Suggestions !!!