Search
Calendar
April 2024
S M T W T F S
« Sep    
 123456
78910111213
14151617181920
21222324252627
282930  
Your widget title
Archives

Posts Tagged ‘Mule ESB’

PostHeaderIcon How to access global variables in Mule 3?

Case

In Mule 2.2.1, getting the global variables was allowed. Therefore, such a block worked:

 <add-message-property key="jonathanProperty"
 value="#1" />

In Mule 3, this is no more possible. Therefore, how to access -former- global variables within a Mule 3 config file?

Fix

Access the global variables owing to their scope, such as Invocation, Inbound, Outbound, Session, thanks to the methods MuleMessage.get<Scope>Property(), eg:

<add-message-property key="jonathanProperty"
 value="#1" />

PostHeaderIcon Filter too large files in Mule ESB

Case

You use a filter connector in Mule ESB 2.2.1, to perform any operation (let’s say: to send them on JMS, but this does not matter). You would like to filter files owing to their size, ie stop the handling of files larger than 10,000,000 bytes for instance.

We assume the files you handle are text files (not binary).

Solution

In your Mule XML config file, add the following block, using a short Groovy script:

<message-properties-transformer name="add-properties">
     <add-message-property key="fileSizeOK"
             value="#1" />
 </message-properties-transformer>

In the tag <file:inbound-endpoint>, add the attribute: transformer-refs="add-properties"
Now, add a tag <message-property-filter pattern="fileSizeOK=true"/>. Your outbound should then be similar to:

			<outbound>
                <filtering-router>
                    <jms:outbound-endpoint queue="lalou.jonathan.jms.queue"
						connector-ref="jmsConnector"/>
                    <message-property-filter pattern="fileSizeOK=true"/>
                </filtering-router>
                <forwarding-catch-all-strategy>
                    <file:outbound-endpoint path="/my/folder/"
                        connector-ref="fileConnector" outputPattern="error/#[header:originalFilename].too_big.#[function:dateStamp:yyyyMMdd_HHmmss_SSSSS].KO" />
                </forwarding-catch-all-strategy>
			</outbound>

Many thanks to Vincent N. for his help.

PostHeaderIcon Tutorial: Re-package Mule ESB as a standalone client

Case

You have to deliver Mule 2.2.1 as a standalone application, or, more accurately, as a simple archive ready-to-use by someone else (customer, co-team worker, etc.).

In this tutorial, we assume that:

  • you have to include external jars, eg. MQ and WebLogic jars
  • you have written your XML configuration file for Mule, of which all properties are externalized in an external property file. We don’t mind the actual workflow, we assume you’re skilled enough with Mule 😉

Build

Prerequisites

Prior to building standalone:

  • get Mule ESB 2.2.1 standalone archive, available on MuleSoft website
  • get the JARs needed by MQ
    • providerutil.jar
    • fscontext.jar
    • dhbcore.jar
    • connector.jar
    • commonservices.jar
    • com.ibm.mqjms.jar
    • com.ibm.mq.jar
  • get WebLogic’s wlfullclient.jar
  • install the zip and the jars on your local repository:
    mvn install:install-file -DgroupId=org.mulesource -DartifactId=mule-esb -Dversion=2.2.1 -Dpackaging=zip -Dfile=mule-standalone-2.2.1.zip
    mvn install:install-file -Dfile=wlfullclient.jar  -DgroupId=weblogic -DartifactId=wlfullclient -Dversion=10.3 -Dpackaging=jar -DgeneratePom=true
    mvn install:install-file -Dfile=fscontext.jar  -DgroupId=fscontext -DartifactId=fscontext -Dversion=1.2 -Dpackaging=jar -DgeneratePom=true
    mvn install:install-file -Dfile=providerutil.jar  -DgroupId=fscontext -DartifactId=providerutil -Dversion=1.2 -Dpackaging=jar -DgeneratePom=true
    mvn install:install-file -DgroupId=mq -DartifactId=com.ibm.mq -Dversion=6.0.2.0 -Dpackaging=jar -Dfile=com.ibm.mq.jar
    mvn install:install-file -DgroupId=mq -DartifactId=com.ibm.mqjms -Dversion=6.0.2.0 -Dpackaging=jar -Dfile=com.ibm.mqjms.jar
    mvn install:install-file -DgroupId=mq -DartifactId=dhbcore -Dversion=6.0.2.0 -Dpackaging=jar -Dfile=dhbcore.jar
    mvn install:install-file -DgroupId=mq -DartifactId=commonservices -Dversion=6.0.2.0 -Dpackaging=jar -Dfile=commonservices.jar
    mvn install:install-file -DgroupId=connector -DartifactId=connector -Dversion=1.0 -Dpackaging=jar -Dfile=connector.jar

Files to be edited

  • Create a mule-jonathan.xml file in src/main/resources/ folder.
  • Externalize all properties in mule-jonathan.properties file in src/main/resources/ folder. As you may anticipate it, you will have add this property file in Mule classpath
  • To perform that:
    • Copy the wrapper.conf of Mule standalone archive as src/main/resources/wrapper.conf
    • After the line:
      wrapper.java.classpath.3=%MULE_HOME%/lib/boot/*.jar

      , add the line:

      wrapper.java.classpath.4=%MULE_HOME%/etc
  • in src/main/resources/, create a file start-mule-jonathan.bat, with the content:
    set MULE_HOME=%CD%
    cd %MULE_HOME%\bin
    mule.bat -config mule-jonathan.xml
    

Maven

Here is the pom.xml of our project:

<?xml version="1.0"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <parent>
    <groupId>lalou-jonathan</groupId>
    <artifactId>jonathan-parent</artifactId>
    <version>1.0</version></parent>
  <modelVersion>4.0.0</modelVersion>
  <groupId>lalou.jonathan</groupId>
  <artifactId>jonathan-lalou-standalone-esb</artifactId>
  <packaging>jar</packaging>
  <version>${jonathan.version}</version>
  <name>jonathan-lalou-standalone-esb</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>org.mulesource</groupId>
      <artifactId>mule-esb</artifactId>
      <version>2.2.1</version>
      <type>zip</type></dependency>
    <dependency>
      <groupId>weblogic</groupId>
      <artifactId>wlfullclient</artifactId>
      <version>10.3</version></dependency>
    <dependency>
      <groupId>fscontext</groupId>
      <artifactId>fscontext</artifactId>
      <version>1.2</version></dependency>
    <dependency>
      <groupId>fscontext</groupId>
      <artifactId>providerutil</artifactId>
      <version>1.2</version></dependency>
    <dependency>
      <groupId>mq</groupId>
      <artifactId>com.ibm.mq</artifactId>
      <version>6.0.2.0</version></dependency>
    <dependency>
      <groupId>mq</groupId>
      <artifactId>com.ibm.mqjms</artifactId>
      <version>6.0.2.0</version></dependency>
    <dependency>
      <groupId>mq</groupId>
      <artifactId>commonservices</artifactId>
      <version>6.0.2.0</version></dependency>
    <dependency>
      <groupId>mq</groupId>
      <artifactId>dhbcore</artifactId>
      <version>6.0.2.0</version></dependency>
    <dependency>
      <groupId>connector</groupId>
      <artifactId>connector</artifactId>
      <version>1.0</version></dependency></dependencies>
  <build>
    <resources>
      <resource>
        <directory>src/main/resources</directory>
        <excludes>
          <exclude>**/*</exclude></excludes></resource></resources>
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.2-beta-2</version>
        <configuration>
          <descriptors>
            <descriptor>src/main/assembly/assembly.xml</descriptor></descriptors></configuration>
        <executions>
          <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>
</project>

Maven Assembly

We will use Maven Assembly: this plugin allows unpack archives, copy files, insert files, delete folders, etc.

Here is the assembly.xml file that should be located in src/main/assembly/ folder of your project. The code is commented so that you understand what we do.

<assembly xmlns="http://maven.apache.org/xsd/1.1.0/assembly"           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"           xsi:schemaLocation="http://maven.apache.org/xsd/assembly-1.1.2.xsd                               http://maven.apache.org/xsd/1.1.2/assembly">
  <id/>
  <baseDirectory>jonathan-lalou-standalone-esb-${version}</baseDirectory>
  <formats>
    <format>zip</format></formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <dependencySets>
    <dependencySet>
      <outputDirectory>/</outputDirectory>
      <includes>
        <include>org.mulesource:mule-esb</include></includes>
      <unpack>true</unpack>
      <unpackOptions>
        <excludes>
          <!-- excluse original wrapper.conf, to include our tuned wrapper.conf-->
          <exclude>**/conf/wrapper.conf</exclude>
          <!--remove the these folders, useless in a standalone client-->
          <exclude>**/examples/**</exclude>
          <exclude>**/docs/**</exclude>
          <exclude>**/src/**</exclude></excludes></unpackOptions></dependencySet>
    <dependencySet>
      <outputDirectory>mule-standalone-2.2.1/lib/user</outputDirectory>
      <excludes>
        <exclude>org.mulesource:mule-esb</exclude></excludes></dependencySet></dependencySets>
  <fileSets>
    <fileSet>
      <directory>${basedir}/src/main/resources</directory>
      <outputDirectory>/mule-standalone-2.2.1/etc</outputDirectory>
      <includes>
        <!--include the property file -->
        <include>**/*jonathan*.properties</include></includes></fileSet>
    <fileSet>
      <directory>${basedir}/src/main/resources</directory>
      <outputDirectory>/mule-standalone-2.2.1/bin</outputDirectory>
      <includes>
        <!-- include Mule XML config file-->
        <include>**/*jonathan*.xml</include></includes></fileSet>
    <fileSet>
      <directory>${basedir}/src/main/resources</directory>
      <outputDirectory>/mule-standalone-2.2.1/conf</outputDirectory>
      <includes>
        <!-- modified wrapper.conf to stake in account the etc/ folder, containing the property file-->
        <include>**/wrapper.conf</include></includes></fileSet>
    <fileSet>
      <directory>${basedir}/src/main/resources</directory>
      <outputDirectory>/mule-standalone-2.2.1/</outputDirectory>
      <includes>
        <include>**/*-mule-jonathan.bat</include>
      </includes>
    </fileSet>
  </fileSets>
</assembly>

Build process

To build go to the folder yourproject/jonathan, then launch a mvn clean install. A complete installation package is output on target folder: jonathan-lalou-standalone-esb-1.0.zip.

The archive is built thanks to Maven Assembly plugin.

Install

Install

Copy or move the archive jonathan-lalou-standalone-esb-1.0.zip to any folder of your choice. Then unzip it.

(optionnal) Checks

Tree

Here is a tree of the installation, with some important file that must appear:

+---start-mule-jonathan.bat
+---bin
¦   +---mule-jonathan.xml
+---conf
¦   +---wrapper.conf
+---etc
¦   +---mule-jonathan.properties
+---lib
¦   +---boot
¦   ¦   +---exec
¦   +---endorsed
¦   +---mule
¦   +---opt
¦   +---user
¦       +------com.ibm.mq-6.0.2.0.jar
¦       +------com.ibm.mqjms-6.0.2.0.jar
¦       +------commonservices-6.0.2.0.jar
¦       +------connector-1.0.jar
¦       +------dhbcore-6.0.2.0.jar
¦       +------fscontext-1.2.jar
¦       +------providerutil-1.2.jar
¦       +------wlfullclient-10.3.jar
¦       +------connector-1.0.jar
+---licenses
+---logs

Files

Check the files listed above in the tree appear. Besides, check the conf/wrapper.conf file contains the line wrapper.java.classpath.4=%MULE_HOME%/etc

Config

Edit etc/mule-jonathan.properties file and set the right properties.

Use

Execute start-mule-jonathan.bat to launch Mule on Windows. On first attempt, Mule will display the user licence and ask you your confirmation you accept the terms of the agreement.

PostHeaderIcon Mule / MQJE001 / MQJMS2007

Case

In a Mule ESB workflow, the endpoint is a <jms:outbound-endpoint>, pointing to a JMS queue hosted on MQ Series and accessed through WebLogic 10.3.3.

I get the following stracktrace

Exception stack is:
1. MQJE001: Completion Code 2, Reason 2027 (com.ibm.mq.MQException)
com.ibm.mq.MQQueue:1624 (null)
2. MQJMS2007: failed to send message to MQ queue(JMS Code: MQJMS2007) (javax.jms.JMSException)
com.ibm.mq.jms.services.ConfigEnvironment:622 (http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/jms/JMSException.html)
3. Failed to create and dispatch response event over Jms destination "queue://MQSERVER/AMQ.4C8A5E112285475605?persistence=1". Failed to route event via endpoint: null. Message payload is of type: JMSObjectMessage (org.mule.api.transport.DispatchException)
org.mule.transport.jms.JmsReplyToHandler:154 (http://www.mulesource.org/docs/site/current2/apidocs/org/mule/api/transport/DispatchException.html)

Fix

On Mule config file, explicitly set the attribute disableTemporaryReplyToDestinations at true in the JMS outbound tag:

<jms:outbound-endpoint
 queue="jonathan.lalou.jms.queue"
 connector-ref="jmsConnector"
 transformer-refs="foo" disableTemporaryReplyToDestinations="true"/>

PostHeaderIcon Mule / MQJMS3000: failed to create a temporary queue from SYSTEM.DEFAULT.MODEL.QUEUE

Case

I have a Mule workflow, of which outbound is a <jms:outbound-endpoint>. The destination queue is hosted on MQ Series and accessed through WebLogic 10.3.3 bridge.

I get the following error:

MQJMS3000: failed to create a temporary queue from SYSTEM.DEFAULT.MODEL.QUEUE

Complete Stacktrace

2010-11-03 13:03:11,421 ERROR mule.DefaultExceptionStrategy       - Caught exception in Exception Strategy: MQJMS3000: failed to create a temporary queue from SYSTEM.DEFAULT.MODEL.QUEUE
javax.jms.JMSException: MQJMS3000: failed to create a temporary queue from SYSTEM.DEFAULT.MODEL.QUEUE
 at com.ibm.mq.jms.services.ConfigEnvironment.newException(ConfigEnvironment.java:644)
 at com.ibm.mq.jms.MQConnection.createTemporaryQueue(MQConnection.java:2958)
 at com.ibm.mq.jms.MQSession.createTemporaryQueue(MQSession.java:4650)
 at com.ibm.mq.jms.MQQueueSession.createTemporaryQueue(MQQueueSession.java:286)
 at org.mule.transport.jms.Jms11Support.createTemporaryDestination(Jms11Support.java:247)
 at org.mule.transport.jms.JmsMessageDispatcher.getReplyToDestination(JmsMessageDispatcher.java:483)
 at org.mule.transport.jms.JmsMessageDispatcher.dispatchMessage(JmsMessageDispatcher.java:171)
 at org.mule.transport.jms.JmsMessageDispatcher.doDispatch(JmsMessageDispatcher.java:73)
 at org.mule.transport.AbstractMessageDispatcher$Worker.run(AbstractMessageDispatcher.java:262)
 at org.mule.work.WorkerContext.run(WorkerContext.java:310)
 at edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1061)
 at edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:575)
 at java.lang.Thread.run(Thread.java:619)

Explanation

A similar issue is described here on Mule support forum. Richard Swart wrote:

This not really mule specific error but an MQ authorization error. The QueueSession.createTemporaryQueue method needs access to the model queue that is defined in the QueueConnectionFactory temporaryModel field (by default this is SYSTEM.DEFAULT.MODEL.QUEUE).

Quick Fix

To fix the issue: on MQ server side, grant visibility to client applications on the default SYSTEM.DEFAULT.MODEL.QUEUE