Showing posts with label WSO2 ESB. Show all posts
Showing posts with label WSO2 ESB. Show all posts

Wednesday, August 3, 2016



In this Post I will explain How we can receive Emails through WSO2 ESB Mailto transport and perform some operations on it.

1. First lets Enable the transport. Open "repository/conf/axis2/axis2.xml" and uncomment the following section.


<transportReceiver name="mailto" class="org.apache.axis2.transport.mail.MailTransportListener">
        <!-- configure any optional POP3/IMAP properties
        check com.sun.mail.pop3 and com.sun.mail.imap package documentation for more details-->
    </transportReceiver>


2. Now lets create a proxy service to consumes the Emails. You can Copy and paste the following proxy service to source view to create the proxy. Make sure you change access parameters accordingly.



<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="JasperEmailPOP3"
       transports="mailto"
       statistics="disable"
       trace="disable"
       startOnLoad="true">
   <target>
      <inSequence>
         <property name="senderAddress"
                   expression="get-property('transport', 'From')"
                   scope="default"
                   type="STRING"/>
         <log level="custom">
            <property name="Date" expression="$trp:Date"/>
            <property name="Subject" expression="$trp:Subject"/>
            <property name="Content-Type" expression="$trp:Content-Type"/>
            <property name="From" expression="$trp:From"/>
         </log>
         <drop/>
      </inSequence>
      <outSequence>
         <send/>
      </outSequence>
   </target>
   <parameter name="mail.pop3.socketFactory.class">javax.net.ssl.SSLSocketFactory</parameter>
   <parameter name="transport.PollInterval">5</parameter>
   <parameter name="mail.pop3.host">pop.gmail.com</parameter>
   <parameter name="mail.pop3.user">ycwso2test</parameter>
   <parameter name="transport.mail.Protocol">pop3</parameter>
   <parameter name="mail.pop3.socketFactory.port">995</parameter>
   <parameter name="transport.mail.Address">ycwso2test@gmail.com</parameter>
   <parameter name="mail.pop3.password">wso2qa123</parameter>
   <parameter name="mail.pop3.port">995</parameter>
   <parameter name="mail.pop3.socketFactory.fallback">false</parameter>
   <description/>
</proxy>


3. Now Send a Email to your Email account and you will see the following log in backlogs.


[2016-08-03 12:10:05,232]  INFO - LogMediator Date = Wed, 3 Aug 2016 12:09:25 +0530, Subject = This is a Test, Content-Type = multipart/alternative; boundary=001a11402208fef0bb0539251978, From = Yasassri Ratnayake <ycrnet@gmail.com>


So thats it. If you cannot get this to work you can enable Debug logs and check whats wrong. To do this add the following line to repository/conf/log4j.properties and restart the ESB server.

log4j.logger.org.apache.axis2.transport.mail.MailTransportListener=DEBUG



Thursday, April 7, 2016

In this post I'm going to create a proxy service using WSO2 ESB to Pull a message from ActiveMQ and to push that Message to IBM MQ (WebSphere MQ). If you need to configure IBM MQ you can follow this Post. And to configure ESB with ActiveMQ you can follow this post.

After configuring ActiveMQ and IBM MQ you need to add the following transports. (If you have already added this do not add).

The issue here is, for both ActiveMQ and IBMMQ you need two different transport configurations. So you can achieve this by referring the following axis2 configurations.

Transport Receivers


<!-- This is for IBM MQ -->
<transportReceiver name="jmsin" class="org.apache.axis2.transport.jms.JMSListener">
  <parameter name="default" locked="false">
    <parameter name="java.naming.factory.initial" locked="false">com.sun.jndi.fscontext.RefFSContextFactory</parameter>
    <parameter name="java.naming.provider.url" locked="false">file:/C:/jndi-dir</parameter>
    <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">MyQueueConnectionFactory</parameter>
    <parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter>
    <parameter name="transport.jms.UserName" locked="false">admin</parameter>
    <parameter name="transport.jms.Password" locked="false">admin</parameter>
  </parameter>

  <parameter name="myQueueConnectionFactory1" locked="false">
    <parameter name="java.naming.factory.initial" locked="false">com.sun.jndi.fscontext.RefFSContextFactory</parameter>
    <parameter name="java.naming.provider.url" locked="false">file:/C:/jndi-dir</parameter>
    <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">MyQueueConnectionFactory</parameter>
    <parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter>
    <parameter name="transport.jms.UserName" locked="false">admin</parameter>
    <parameter name="transport.jms.Password" locked="false">admin</parameter>
  </parameter>
</transportReceiver>

<!-- This is for ActiveMQ -->

<transportReceiver name="jmsamq" class="org.apache.axis2.transport.jms.JMSListener">
       <parameter name="myTopicConnectionFactory" locked="false">
           <parameter name="java.naming.factory.initial" locked="false">org.apache.activemq.jndi.ActiveMQInitialContextFactory</parameter>
           <parameter name="java.naming.provider.url" locked="false">tcp://localhost:61616</parameter>
           <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">TopicConnectionFactory</parameter>
            <parameter name="transport.jms.ConnectionFactoryType" locked="false">topic</parameter>
       </parameter>
  
       <parameter name="myQueueConnectionFactory" locked="false">
           <parameter name="java.naming.factory.initial" locked="false">org.apache.activemq.jndi.ActiveMQInitialContextFactory</parameter>
           <parameter name="java.naming.provider.url" locked="false">tcp://localhost:61616</parameter>
           <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">QueueConnectionFactory</parameter>
            <parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter>
       </parameter>
  
       <parameter name="default" locked="false">
           <parameter name="java.naming.factory.initial" locked="false">org.apache.activemq.jndi.ActiveMQInitialContextFactory</parameter>
           <parameter name="java.naming.provider.url" locked="false">tcp://localhost:61616</parameter>
           <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">QueueConnectionFactory</parameter>
            <parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter>
       </parameter>
   </transportReceiver>



Transport Senders


<!-- For IBM MQ -->
<transportSender name="jms" class="org.apache.axis2.transport.jms.JMSSender">
  <parameter name="default" locked="false">
    <parameter name="java.naming.factory.initial" locked="false">com.sun.jndi.fscontext.RefFSContextFactory</parameter>
    <parameter name="java.naming.provider.url" locked="false">file:/C:/jndi-dir</parameter>
    <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">MyQueueConnectionFactory</parameter>
    <parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter>
    <parameter name="transport.jms.UserName" locked="false">admin</parameter>
    <parameter name="transport.jms.Password" locked="false">admin</parameter>
  </parameter>

  <parameter name="myQueueConnectionFactory1" locked="false">
    <parameter name="java.naming.factory.initial" locked="false">com.sun.jndi.fscontext.RefFSContextFactory</parameter>
    <parameter name="java.naming.provider.url" locked="false">file:/C:/jndi-dir</parameter>
    <parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">MyQueueConnectionFactory</parameter>
    <parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter>
    <parameter name="transport.jms.UserName" locked="false">admin</parameter>
    <parameter name="transport.jms.Password" locked="false">admin</parameter>
  </parameter>
</transportSender>


Now when you are creating a proxy the transports you defined will be listed under the transport section.

Now create the following proxy service

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="LocalQueue1"
       transports="jmsamq"
       statistics="disable"
       trace="disable"
       startOnLoad="true">
   <target>
      <inSequence>
         <property name="FORCE_SC_ACCEPTED" value="true" scope="axis2"/>
         <property name="OUT_ONLY" value="true" scope="default" type="STRING"/>
         <property name="JMS_COORELATION_ID"
                   value="12345"
                   scope="axis2"
                   type="STRING"/>
         <property name="JMS_DESTINATION" scope="transport" action="remove"/>
         <property name="JMS_REDELIVERED" scope="transport" action="remove"/>
         <property name="JMS_TYPE" scope="transport" action="remove"/>
         <property name="Accept-Encoding" scope="transport" action="remove"/>
         <property name="Content-Length" scope="transport" action="remove"/>
         <property name="Content-Type" scope="transport" action="remove"/>
         <property name="User-Agent" scope="transport" action="remove"/>
         <property name="Transfer-Encoding" scope="transport" action="remove"/>
         <property name="X-Forwarded-For" scope="transport" action="remove"/>
         <property name="X-Forwarded-Host" scope="transport" action="remove"/>
         <property name="X-Forwarded-Server" scope="transport" action="remove"/>
         <log level="full"/>
      </inSequence>
      <endpoint>
         <address uri="jms:/LocalQueue1?transport.jms.ConnectionFactoryJNDIName=MyQueueConnectionFactory&amp;java.naming.factory.initial=com.sun.jndi.fscontext.RefFSContextFactory&amp;java.naming.provider.url=file:/C:/jndi-dir/&amp;transport.jms.DestinationType=queue&amp;"/>
      </endpoint>
   </target>
   <description/>
</proxy>

                             
In the above proxy I have enabled jmsamq transport so it will Poll the queue specified for ActiveMQ and push the message to endpoint which is a queue in IBM MQ.

Also note all the header properties I have set and removed, In IBMMQ some header properties that are sent with the message may not be supported. You can refer this to get a better understanding of supported properties. So we need to specifically remove any unsupported headers if any. Or else you will come across the following error.


[2015-12-28 14:41:58,817] INFO - ProxyServiceDeployer ProxyService named 'EsbMQMtmOutbound' has been update from file :
C:\apps\wso2\wso2esb-4.8.1\repository\deployment\server\synapse-configs\default\proxy-services\EsbMQMtmOutbound.xml
[2015-12-28 14:42:26,233] ERROR - JMSSender Error creating a JMS message from the message context
com.ibm.msg.client.jms.DetailedMessageFormatException: JMSCC0049: The property name 'Content-Type' is not a valid Java(t
m) identifier.
The supplied property name does not conform to the allowed format described in the JMS specification.
Check the characters used in the property name and modify as necessary.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at com.ibm.msg.client.commonservices.j2se.NLSServices.createException(NLSServices.java:319)
at com.ibm.msg.client.commonservices.nls.NLSServices.createException(NLSServices.java:233)
at com.ibm.msg.client.jms.internal.JmsErrorUtils.createException(JmsErrorUtils.java:109)
at com.ibm.msg.client.jms.internal.JmsMessageImpl.checkPropName(JmsMessageImpl.java:2033)
at com.ibm.msg.client.jms.internal.JmsMessageImpl.setStringProperty(JmsMessageImpl.java:1559)
at com.ibm.jms.JMSMessage.setStringProperty(JMSMessage.java:1496)
at org.apache.axis2.transport.jms.JMSUtils.setTransportHeaders(JMSUtils.java:316)
at org.apache.axis2.transport.jms.JMSSender.createJMSMessage(JMSSender.java:449)
at org.apache.axis2.transport.jms.JMSSender.sendOverJMS(JMSSender.java:175)
at org.apache.axis2.transport.jms.JMSSender.sendMessage(JMSSender.java:157)
at org.apache.axis2.transport.base.AbstractTransportSender.invoke(AbstractTransportSender.java:112)
at org.apache.axis2.engine.AxisEngine$TransportNonBlockingInvocationWorker.run(AxisEngine.java:626)
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:744)
[2015-12-28 14:42:26,324] INFO - AxisEngine [MessageContext: logID=3283eebc6424ae00536a3adb43db8bf0cf6e3c456624e6fc] Er
ror creating a JMS message from the message context
[2015-12-28 14:42:26,326] ERROR - AsyncCallback Error creating a JMS message from the message context
org.apache.axis2.AxisFault: Error creating a JMS message from the message context
at org.apache.axis2.transport.base.AbstractTransportSender.handleException(AbstractTransportSender.java:226)
at org.apache.axis2.transport.jms.JMSSender.sendOverJMS(JMSSender.java:177)
at org.apache.axis2.transport.jms.JMSSender.sendMessage(JMSSender.java:157)
at org.apache.axis2.transport.base.AbstractTransportSender.invoke(AbstractTransportSender.java:112)
at org.apache.axis2.engine.AxisEngine$TransportNonBlockingInvocationWorker.run(AxisEngine.java:626)
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:744)
Caused by: com.ibm.msg.client.jms.DetailedMessageFormatException: JMSCC0049: The property name 'Content-Type' is not a v
alid Java(tm) identifier.
The supplied property name does not conform to the allowed format described in the JMS specification.
Check the characters used in the property name and modify as necessary.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at com.ibm.msg.client.commonservices.j2se.NLSServices.createException(NLSServices.java:319)
at com.ibm.msg.client.commonservices.nls.NLSServices.createException(NLSServices.java:233)
at com.ibm.msg.client.jms.internal.JmsErrorUtils.createException(JmsErrorUtils.java:109)
at com.ibm.msg.client.jms.internal.JmsMessageImpl.checkPropName(JmsMessageImpl.java:2033)
at com.ibm.msg.client.jms.internal.JmsMessageImpl.setStringProperty(JmsMessageImpl.java:1559)
at com.ibm.jms.JMSMessage.setStringProperty(JMSMessage.java:1496)
at org.apache.axis2.transport.jms.JMSUtils.setTransportHeaders(JMSUtils.java:316)
at org.apache.axis2.transport.jms.JMSSender.createJMSMessage(JMSSender.java:449)
at org.apache.axis2.transport.jms.JMSSender.sendOverJMS(JMSSender.java:175)
... 6 more
[2015-12-28 14:42:26,336] WARN - AsyncCallback Executing fault handler due to exception encountered
[2015-12-28 14:42:26,339] WARN - EndpointContext Endpoint : AnonymousEndpoint will be marked SUSPENDED as it failed
[2015-12-28 14:42:26,340] WARN - EndpointContext Suspending endpoint : AnonymousEndpoint - current suspend duration is
: 30000ms - Next retry after : Mon Dec 28 14:42:56 PST 2015


Hope this will help someone interested and please drop a comment if you have any queries.


Friday, March 11, 2016



In some cases you might want to read the system date and get it into the ESB and perform an action based on the time. The easiest way to do this is by using the property mediator and using default synapse properties.

You can do this in the following manner.


<property name="StrigVal"
                   expression="get-property('SYSTEM_DATE')"
                   scope="default"
                   type="STRING"/>


A full proxy service that uses the default SYSTEM_DATE.



<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="Proxy"
       transports="http,https"
       statistics="enable"
       trace="enable"
       startOnLoad="true">
   <target>
      <inSequence>
         <property name="StrigVal"
                   expression="get-property('SYSTEM_DATE')"
                   scope="default"
                   type="STRING"/>
         <log level="custom">
            <property name="StrigVal ==" expression="$ctx:StrigVal"/>
         </log>
      </inSequence>
      <outSequence>
         <log level="custom">
            <property name="StrigVal-out SEQ ==" expression="$ctx:StrigVal"/>
         </log>
      </outSequence>
      <endpoint>
         <address uri="http://www.mocky.io/v2/56e2821f2600003c35eaa2f8"/>
      </endpoint>
   </target>
   <description/>
</proxy>
                                

The Above Proxy will log the following.


INFO - LogMediator StrigVal-out SEQ == = 3/11/16 3:06 PM

Sunday, February 14, 2016

In this post I'll explain you how to save a request body to a file using WSO2 ESB. Here the approach I'm using is File connector. I'm using ESB 4.9 and File connector 2.0.

Note the File connector version I'm using because the syntax/key words differ from connector version to version.

The message flow is depicted as shown below.



To achieve the above use case we can use two approaces.

1. Using VFS transport.

a. Fist you need to enable VFS transport in ESB. To do this follow this.

b. Now create the following API.

<api xmlns="http://ws.apache.org/ns/synapse" name="Api01" context="/api01">
   <resource methods="POST" uri-template="/write-file-system">
      <inSequence>
         <log level="full">
            <property name="====== WRITING THE " value=" FILE ========"/>
         </log>
         <property name="FORCE_SC_ACCEPTED" value="true" scope="axis2" type="STRING"/>
         <property name="REST_URL_POSTFIX" value="" scope="axis2"/>
         <property name="OUT_ONLY" value="true" scope="default" type="STRING"/>
         <property name="transport.vfs.ReplyFileName" value="Hello55.txt" scope="transport" type="STRING"/>
         <log level="custom" separator=",">
            <property name="Output file" expression="$trp:transport.vfs.ReplyFileName"/>
         </log>
         <send>
            <endpoint>
               <address uri="vfs:ftp://ftpuser:ftpuser@localhost/files/in"/>
            </endpoint>
         </send>
      </inSequence>
      <outSequence/>
      <faultSequence/>
   </resource>
</api>

Note : In the above API I'm using a uri-template, If you use a uri-template the context will be appended to the end of the endpoint. So the ESB will try to access a location with the attached context which might cause issues. So to avoid this I'm using the following property to nullify the appending context.

<property name="REST_URL_POSTFIX" value="" scope="axis2"/>

2. You can achieve the same with file connector as well.  Inorder to use file connector you need to install the file connector first. You can refer [1] for more details.

a. After installing the connector and enabling it you can create the following API to achieve the requirement.

<api xmlns="http://ws.apache.org/ns/synapse" name="Api01" context="/api01">
   <resource methods="POST" uri-template="/write-file-system">
      <inSequence>
         <log level="full">
            <property name="In The API ==============" value="==================="/>
         </log>
         <property name="FORCE_SC_ACCEPTED" value="true" scope="axis2" type="STRING"/>
         <property name="OUT_ONLY" value="true" scope="default" type="STRING"/>
         <property name="transport.vfs.ReplyFileName" value="HelloConnector.txt" scope="transport" type="STRING"/>
         <property name="uri" value="ftp://ftpuser:ftpuser@192.168.48.119/files/in/" type="STRING"/>
         <log level="custom" separator=",">
            <property name="Output file" expression="$trp:transport.vfs.ReplyFileName"/>
         </log>
         <fileconnector.create>
            <source>{fn:concat($ctx:uri,$trp:transport.vfs.ReplyFileName)}</source>
            <inputContent>{$body}</inputContent>
         </fileconnector.create>
      </inSequence>
      <outSequence/>
      <faultSequence/>
   </resource>
</api>

Please drop a comment if you have any queries

[1] - https://store.wso2.com/store/assets/esbconnector/aec1554a-29ea-4dbb-b8c5-5d529a853aa2




Subscribe to RSS Feed Follow me on Twitter!