Communicate TIBCO BW with Raspberry Pi using ActiveMQ

There is another way to connect your raspberry pi to your TIBCO BW beside using HTTP. By using messaging like ActiveMQ you can implement queue or topic to consume / produce the event. For example you have one TIBCO BW service and you have many raspberry pi devices that you want them to consume the event in load balancing mode or broadcast mode or vice versa. Later, you can change TIBCO BW service with any application for example Java.

You can refer TIBCO – ActiveMQ integration in my previous post here: Integrating TIBCO BW with Apache ActiveMQ

Prerequisite:

Server:
TIBCO BW
ActiveMQ

Raspberry:
Python
stomp.py library

Step 1:
Run the ActiveMQ server

Step 2:
Download the Stomp.py library

sudo apt-get install stomp.py

Step 3:
Run the BW Service
3a. Sender

activemq10
3b. Listener

activemq11

Step 4:
Code some simple python
4a. Sender
SenderTest.py

import stomp

class MyListener(object):
def on_connecting(self, host_and_port):
print ‘connecting : %s:%s’%host_and_port

def on_disconnected(self):
print “lost connection”

def on_message(self, headers, body):
self.__print_async(“MESSAGE”, headers, body)

def on_error(self, headers, body):
self.__print_async(“ERROR”, headers, body)

def on_receipt(self, headers, body):
self.__print_async(“RECEIPT”, headers, body)

def on_connected(self, headers, body):
print “connected successfully”

def __print_async(self, frame_type, headers, body):
print “\r \r”,
print frame_type

for header_key in headers.keys():
print ‘%s: %s’ % (header_key, headers[header_key])

print
print body

#Inside Connection() is your server IP and STOMP port
conn = stomp.Connection([(“127.0.0.1″,61613)])
conn.set_listener(”, MyListener())
conn.start()
#inside connect() is your ActiveMQ username and password
conn.connect(‘admin’, ‘admin’, wait=True)
#inside send() there are destination and body.
# Destination is the Queue / Topic name, body is the message you want to send.
conn.send(destination=’TEST.FOO’, body=’This is message’, id=1)
conn.disconnect()

4b. Listener
ListenerTest.py

import stomp
import time

class MyListener(object):
def on_error(self, headers, message):
print(‘received an error %s’%message)
def on_message(self, headers, message):
print(‘received a message %s (%s)’%(message, headers))

#Inside Connection() is your server IP and STOMP port
con = stomp.Connection(host_and_ports=[(‘127.0.0.1’, 61613)])
con.set_listener(”, MyListener())
con.start()
#inside connect() is your ActiveMQ username and password
con.connect(‘admin’, ‘admin’, wait=True)
#inside send() there are destination and body.
# Destination is the Queue / Topic name, body is the message you want to send.
con.subscribe(destination=’TEST.FOO’, ack=’auto’, id=1)

# this looping below is just to make the python code stay listening to the queue / topic
# in real life implementation should not be like this
while True :
time.sleep(2)

con.disconnect()

Step 5:
To execute the python code

python SenderTest.py
python ListenerTest.py

If you want to simulate python as listener, and BW as sender: Run 4b and 3a
If you want to simulate BW as listener, and python as sender : Run 3b and 4a

Note: python will send the message body in base64. So in your BW code don’t forget to convert to string using tib:base64-to-string(<<body>>)

Integrating TIBCO BW with Apache ActiveMQ

This guide will show you how to make TIBCO BW Designer interact with ActiveMQ.

Prerequisites :
Apache ActiveMQ
TIBCO BusinessWorks

When I’m writing this example, I’m using TIBCO BW 5.11 and ActiveMQ 5.13.2.

Step 1:
Install and run activemq in your local by executing :

D:\Installation\apache-activemq-5.13.2\bin\win32\activemq.bat

My machine is windows. So please change the path and script according to your machine and installation
Step 2:
Take this jars from ActiveMQ installation\lib and keep the path, we will use it later

apache-activemq-5.13.2/lib/activemq-client-5.13.2.jar
apache-activemq-5.13.2/lib/geronimo-j2ee-management_1.1_spec-1.0.1.jar
apache-activemq-5.13.2/lib/hawtbuf-1.11.jar

Step 3:
Find your designer.tra and bwengine.tra in your TIBCO_HOME

example :
C:/tibco/designer/5.7/bin/designer.tra
C:/tibco/bw/5.11/bin/bwengine.tra

Step 4:
Edit above tra files using notepad or other text editor and find for
bwengine.tra

tibco.env.CUSTOM_EXT_APPEND_CP

designer.tra

tibco.env.CUSTOM_CP_EXT

Step 5:
After you found it, append the existing line with Step 2’s jar paths

example :

D:/Installation/apache-activemq-5.13.2/lib/activemq-client-5.13.2.jar;D:/Installation/apache-activemq-5.13.2/lib/geronimo-j2ee-management_1.1_spec-1.0.1.jar;D:/Installation/apache-activemq-5.13.2/lib/hawtbuf-1.11.jar

activemq1

activemq2

*please note to add semicolon ‘;’ character to separate between jars.

Step 6:
Restart your TIBCO BW Designer, and create JMS Connection with below detail:

JNDI Context Factory : org.apache.activemq.jndi.ActiveMQInitialContextFactory
JNDI Context URL : tcp://127.0.0.1:61616
JNDI User Name : admin
JNDI Password : admin

activemq3

Step 7 :
Create new GlobalVariable contains ActiveMQ’s JNDI Context Factory:

org.apache.activemq.jndi.ActiveMQInitialContextFactory

activemq5

in this example I created a global variable named : ‘JNDI’ with value ‘org.apache.activemq.jndi.ActiveMQInitialContextFactory’

Step 8:
Do Test Connection. It should show as follow:

activemq4

Step 9 :
Now we create some process definitions to test listen and send message through ActiveMQ queue

activemq6

activemq7

activemq8

activemq9

This guide is just simple example, you might need other ActiveMQ jars for other purpose. If you need more jars included just follow Step 5.

 

Allow Dynamic Topic and Queue on TIBCO EMS

Go to your EMS home, example :

C:\tibco\ems\6.3

add below (‘greater than’ character) to your queues.conf and topics.conf and save the conf file

>

 

Restart your EMS

 

Calling TIBCO BW HTTP Receiver from Simple Python HTTP POST Request

Hi, I wrote simple HTTP post request from python to my BW HTTP Receiver. Actually you can also do it by using simple HTML form POST request. I just want to play with my python code a bit. I use this way sometimes to test my BW to make sure it is always able to handle request from non-BW call.

Here are the steps:

Code a simple python code like this

import urllib, urllib2

url = 'http://127.0.0.1:40500/'
values = {'ParamOne': 'ParamOneValue'}

data = urllib.urlencode(values)
req = urllib2.Request(url, data)
response = urllib2.urlopen(req)
print response.geturl()
print response.info()
the_page = response.read()
print the_page

and some BW HTTP Receiver on

bw1

You can get the values from HTTP Receiver PostData output element and use as you like.

Build EAR and Extract GV XML TIBCO BW using Jenkins

You can do automation for TIBCO BW EAR creation and Global Variable extraction by using Jenkins. Below are the simple example of it. This example was built in my local windows machine. you can do it also in UNIX server.

Prerequisite :

Jenkins

TIBCO BW

 

Steps:

  1. In Build section add two windows batch command.
  2. In first batch command put

C:
cd C:\tibcopath\tra\5.7\bin\
buildear.exe -x -s -ear /DeploymentConfiguration/YourProject.archive -o D:\distributionpath\ear\YourProject.ear -p “D:\projectpath\YourProject”

3. In second batch command put

C:
cd C:\tibcopath\tra\5.7\bin\
AppManage.exe -export -ear D:\distributionpath\ear\YourProject.ear -out D:\distributionpath\xml\YourProject.xml

That’s all.

Anytime you want to get your EAR and GV XML, you can click Build Now in your Jenkins project.

Change Python virtualenv Version

Run below code when you want to create new environment with new version of Python (windows):

virtualenv -p D:\directory\pythonpath\python.exe new_venv_name

[Tips] SQL Query Duplicate Value from Table

Selamat datang,
Berikut adalah contoh query umum untuk melihat data yang duplikat dalam tabel.

SELECT *
FROM tablename
WHERE fieldname IN (
SELECT fieldname
FROM tablename
GROUP BY fieldname
HAVING (COUNT(fieldname) > 1)
)

Hope this helps. Thank you.

[Tips] How To Clear Unused Session Attributes

Yang dalam bahasa sederhananya adalah : “Bagaimana membersihkan aplikasi anda dari atribute-attribute session yang tidak terpakai daripada session itu pada menumpuk dan membuat Application Server anda menjadi berat.“. Malah jadi rumit ya? hehe.. Ya sudahlah..

Tips kali ini saya tujukan untuk anda, yang pernah atau sedang membangun aplikasi Java berbasis web (JSP, JSF, so on..) yang menggunakan servlet, framework struts, atau framework lainnya yang memiliki konsep session.

Tidak menutup kemungkinan juga untuk para teman-teman yang gemar bermain dengan PHP dan ASP, untuk PHP dan ASP saya belum pernah mencobanya sendiri, tapi seharusnya dapat diimplementasikan di PHP dan ASP juga jika di kedua arsitektur tersebut mengenal adanya session.

Ok, anda tentu kenal dengan konsep Cart, biasanya teman-teman yang membangun aplikasi e-commerce atau e-marketing langganan menggunakan trik Cart-ing untuk menyimpan data user untuk sementara sampai sesi dari user habis.

Pada implementasinya, pencantolan(bahasa gaulnya) attribute pada session seperti di bawah ini :
HttpSession session = request.getSession(true);
String item = "Misalnya ini adalah data yang ingin ditampung";
session.setAttribute("namaAttribute", item);

Cukup. Nah, kebayang kan?
Kalau attribute nya hanya satu sih ga masalah. Tapi kalau aplikasi terdiri dari banyak modul, dan tiap modulnya menyimpan attribute yang banyak dan si user ga mau pergi-pergi / logout,
atau,
ketika user berpindah modul saat business process dari modul sebelumnya belum selesai, maka attribute masih menggantung tanpa sempat di bersihkan / diremove.

biasanya, kita akan membersihkan atau menghapus attribute dengan cara :
session.removeAttribute("namaAttribute");

ok ga masalah kalo cuma sebiji.

audience bertanya, “Kenapa ga pake session.invalidate(); aja ?”

Saya berkata, “bisa sih, tapi biasanya session login user disimpan di session yang sama, masa si user disuruh login ulang?”

Ya, dengan session.invalidate(); anda akan menghancurkan sebuah gerobak yang sudah banyak menyimpan barang.

Yang kita inginkan disini adalah bagaimana menghapus attribute-attribute yang kira-kira sudah tidak terpakai tanpa menghapus semua attribute yang penting.

solusi :

try
{
HttpSession session=request.getSession(true);
if(session!=null)
{
Enumeration attNames=session.getAttributeNames();
while(attNames.hasMoreElements())
{
String nama = attNames.nextElement().toString();
if (!nama.equals("userSession")
&& !nama.equals("namaAttributePentingLainnya") )
{
//disini attribute yang selain dijelaskan diatas, dihapus.
session.removeAttribute(nama);
}
}
}
}catch(Exception e)
{
e.printStackTrace();
}

Selanjutnya anda hanya perlu menyisipkan fungsi tersebut diatas ditempat yang diinginkan untuk membersihkan unuseable attributes.

Semoga membantu.

credit to : Karthikeyan Ramaswamy [at] coderanch[dot]com

[Struts Error – Solved] Cannot find ActionMappings or ActionFormBeans collection

Pada kesempatan ini saya akan membahas salah satu dari beberapa permasalahan umum yang biasa terjadi pada saat proses pen-deploy-an sebuah aplikasi yang menggunakan framework Struts.

Kode Error :

javax.servlet.jsp.JspException: Cannot find ActionMappings or ActionFormBeans collection

Pesan kesalahan ini ditampilkan ketika page dirender ke web browser, pesan ini tidak ditampilkan di console/log dari Application Server.

Mungkin anda akan bingung, dimana letak kesalahannya, di package aplikasinya kah, atau bahkan kesalahan di Application Server.

Seperti terjadi pada kasus yang saya alami, aplikasi running well pada saat testing menggunakan embedded application server, yakni Embedded Oracle Container for J2EE 10.3.1.0.0. Tetapi pada saat saya deploy pada Application Server Standalone Oracle Container for J2EE 10.3.4.0.0, masalah ini muncul.

Mari kita bahas lebih dalam, dari sudut pandang saya.

Maksud :

Maksud dan Tujuan dari pesan error ini adalah memberitahukan kepada user bahwa App Serv tidak bisa menemukan kumpulan dari ActionMapping atau ActionFormBean, singkatnya, App Serv tidak bisa menemukan komponen pendukung untuk framework ini.

Penyebab :

Penyebabnya bisa bermacam-macam,

  • Terjadi kesalahan penulisan / syntax dalam struts-config.xml, bahkan kesalahan terkecil sekalipun, seperti kurangnya tanda “/” sebagai penutup tag element xml.
  • Kurangnya element load-at-startup pada web.xml juga bisa menyebabkan kesalahan ini.
  • Pada kasus saya, terjadi kesalahan dalam membaca library yang digunakan oleh aplikasi.

Solusi :

  • Periksa struts-config.xml dan web.xml, pastikan setiap pembuka tag element memiliki penutupnya.
  • Periksa pada web.xml, apakah dalam xml itu sudah terdapat tag element load-at-startup.
  • Pastikan struts.jar berada dalam folder WEB-INF/lib, dan juga letakkan struts.jar pada shared-lib app serv anda, struts.jar yang peletakannya redundan juga dapat menyebabkan kesalahan ini, seperti, dalam folder WEB-INF terdapat struts.jar dan dalam WEB-INF/lib juga terdapat struts.jar.

Semoga membantu.

Import Large MySQL Database Problem [solved]

masalah ini berawal saat saya berniat untuk memindahkan database project yang berada di laptop saya ke pc dirumah saya.

ya, saya tahu, membawa pekerjaan ke rumah haram hukumnya, namanya lagi kurang kerjaan, daripada bengong kayak sapi bencong, akhirnya saya memulai dengan meng-export database sebesar +/- 34 MB dengan menggunakan aplikasi phpmyadmin.

proses export file berjalan mulus, menghasilkan file bernama sparepartsv2.sql sebesar 24 MB. kemudian file tersebut saya pindahkan ke flashdisk dan diteruskan ke lubang usb di pc saya.

alhasil, saya kembali membuka aplikasi phpmyadmin pada pc saya untuk memulai proses import. saya pikir pemindahan akan berjalan mulus, tetapi phpmyadmin tidak sependapat dengan saya. proses import gagal dengan pesan sebagai berikut :

Failed to Import Database

intinya sih bilang bahwa file yang mau diupload kegedean. ok, it’s time to searching. dan saya menemukan 4 cara yang katanya akan berhasil. *dari berbagai sumber.

  1. Dengan menggunakan notepad, aka. file tersebut wajib dipecah-pecah per command INSERT, CREATE, etc. -saya memilih untuk tidak melakukan ini, capek kayaknya.
  2. Dengan menggunakan SSH Command  Line, abaikan phpmyadmin kesukaan saya, gunakan layar hitam, yes, back to basic. Akses langsung mysql dengan menggunakan command line tanpa third-party program.
  3. Dengan mengedit php.ini dan cari line : upload_max_filesize, max_execution_time, dan memory_limit. kemudian ubah sendiri value-nya dengan sesuka anda. -saya juga tidak memilih untuk tidak melakukan ini, i don’t wanna mess up with my mysql configuration.
  4. Dengan menggunakan third-party program, seperti BigDump, http://www.ozerov.de/bigdump.zip extract dan copy file php dari zip tersebut ke folder httpd application server anda, dan sertakan file sql yang akan diimport ke dalam folder yang sama, selanjutnya jalankan program itu melalui localhost anda. -saya sudah coba ini dan gagal. third-party ini tidak dapat mengenali beberapa syntax.

akhirnya saya memilih lewat jalan yang kedua, yaitu langsung mengakses mysql melalui command line. Tahap yang saya lalui :

  • Buka Command Line, *catat, pc saya menggunakan OS WIndows XP SP3*, Start–> Run –>ketik cmd –> tekan Enter
  • Masuk ke folder installasi mysql *saya menggunakan paket installasi XAMPP[Apache, PhpMyAdmin, MySQL]*, kemudian masuk ke dalam folder bin, tempat mysql.exe berada.

Command Line

  • ketik perintah dengan format mysql.exe -u username_anda -p nama_database

Command Line MYSQL

  • silahkan ambil cemilan dahulu, dan tunggu dengan santai sampai proses selesai.

*catatan :

export file dengan menggunakan format SQL.

export dengan jenis INSERT, jangan UPDATE/REPLACE.

jangan menggunakan Delayed Insert.

note :

Database yang digunakan = MySQL 5.0.51

Editor yang digunakan = PhpMyAdmin 2.11.4