WSO2 Enterprise Integrator
The open-source, configuration-driven integrator with a graphical drag and drop designer based on the same battle-tested WSO2 EI/ESB runtime.
It can facilitate any complex enterprise architecture by integrating APIs, services, data, and SaaS, proprietary, and legacy systems while acting as a microservices integrator or an ESB in, cloud, hybrid, on-premises, or a container-native environment.
- Learning
- Configurations
- FAQ
- Build image dari wso2 mi failed. Caused by: com.spotify.docker.client.exceptions.DockerException
- Tidak mendapatkan respon dari backend ketika menggunakan Call Mediator
- Output dari query database tidak konsisten
- Bagaimana cara menambahkan object kedalam array
- Build docker image, folder lib tidak ikut ke build
- Tidak bisa konek database sqlserver 2005 di kubernetes
- Ketika mengirim value json ke dataservice value di encode
Learning
Configurations
FAQ
Build image dari wso2 mi failed. Caused by: com.spotify.docker.client.exceptions.DockerException
Ketika melakukan build image docker / kubernetes di integration studio tampil error di log :
[ERROR] pull access denied for docker.wso2.com/wso2mi, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
Ini terjadi apabila kita menggunakan image dari docker.wso2.com karena di pom.xml perlu ditambahkan repoUserName dan repoPassword dockerhub :
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>${version}</version>
<configuration>
<username>repoUserName</username>
<password>repoPassword</password>
<repository>${docker.image.prefix}/${project.artifactId}</repository>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
setelah itu simpan dan build ulang. Solusi kedua kita bisa pull image dulu di terminal dengan
sudo docker pull docker.wso2.com/wso2mi:latest
dan tambahkan di pom.xml kode berikut :
<pullNewerImage>false</pullNewerImage>
contoh :
<configuration>
<dockerfile.repository>${dockerfile.repository}</dockerfile.repository>
<dockerfile.tag>${dockerfile.tag}</dockerfile.tag>
<buildArgs>
<BASE_IMAGE>${dockerfile.base.image}</BASE_IMAGE>
</buildArgs>
<pullNewerImage>false</pullNewerImage>
</configuration>
ulangi build image.
Tidak mendapatkan respon dari backend ketika menggunakan Call Mediator
Disaat memanggil backend menggunakan Call Mediator, backend mengeluarkan respon berupa json, akan tetapi ketika mendapatkan respon dengan json-eval atau $body, keluar error :
ERROR {org.wso2.micro.integrator.core.json.JsonStreamBuilder} - Error occurred while processing document for application/json java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
...
Caused by: org.apache.axis2.AxisFault: #Can not parse stream. MessageID: urn:uuid:29a54657-aef7-4644-b65a-c4cd4628d08e. Error>>> #getNewJsonPayload. Could not save JSON payload. Invalid input stream found. Payload is not a JSON string.
at org.apache.synapse.commons.json.JsonUtil.getNewJsonPayload(JsonUtil.java:888)
at org.apache.synapse.commons.json.JsonStreamBuilder.processDocument(JsonStreamBuilder.java:43)
... 22 more
Caused by: org.apache.axis2.AxisFault: #getNewJsonPayload. Could not save JSON payload. Invalid input stream found. Payload is not a JSON string.
at org.apache.synapse.commons.json.JsonUtil.getNewJsonPayload(JsonUtil.java:872)
... 23 more
Setelah menganalisa isu lebih lanjut, respon yang diterima MI Server itu harusnya application/json akan tetapi respon yang diterima bukan JSON seperti log berikut :
DEBUG {org.apache.synapse.transport.http.wire} - HTTPS-Sender I/O dispatcher-1 >> "Content-Encoding: br[\r][\n]"
[2023-02-11 10:17:36,201] DEBUG {org.apache.synapse.transport.http.wire} - HTTPS-Sender I/O dispatcher-1 >> "[\r][\n]"
[2023-02-11 10:17:36,201] DEBUG {org.apache.synapse.transport.http.wire} - HTTPS-Sender I/O dispatcher-1 >> "33[\r][\n]"
[2023-02-11 10:17:36,202] DEBUG {org.apache.synapse.transport.http.wire} - HTTPS-Sender I/O dispatcher-1 >> "![0xdc][0x0][0x0] sK[0xfd][0x99][0xc0][0x8c][0x94]jH[0xe][0x89][0xce]M09S[0x92]RL[0xaa][0xea]\[0x1e]+j`[0xf][0xdf]3[0xb0][0xa6]*[0xe4]u[0x8f]L[0xac][0xce][\r][0xa1]=[0x84][0xd1][0xd1][0xff][\r][\n]"
[2023-02-11 10:17:36,213] DEBUG {org.apache.synapse.transport.http.wire} - HTTPS-Sender I/O dispatcher-1 >> "1[\r][\n]"
[2023-02-11 10:17:36,214] DEBUG {org.apache.synapse.transport.http.wire} - HTTPS-Sender I/O dispatcher-1 >> "[0x3][\r][\n]"
[2023-02-11 10:17:36,214] DEBUG {org.apache.synapse.transport.http.wire} - HTTPS-Sender I/O dispatcher-1 >> "0[\r][\n]"
[2023-02-11 10:17:36,214] DEBUG {org.apache.synapse.transport.http.wire} - HTTPS-Sender I/O dispatcher-1 >> "[\r][\n]"
Seperti yang dilihat di log, kita dapat melihat respon di encode dan tidak dikenali sebagai JSON payload. Alasan kena isu ini terjadi karena respon di kompres/encode dan message builder mi mencoba menampilkan respon, akan tetapi berhubung respon di encode akan menampilkan error "Invalid input stream found." Payload is not a JSON string". Ini terjadi karena backend sensitif terhadap "Accept-Encoding" di header saat request dan backend mengeluarkan respon yang telah dikompress .
Jadi untuk tidak mengirim “Accept-Encoding" di header ke backend, kita tambahkan property mediator dibawah ini sebelum memanggil backend atau sebelum Call Mediator.
<property name="Accept-Encoding" scope="transport" action="remove"/>
Dan deploy ulang project, header “Accept-Encoding" ini dikirim default oleh postman, jadi pastikan data-data default ini tidak mempengaruhi output dari backend.
Output dari query database tidak konsisten
Pada saat query ke database untuk select data, akan keluar output yang berbeda seperti berikut :
- Jika result dari db hanya 1 row, respon dari micro integrator adalah json object.
- Jika result db lebih dari 1, respon format adalah json arrayIf result return more than one rows, respon's format was an array.
Output tidak konsisten. Solusinya adalah kita buat payload factory untuk merubah format respon agar seragam, berikut sampel source code nya :
<payloadFactory media-type="xml">
<format>
<database_return xmlns="http://ws.wso2.org/dataservice"><?xml-multiple data?>$1</database_return>
</format>
<args>
<arg evaluator="xml" expression="//*[local-name()='data']"/>
</args>
</payloadFactory>
database_return adalah key output yang akan ditampilkan, sedangkan untuk get datanya menggunakan expression //*[local-name()='data'] yang akan mengambil child dari respon data. Taruh script diatas setelah memanggil dataservice. Dengan script diatas output akan konsisten berbentuk json array.
Bagaimana cara menambahkan object kedalam array
Untuk menambahkan object kedalam array bisa menggunakan foreach dan enrich mediator untuk menambahkannya, contoh source code :
<foreach expression="json-eval($.data)" id="foreach_1">
<sequence>
<enrich>
<source clone="true" type="inline">{"hobby":"sare"}</source>
<target action="child" xpath="json-eval($)"/>
</enrich>
</sequence>
</foreach>
Dalam contoh kita akan menambahkan object {"hobby":"sare"} kedalam data di expression json-eval($.data)
Build docker image, folder lib tidak ikut ke build
Ketika akan build image secara default WSO2 Integration Studio tidak akan memasukkan folder lib untuk ikut di build. Agar ikut terbuild, hapus komen # di COPY Libs/*.jar ${WSO2_SERVER_HOME}/lib/ di Dockerfile, dan build ulang imagenya.
Tidak bisa konek database sqlserver 2005 di kubernetes
Tambahkan script di dockerfile :
FROM wso2/wso2mi:latest
USER 0
RUN sed -i 's/TLSv1, TLSv1.1, //g' /opt/java/openjdk/conf/security/java.security
USER ${USER}
Ketika mengirim value json ke dataservice value di encode
Ada request json yang akan dikirim ke dataservice, contoh request :
{
"email": "fachmi@pi.com",
"extid": "55192922181742",
"type": "",
"va": "",
"itemtype": "1",
"serviceid": "15",
"shippername": "Fachmi"
}
source code artifact :
<property expression="json-eval($)" name="body_request" scope="default" type="STRING"/>
<sequences>
<dataServiceCall serviceName="webhook">
<operations type="single">
<operation name="updatewebhook">
<param evaluator="xml" expression="get-property('body_request')" name="body_request"/>
</operation>
</operations>
<source type="inline"/>
<target type="body"/>
</dataServiceCall>
</sequences>
untuk dataservicenya :
<data name="webhook" serviceGroup="" transports="http https local">
<description/>
<config enableOData="false" id="dsWebhook">
<property name="carbon_datasource_name">dswebhook</property>
</config>
<query id="q_updatewebhook" useConfig="dsWebhook">
<sql>select * from updatewebhook (?)</sql>
<param name="body_request" sqlType="STRING"/>
</queries>
<operation name="updatewebhook">
<call-query href="q_updatewebhook">
<with-param name="body_request" query-param="body_request"/>
</call-query>
</operation>
</data>
namun ketika coba mengirim data keluar error :
Caused by: DS Fault Message: Error in 'SQLQuery.processPreNormalQuery': ERROR: invalid input syntax for type json
Detail: Token "&" is invalid.
Where: JSON data, line 1: {
&...
PL/pgSQL function updatewebhook(text) line 9 at assignment
DS Code: DATABASE_ERROR
Source Data Service:-
Name: qposinaja_webhook
Location: /home/wso2carbon/wso2mi-4.1.0/tmp/carbonapps/-1234/1680057918218QPosInAjaCompositeExporter-1.0.0.car/webhook_1.0.0/webhook-1.0.0.dbs
Description:
Current Request Name: updatewebhook
Current Params: {body_request={
"email": "fachmi@pi.com",
"extid": "QOB55192922181742",
"type": "",
"va": "",
"itemtype": "1",
"serviceid": "240",
"shippername": "Fachmi"
}}
Nested Exception:-
org.postgresql.util.PSQLException: ERROR: invalid input syntax for type json
Detail: Token "&" is invalid.
Where: JSON data, line 1: {
&...
PL/pgSQL function updatewebhook(text) line 9 at assignment
ini dikarenakan evaluator di set xml di <param evaluator="xml" expression="get-property('body_request')" name="body_request"/> sehingga ketika menerima value json diencode.
Solusinya ganti param value menjadi :
<param evaluator="json" expression="json-eval($)" name="body_request"/>
Sehingga seluruh source codenya menjadi seperti dibawah ini :
<property expression="json-eval($)" name="body_request" scope="default" type="STRING"/>
<enrich description="Deploy body">
<source clone="false" property="body_request" type="property"/>
<target type="body"/>
</enrich>
<sequences>
<dataServiceCall serviceName="webhook">
<operations type="single">
<operation name="updatewebhook">
<param evaluator="json" expression="json-eval($)" name="body_request"/>
</operation>
</operations>
<source type="inline"/>
<target type="body"/>
</dataServiceCall>
</sequences>
tetapi ada bug ketika menyimpan di Integration Studio 8.1.0 di bulan maret 2023, file artifact tidak akan tersimpan ketika kita coba save, untuk sementara kita edit menggunakan text editor lain, dan build ulang project di Integration Studio, bug ini sudah dilaporkan ke tim WSO2, sehingga ketika update terbaru, bug ini akan hilang.