I am trying to configure JMS Transport with ActiveMQ in WSO2 ESB 5.0.0. I have followed the instructions in https://docs.wso2.com/display/ESB500/Configure+with+ActiveMQ with no success.
My ActiveMQ version is 5.10.
When I send a message through the JMS Endpoit I get this error:
TID: [-1234] [] [2016-10-11 17:42:15,618] ERROR {org.apache.synapse.core.axis2.Axis2Sender} - Unexpected error during sending message out {org.apache.synapse.core.axis2.Axis2Sender}
java.lang.ClassCastException: org.apache.activemq.ActiveMQConnectionFactory cannot be cast to javax.jms.XAConnectionFactory
at org.apache.axis2.transport.jms.JMSOutTransportInfo.createJMSSender(JMSOutTransportInfo.java:377)
at org.apache.axis2.transport.jms.JMSSender.sendMessage(JMSSender.java:135)
at org.apache.axis2.transport.base.AbstractTransportSender.invoke(AbstractTransportSender.java:112)
at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:442)
at org.apache.axis2.description.OutOnlyAxisOperationClient.executeImpl(OutOnlyAxisOperation.java:297)
at org.apache.axis2.client.OperationClient.execute(OperationClient.java:149)
at org.apache.synapse.core.axis2.Axis2FlexibleMEPClient.send(Axis2FlexibleMEPClient.java:581)
at org.apache.synapse.core.axis2.Axis2Sender.sendOn(Axis2Sender.java:78)
at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.send(Axis2SynapseEnvironment.java:512)
at org.apache.synapse.endpoints.AbstractEndpoint.send(AbstractEndpoint.java:382)
at org.apache.synapse.endpoints.AddressEndpoint.send(AddressEndpoint.java:65)
at org.apache.synapse.endpoints.TemplateEndpoint.sendMessage(TemplateEndpoint.java:74)
at org.apache.synapse.endpoints.TemplateEndpoint.send(TemplateEndpoint.java:66)
at org.apache.synapse.endpoints.ResolvingEndpoint.sendMessage(ResolvingEndpoint.java:74)
at org.apache.synapse.endpoints.ResolvingEndpoint.send(ResolvingEndpoint.java:58)
at org.apache.synapse.mediators.builtin.SendMediator.mediate(SendMediator.java:121)
at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:97)
at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:59)
at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:158)
at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:330)
at org.apache.synapse.core.axis2.SynapseCallbackReceiver.handleMessage(SynapseCallbackReceiver.java:554)
at org.apache.synapse.core.axis2.SynapseCallbackReceiver.receive(SynapseCallbackReceiver.java:188)
at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180)
at org.apache.synapse.transport.passthru.ClientWorker.run(ClientWorker.java:261)
at org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172)
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:745)
This exception is thrown just when we use XA Transaction. Otherwise it works properly.
Any help?
If you use ActiveMQ 5.10, you need to put in /lib directory to the
/repository/components/lib directory the following files:
activemq-broker-5.10.0.jar
activemq-client-5.10.0.jar
geronimo-j2ee-management_1.1_spec-1.0.1.jar
geronimo-jms_1.1_spec-1.1.1.jar
hawtbuf-1.10.jar
Not the files listed in https://docs.wso2.com/display/ESB500/Configure+with+ActiveMQ
ActiveMQ has a XA connection factory:
Specify: org.apache.activemq.ActiveMQXAConnectionFactory
As you are using Active MQ version 5.10, you have to add following jars from version 5.8 into $ESB_HOME/repository/components/lib.
activemq-broker-5.8.0.jar
activemq-client-5.8.0.jar
geronimo-jms_1.1_spec-1.1.1.jar
geronimo-j2ee-management_1.1_spec-1.0.1.jar
And uncomment JMS transport listener and JMS transport receiver in /repository/conf/axis2/axis2.xml .
<transportReceiver name="jms" 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>
<transportSender name="jms" class="org.apache.axis2.transport.jms.JMSSender"/>
Then start the server.
You have to check your configurations according to your scenario[1].
When ESB sends to a jms endpoint sample code will be as follows:
<proxy xmlns="http://ws.apache.org/ns/synapse" name="StockQuoteProxy" transports="http">
<target>
<inSequence>
<property action="set" name="OUT_ONLY" value="true"/>
<send>
<endpoint>
<address uri="jms:/SimpleStockQuoteService?transport.jms.ConnectionFactoryJNDIName=QueueConnectionFactory& java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory&java.naming.provider.url=tcp://localhost:61616&transport.jms.DestinationType=queue"/>
</endpoint>
</send>
</inSequence>
<outSequence>
<send/>
</outSequence>
</target>
<publishWSDL uri="file:repository/samples/resources/proxy/sample_proxy_1.wsdl"/>
</proxy>
Your error indicating about issue with a JMS sender. Specially check your configurations within axis2 and the proxy configs that you define jms endpoint.
[1] https://docs.wso2.com/display/ESB500/JMS+Usecases
Related
I have the next error in the product WSO2 EI 6.6.0.
{org.apache.synapse.transport.passthru.PassThroughHttpSSLSender} - System may be unstable: HTTPS ConnectingIOReactor encountered a runtime exception : null java.lang.NullPointerException
at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:193)
at org.apache.synapse.transport.http.conn.ClientSSLSetupHandler$1.verify(ClientSSLSetupHandler.java:82)
at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:159)
at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:147)
at org.apache.synapse.transport.http.conn.ClientSSLSetupHandler.verify(ClientSSLSetupHandler.java:181)
at org.apache.http.nio.reactor.ssl.SSLIOSession.doHandshake(SSLIOSession.java:313)
at org.apache.http.nio.reactor.ssl.SSLIOSession.isAppInputReady(SSLIOSession.java:424)
at org.apache.http.impl.nio.reactor.AbstractIODispatch.inputReady(AbstractIODispatch.java:119)
at org.apache.http.impl.nio.reactor.BaseIOReactor.readable(BaseIOReactor.java:159)
at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvent(AbstractIOReactor.java:338)
at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvents(AbstractIOReactor.java:316)
at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:277)
at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:105)
at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:586)
at java.lang.Thread.run(Thread.java:748)
I am only trying to do a call mediator
<call>
<endpoint name="GETToken">
<address uri="api.backend"/>
</endpoint>
</call>
I am using a proxy in the axis2.xml file and in the integrator.sh file like:
axis2.xml
<transportSender name="http" class="org.apache.synapse.transport.passthru.PassThroughHttpSender">
<parameter name="non-blocking" locked="false">true</parameter>
<!--<parameter name="warnOnHTTP500" locked="false">*</parameter>
<parameter name="http.proxyHost" locked="false">proxy.com</parameter>
<parameter name="http.proxyPort" locked="false">8080</parameter>-->
<parameter name="http.nonProxyHosts" locked="false">.*.domain.com|localhost|10.*.*.*</parameter>
</transportSender>
<transportSender name="https" class="org.apache.synapse.transport.passthru.PassThroughHttpSSLSender">
<parameter name="non-blocking" locked="false">true</parameter>
<!--<parameter name="http.proxyHost" locked="false">proxy.com</parameter>
<parameter name="http.proxyPort" locked="false">8080</parameter> -->
<parameter name="http.nonProxyHosts" locked="false">.*.domain.com|localhost|10.*.*.*</parameter>
<parameter name="keystore" locked="false">
integrator.sh
-Dhttps.proxyHost="proxy.com" \
-Dhttps.proxyPort="8080" \
-Dhttp.proxyHost="proxy.com" \
-Dhttp.proxyPort="8080" \
-Dhttp.nonProxyHosts="localhost|10.*.*.*|*.domain.com" \
I see the next question, but it hasn't any response:
Error in EI - System may be unstable: HTTPS ConnectingIOReactor encountered a runtime exception
The problem was related with HostName verification, so I change the next line
<parameter name="HostnameVerifier">Strict|AllowAll|DefaultAndLocalhost</parameter>
in the axis2.xml that you can find in the route: wso2ei-6.6.0\conf\axis2
I am trying to connect WSO2 Enterprise Integrator with IBM Websphere MQ v 8.0.0.5 by JMS Transport. The purpose is to be able to receive/publish messages on Queues that are made in IBM Websphere MQ via WSO2 Enterprise Integrator using JMS Protocol.
Link:
I followed this link provided by WSO2 official documentation. I followed all the steps exactly but when I deploy the JMS Listener Proxy, it becomes a faulty service and It shows me the following error on the console:
Error Stack Trace:
com.ibm.mq.MQException: JMSCMQ0001: WebSphere MQ call failed with compcode '2' ('MQCC_FAILED') reason '2035' ('MQRC_NOT_AUTHORIZED').
at com.ibm.msg.client.wmq.common.internal.Reason.createException(Reason.java:203)
at com.ibm.msg.client.wmq.internal.WMQConnection.<init>(WMQConnection.java:412)
at com.ibm.msg.client.wmq.factories.WMQConnectionFactory.createV7ProviderConnection(WMQConnectionFactory.java:8475)
at com.ibm.msg.client.wmq.factories.WMQConnectionFactory.createProviderConnection(WMQConnectionFactory.java:7913)
at com.ibm.msg.client.jms.admin.JmsConnectionFactoryImpl._createConnection(JmsConnectionFactoryImpl.java:299)
at com.ibm.msg.client.jms.admin.JmsConnectionFactoryImpl.createConnection(JmsConnectionFactoryImpl.java:236)
at com.ibm.mq.jms.MQConnectionFactory.createCommonConnection(MQConnectionFactory.java:6024)
at com.ibm.mq.jms.MQQueueConnectionFactory.createQueueConnection(MQQueueConnectionFactory.java:136)
at com.ibm.mq.jms.MQQueueConnectionFactory.createConnection(MQQueueConnectionFactory.java:209)
at org.apache.axis2.transport.jms.JMSUtils.createConnection(JMSUtils.java:786)
at org.apache.axis2.transport.jms.JMSListener.checkJMSConnection(JMSListener.java:155)
at org.apache.axis2.transport.jms.JMSListener.startEndpoint(JMSListener.java:99)
at org.apache.axis2.transport.jms.JMSListener.startEndpoint(JMSListener.java:54)
at org.apache.axis2.transport.base.AbstractTransportListenerEx.startListeningForService(AbstractTransportListenerEx.java:154)
at org.apache.axis2.transport.base.AbstractTransportListener.internalStartListeningForService(AbstractTransportListener.java:213)
at org.apache.axis2.transport.base.AbstractTransportListener$2.serviceAdded(AbstractTransportListener.java:126)
at org.apache.axis2.transport.base.tracker.AxisServiceTracker.serviceAdded(AxisServiceTracker.java:212)
at org.apache.axis2.transport.base.tracker.AxisServiceTracker$1.serviceUpdate(AxisServiceTracker.java:98)
at org.apache.axis2.engine.AxisConfiguration.notifyObservers(AxisConfiguration.java:666)
at org.apache.axis2.engine.AxisConfiguration.addServiceGroup(AxisConfiguration.java:420)
at org.apache.axis2.engine.AxisConfiguration.addService(AxisConfiguration.java:350)
at org.apache.synapse.core.axis2.ProxyService.buildAxisService(ProxyService.java:750)
at org.wso2.carbon.proxyadmin.service.ProxyServiceAdmin.addProxyService(ProxyServiceAdmin.java:273)
at org.wso2.carbon.proxyadmin.service.ProxyServiceAdmin.addProxy(ProxyServiceAdmin.java:710)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
Proxy Service Code as mentioned in documentation:
<proxy xmlns="http://ws.apache.org/ns/synapse"
name="MyJMSProxy"
transports="jms"
startOnLoad="true"
trace="disable">
<description/>
<target>
<inSequence>
<log level="full"/>
<drop/>
</inSequence>
</target>
<parameter name="transport.jms.Destination">LocalQueue1</parameter>
</proxy>
Axis2 File Configuration:
Following are axis2 configurations for transport receiver and transport listener.
Transport Receiver:
<transportReceiver name="jms" 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:/jndidirectory</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">omerk</parameter>
<parameter name="transport.jms.Password" locked="false">password</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:/jndidirectory</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">omerk</parameter>
<parameter name="transport.jms.Password" locked="false">password</parameter>
</parameter>
</transportReceiver>
Transport Listener:
<transportSender name="jms" class="org.apache.axis2.transport.jms.JMSSender">
<parameter name="default" locked="false">
<parameter name="vender.class.loader.enabled">false</parameter>
<parameter name="java.naming.factory.initial" locked="false">com.sun.jndi.fscontext.RefFSContextFactory</parameter>
<parameter name="java.naming.provider.url" locked="false">file:/C:/jndidirectory</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">omerk</parameter>
<parameter name="transport.jms.Password" locked="false">password</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:/jndidirectory</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">omerk</parameter>
<parameter name="transport.jms.Password" locked="false">password</parameter>
</parameter>
</transportSender>
Research So far:
I tried googling it and apparently it is showing that It is not able to figure out the Queue Manager Name. But I am unable to figure out where to add this information and how? I tried adding it on the JMS Proxy Service Level Parameters but it didn't work. So any insight would be helpful.
TroubleShooting
For Troubleshooting, when I checked the Error logs of IBM Websphere MQ. IT was giving the following error:
AMQ5534: User ID 'omerk' authentication failed
EXPLANATION:
The user ID and password supplied by the 'carbon.bootstrap.Bootstrap' program
could not be authenticated.
Solution:
For my solution the authentication was not a requirement. So I basically disabled the authentication of my queue manager by running the following commands.
ALTER AUTHINFO(SYSTEM.DEFAULT.AUTHINFO.IDPWOS) AUTHTYPE(IDPWOS) CHCKCLNT(NONE)
REFRESH SECURITY TYPE(CONNAUTH)
IT worked for me and solved my problem.
I am trying to override the JMS connection properties as outlined in the documentation:
https://docs.wso2.com/display/EI640/Using+the+ESB+as+a+JMS+Producer
You can define a JMS queue name and connection factory parameters in the JMS connection URL. Values of connection factory parameters depend on the type of the JMS broker.
I have multiple queue connection factories defined in my axis2.xml file to support multiple queue managers. However, the following configuration does not take effect (the messages are not sent to the right queue environment):
<endpoint name="myEndpoint" xmlns="http://ws.apache.org/ns/synapse">
<address format="pox" uri="jms://MY_QUEUE_NAME?transport.jms.ConnectionFactoryJNDIName=MYQUEUEQCF"/>
</endpoint>
The axis2 configuration matches with the above:
<transportSender name="jms" class="org.apache.axis2.transport.jms.JMSSender">
<parameter name="myConnectionFactory" 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:bindings</parameter>
<parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">OTHERQCF</parameter>
<parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter>
<parameter name="transport.jms.UserName" locked="false"></parameter>
<parameter name="transport.jms.Password" locked="false"></parameter>
</parameter>
<parameter name="secondConnectionFactory" 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:bindings</parameter>
<parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">MYQUEUEQCF</parameter>
<parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter>
<parameter name="transport.jms.UserName" locked="false"></parameter>
<parameter name="transport.jms.Password" locked="false"></parameter>
</parameter>
</transportSender>
The messages are going through the first connection factory, OTHERQCF, and not via MYQUEUEQCF as expected, so they are sent to the wrong environment. The queue technology used is WebSphere MQ.
Is this a bug or am I missing something?
I have also tried with the following config and it does not take effect:
<endpoint name="myEndpoint" xmlns="http://ws.apache.org/ns/synapse">
<address format="pox" uri="jms://MY_QUEUE_NAME?transport.jms.ConnectionFactoryJNDIName=MYQUEUEQCF&java.naming.factory.initial=com.sun.jndi.fscontext.RefFSContextFactory&java.naming.provider.url=file:bindings&transport.jms.DestinationType=queue"/>
</endpoint>
Finally found the solution: the WSO2 documentation is (as usual) incomplete and in this case, incorrect.
First of all, the second JMS producer must have CacheLevel above SESSION (i.e. value set to auto, consumer, or producer in axis.xml configuration, e.g.:
<parameter name="secondConnectionFactory" 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:bindings</parameter>
<parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">MYQUEUEQCF</parameter>
<parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter>
<parameter name="transport.jms.UserName" locked="false"></parameter>
<parameter name="transport.jms.Password" locked="false"></parameter>
<parameter name="transport.jms.CacheLevel" locked="false">producer</parameter>
</parameter>
This is because the JMSProducer will otherwise move to use the default connection factory based on the code on github.
Second of all, the documentation states the parameter name incorrectly. The parameter to use is called transport.jms.ConnectionFactory and not transport.jms.ConnectionFactoryJNDIName.
Additionally the parameter value is referring to the overall internal axis2 name of the connection factory, i.e. secondConnectionFactory in the example above, rather than the MYQUEUEQCF JNDI name.
So with the following configuration, the message is correctly sent to the second queue:
<endpoint name="myEndpoint" xmlns="http://ws.apache.org/ns/synapse">
<address format="pox" uri="jms://MY_QUEUE_NAME?transport.jms.ConnectionFactory=secondConnectionFactory&java.naming.factory.initial=com.sun.jndi.fscontext.RefFSContextFactory&java.naming.provider.url=file:bindings&transport.jms.DestinationType=queue"/>
</endpoint>
Not sure if it´s the same under EI 6.x but for esb 4.8 you had to define a second transport sender witch you then refer in the send/endpoint.
<transportSender name="jmsSecond" class="org.apache.axis2.transport.jms.JMSSender">
<parameter name="secondConnectionFactory" .....
</transportSender>
<endpoint name="myEndpoint" xmlns="http://ws.apache.org/ns/synapse">
<address format="pox" uri="jmsSecond://MY_QUEUE_NAME?transport.jms.ConnectionFactoryJNDIName=MYQUEUEQCF"/>
</endpoint>
I have a question,I new in ESB so I used the manual to create connection with my ESB and IBM MQ
https://docs.wso2.com/display/ESB460/Configure+with+IBM+WebSphere+MQ
on the end I create .bindings file and used. Everything worked fine. So Im able to read messages from Queues that exist in QueueManager.
QUESTION:
Am I need to rebuild .binding file every time when I create new Queue?
is there a way to use/see newly created Queues without rebuild a .binding file?
For connection in \repository\conf\axis2.xml I used
> <parameter name="transport.jms.ConnectionFactoryType" > locked="false">queue</parameter>
> <parameter name="transport.jms.UserName" locked="false">**myname**</parameter>
> <parameter name="transport.jms.Password" locked="false">**mypassword**</parameter>
I see this on http://nandikajayawardana.blogspot.com/search/label/WSo2%20ESB
but maybe I should use this
> <parameter name="transport.jms.ConnectionFactoryType"
> locked="false">**topic**</parameter>
> <parameter name="transport.jms.Destination">ivtT</parameter>
After I tried every single combination. Working solution in my case is :
WMQInitialContextFactory is not recommended... starting from version 8 IBM MQ they using ONLY RefFSContextFactory
so after creating .binding file the repository\conf\axis2.xml should look like
<parameter name="esbMngr" 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:/home/wso2admin/wso2esb-5.0.0/jndi</parameter>
<parameter name="transport.jms.ConnectionFactoryJNDIName" locked="false">GSTQueueConnectionFactory</parameter>
<parameter name="transport.jms.ConnectionFactoryType" locked="false">queue</parameter>
<parameter name="transport.jms.UserName" locked="false">userName</parameter>
<parameter name="transport.jms.Password" locked="false">userPassword</parameter>
</parameter>
.....
where GSTQueueConnectionFactory is ConectionFactory name that is defined in .binding file
So proxy server looks like :
<?xml version="1.0" encoding="UTF-8"?> <proxy xmlns="http://ws.apache.org/ns/synapse"
name="TMSLeaseMQParser"
startOnLoad="true"
statistics="disable"
trace="disable"
transports="jms">
<target>
<inSequence>
<log level="full">
</log>
</inSequence>
<outSequence>
<send/>
</outSequence>
<faultSequence/>
</target>
<parameter name="transport.jms.DestinationType">queue</parameter>
<parameter name="transport.jms.Destination">TMSALease</parameter>
<parameter name="transport.jms.ContentType">
<rules xmlns="">
<jmsProperty>contectType</jmsProperty>
<default>application/xml</default>
</rules>
</parameter>
<parameter name="transport.jms.ConnectionFactory">esbMngr</parameter> <description/>
</proxy>
So esbMngr is name of section defined in axis2.xml while TMSALease is your message queue that you are reading from IBM MQ
I hope is this is going to save some time someone ... Any feedback is welcome
NOTE: communication can be tricky. Be sure that you check that your userName have access to queue, read more in IBM Technote "2035 MQRC_NOT_AUTHORIZED Connecting to WebSphere MQ from WebSphere Application Server via CLIENT Bindings"
To check MQ OAM permissions us the dspmqaut command, for example:
dspmqaut -m WS02ESBManager -n TMSALease -t queue -p userName
To set MQ OAM permissions us the setmqaut command, for example:
setmqaut -m WS02ESBManager -n TMSALease -t queue -p userName+put
Also sometimes help if you :
Disable Channel authentication records in Communication in Properties of queue manager ...
When trying to use File inboundEndpoint in WSO2 5.0.0 to process an inbound csv file I'm always getting an exception as if WSO2 is trying to parse the file as XML despite the fact tat I've set the transport.vfs.ContentType parameter to "text/csv" in the inboundEndpoint configuration:
<parameter name="transport.vfs.ContentType">text/csv</parameter>
Here's the full stack error I'm getting:
[2016-10-08 16:56:31,181] ERROR - FileInjectHandler Error while processing the file/folder
org.apache.axiom.om.OMException: com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character 'i' (code 105) in prolog; expected '<'
at [row,col {unknown-source}]: [1,1]
at org.apache.axiom.om.impl.builder.StAXOMBuilder.next(StAXOMBuilder.java:296)
at org.apache.axiom.soap.impl.builder.StAXSOAPModelBuilder.getSOAPEnvelope(StAXSOAPModelBuilder.java:204)
at org.apache.axiom.soap.impl.builder.StAXSOAPModelBuilder.<init>(StAXSOAPModelBuilder.java:154)
at org.apache.axiom.om.impl.AbstractOMMetaFactory.createStAXSOAPModelBuilder(AbstractOMMetaFactory.java:73)
at org.apache.axiom.om.impl.AbstractOMMetaFactory.createSOAPModelBuilder(AbstractOMMetaFactory.java:79)
at org.apache.axiom.om.OMXMLBuilderFactory.createSOAPModelBuilder(OMXMLBuilderFactory.java:196)
at org.apache.axis2.builder.SOAPBuilder.processDocument(SOAPBuilder.java:65)
at org.wso2.carbon.inbound.endpoint.protocol.file.FileInjectHandler.invoke(FileInjectHandler.java:141)
at org.wso2.carbon.inbound.endpoint.protocol.file.FilePollingConsumer.processFile(FilePollingConsumer.java:763)
at org.wso2.carbon.inbound.endpoint.protocol.file.FilePollingConsumer.directoryHandler(FilePollingConsumer.java:543)
at org.wso2.carbon.inbound.endpoint.protocol.file.FilePollingConsumer.poll(FilePollingConsumer.java:214)
at org.wso2.carbon.inbound.endpoint.protocol.file.FilePollingConsumer.execute(FilePollingConsumer.java:134)
at org.wso2.carbon.inbound.endpoint.protocol.file.FileTask.taskExecute(FileTask.java:47)
at org.wso2.carbon.inbound.endpoint.common.InboundTask.execute(InboundTask.java:45)
at org.wso2.carbon.mediation.ntask.NTaskAdapter.execute(NTaskAdapter.java:98)
at org.wso2.carbon.ntask.core.impl.TaskQuartzJobAdapter.execute(TaskQuartzJobAdapter.java:67)
at org.quartz.core.JobRunShell.run(JobRunShell.java:213)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:744)
And here's the full configuration for the inboundEndpoint:
<?xml version="1.0" encoding="UTF-8"?>
<inboundEndpoint name="BigBuyCategoryMapper" protocol="file" sequence="ProcessCategoryMapper" suspend="false" xmlns="http://ws.apache.org/ns/synapse">
<parameters>
<parameter name="interval">5000</parameter>
<parameter name="sequential">true</parameter>
<parameter name="coordination">true</parameter>
<parameter name="transport.vfs.ContentType">text/csv</parameter>
<parameter name="transport.vfs.LockReleaseSameNode">false</parameter>
<parameter name="transport.vfs.AutoLockRelease">false</parameter>
<parameter name="transport.vfs.ActionAfterFailure">MOVE</parameter>
<parameter name="transport.vfs.ActionAfterProcess">MOVE</parameter>
<parameter name="transport.vfs.FileURI">file:///Users/gamac/temp/in</parameter>
<parameter name="transport.vfs.MoveAfterFailure">file:///Users/gamac/temp/failed</parameter>
<parameter name="transport.vfs.DistributedLock">false</parameter>
<parameter name="transport.vfs.FileNamePattern">mapper_category.csv</parameter>
<parameter name="transport.vfs.MoveAfterProcess">file:///Users/gamac/temp/done</parameter>
<parameter name="transport.vfs.Locking">disable</parameter>
<parameter name="transport.vfs.FileSortAttribute">none</parameter>
<parameter name="transport.vfs.FileSortAscending">true</parameter>
<parameter name="transport.vfs.CreateFolder">true</parameter>
<parameter name="transport.vfs.Streaming">false</parameter>
<parameter name="transport.vfs.Build">false</parameter>
</parameters>
</inboundEndpoint>
Please help.
Thanks!
Using text/plain instead of text/csv seems to get around this issue:
<parameter name="transport.vfs.ContentType">text/plain</parameter>
However the proper solution is probably to configure a Message Builder/Formatter for text/csv as per WSO2 documentation: https://docs.wso2.com/display/ESB481/Working+with+Message+Builders+and+Formatters