Showing posts with label English. Show all posts
Showing posts with label English. Show all posts

Saturday, May 5, 2012

BEWARE of asterisk!

Some sharing. 

I was about to replace certain string in a specific file in all directories in a AIX machine. We have a Perl script file to perform this action. All this while it has been running fine but not today.

After some troubleshooting i quickly discovered it is due to: the string that we are going to replace contains an asterisk(*) which causes the whole script not working properly.

Very shortly my colleague found a solution, which is to 'escape' the asterisk(*) symbol by putting a backslash(\) symbol right before the asterisk(*) symbol so that when the script is running it will escape the *

Before (this will give error)
perl -p -i -e 's/12345*9/abcde/g' `find ./ -name somefile

After (this will solve the problem)
perl -p -i -e 's/12345\*9/abcde/g' `find ./ -name somefile

Sunday, March 11, 2012

Strange issue on JAR???

Wondering if anyone out there experience this before.

I have this program calling a external web service. So i built the client classes to consume it.

After some time the web service contract/schema had changed, i needed to either change the content of the classes or rebuild the client classes again. Usually i prefer a rebuild as this will be done by the generator with very minimum effort.

So i rebuilt the client classes. Everything worked fine in the Staging/Testing environment until the production rollout day.

Exactly the same JAR, but not working. I drilled down into which line that caused the havoc. Strange thing is that the program was not able to read the particular web service client classes. I then checked if the client classes were included in the JAR and they were there! Their were at the right path too! What happened?

No choice i needed to get this done asap. I moved these classes from one folder to another folder, ofcuz by using the refactor function. This was just a blind hit and guess what, it works!!!

This may give you an idea the next time you are facing exactly the same weird issue!

Best way to remove MQRFH Header (WMB)

I have tried many approaches just to achieve this. My goodness each approach is so unstable. It may work in environment A but then somehow does not work in environment B.

With the help from a more experienced colleague, the optimum solution for that seems to be:

1) Set the Message Domain as XMLNSC for MQInput Node.
2) Create a Compute Node then write your ESQL as follows:
CALL CopyEntireMessage();
SET OutputRoot.MQRFH2 = null;

Done! It's never been so easy. Fuck i wasted much time in this! Should have known this colleague long time back.

Tuesday, March 1, 2011

WMB It's best to set BLOB as the parser for message containing MQRFH2 header

I was struggling with this message(XML) with MQRFH2 Header.

I have tried the MRM Header, the drawback is that you got to choose a schema, which makes it less flexible. Also the parsers being selected at runtime (printed in the mqsitrace log) are not consistent! Still puzzling.

Setting parser as BLOB in the MQInput node solved my issue. Without making any further message format conversion, you can read the xml using XMLNSC parser anytime anywhere.

Monday, September 27, 2010

Transfer message with RFH header from one queue to another queue

I have this simple java program transferring message with RFH header from one queue to another queue in bulk.

First time it failed due to the program failed to maintain the RFH header during the transfer. It read the message in STRING format and then put the message back in the destination queue.

After that i changed this by sending the MQMessage directly to the destination queue. This works.

Thursday, September 9, 2010

java.sql.Date not working on WPS 6.2?

I had this program reading database table column as java.sql.Data type. Well it failed to read this when running from the WPS AIX server. Funny thing is it was fine when i was testing this program from my local WPS server runtime. In application log the column data type is recognized as java.sql.Timestamp. So i have to change to program to read Timestamp instead of Date.

Thursday, June 3, 2010

MQ-related CRON job setting

Recently my colleague was faced with the crontab issue. Below is the description:

1. CRON Tab

We developed a JAR where it connects to the Queue Manger and puts message into the Queue to kick start the WMB flow. We have created a Shell script to send message to the queue. It is successful by executing the Shell script manually where it connects to the Queue Manager and successfully put the message into the Queue.

Unfortunately, the CRON job failed to execute this script. After a few rounds of investigation we found out that this is due to the AIX Environment Setting. We need to set the environment variables at our Shell script as below before connecting to MQ:
. /opt/IBM/mqsi/6.1/bin/mqsiprofile

The default environment setting for CRON does not have the MQ Specific environment.
Therefore, when we are using server binding, we need in include this into our Shell script.
If the Shell is running externally as client, we do not need to include this.

Wednesday, May 26, 2010

Modify WSDL to get the java client generated right

I have to generate java client for this WSDL. However the bean generated is not what i expect. The reason is the SOAP response format actually looks like this:

<data>
<field id="field1"><field>
<field id="field2"><field>
...
</data>


The bean generated is like this:

public Class Response{
Field[] data;
....
}

I failed to get the value of each . The Field class does not provide a getValue method. Instead it provides getId method which returns the field id.

I had 2 solutions:

1) Modify the generated java web-service client code. (Those serializer, deserializer etc)
2) Modify the WSDL to get the code generated as according to what i want.

I chose the second option.

I commented this segment of the WSDL:

<xsd:element maxOccurs="unbounded" name="field">
<xsd:complexType>
<xsd:sequence maxOccurs="1" minOccurs="1" />
<xsd:attribute name="id" type="xsd:string" />
</xsd:complexType>
</xsd:element>


I replace the above segment with:

<maxoccurs="unbounded" minoccurs="0" name="field" nillable="true" type="xsd:string"/>

Done!

Wednesday, March 31, 2010

Issue with JMS & MQInput node in WMB

The XML is sent by JMS as below format:

reqMsg.setJMSType("mcd://mrm//" + msgType + "?format=CwXML");

WMB trace file throws the below error:

See the following messages for details of the error.
2010-03-31 16:49:05.949233 13942 ParserException BIP5313E: Message format ''CwXML'' is not defined for message set ''RR_MVNO_Port_In_MessageSet (H74SG78002001)''.
The broker received a message for processing within the MRM domain.
However, the message cannot be processed because the message format specified in the physical format identifier ''CwXML'' has not been defined for message set ''RR_MVNO_Port_In_MessageSet (H74SG78002001)''.
The message format describes the physical representation of the message, and you can specify this format either in the properties on an input node, or dynamically within an MQRFH2 message header.

The solution is to add one more "XML Wire Formats" at the Message Set.

Also, need to make sure the MQInput node's Message Domain & Message Set are set with the correct values.

Tuesday, March 16, 2010

Another cert issue

We have this standalone java program running on a AIX box calling a web service which is running on https. The web service provider provided us the cert and we imported this cert to the cacerts keystore using IBM Key Management tool(Alternatively you may use the java keytool command).
(Anyway this is the first time i am exposed to this, so please correct me if i am wrong)

At first the web service called failed. We got the below error:

unable to find valid certification path to requested target


We checked the shell script where we started this program. In the shell script, the java command path is specified as /usr/java5_64/bin and the cacerts actually resides at /usr/java5_64/jre/lib/security

Therefore we changed in our script from /usr/java5_64/bin/java to /usr/java5_64/jre/bin/java and now it is working well.

Please find the 2 URLs as below

Link1


Link2

Thursday, February 11, 2010

Issue with Java Security Provider

While working on one enhancement. I encountered a weird problem. The program within WBIA framework failed in calling web service. It was throwing me a NullPointerException from Axis library as below:

at java.security.SecureRandom.nextBytes(SecureRandom.java:433)
at org.apache.axis.utils.SessionUtils.generateSessionId(SessionUtils.java:62)
at org.apache.axis.SOAPPart.<init>(SOAPPart.java:164)
at org.apache.axis.Message.setup(Message.java:377)
at org.apache.axis.Message.<init>(Message.java:246)
at org.apache.axis.client.Call.invoke(Call.java:2425)
at org.apache.axis.client.Call.invoke(Call.java:2366)
at org.apache.axis.client.Call.invoke(Call.java:1812)

I made the investigation as below:

1) I put a java.security.Security.getProviders() in my program to list all the security providers. I compared the results from successful call (standalone java program running at the same AIX server) and unsuccessful call (program extending from WBIA framework running at the same AIX server).

Here is the result:

//Unsuccessful call.
- IBMJSSE2
- IBMJGSSProvider
- IBMCertPath

//Successful call
- IBMJSSE2
- IBMJCE
- IBMJGSSProvider
- IBMCertPath
- IBMSASL

Obviously some security providers are missing hence caused the unsuccessful call. I double confirmed this by modifying my java.security file at local and tested the same program from my local. Yes the web service call actually failed due to the missing security provider. The missing security provider is actually com.ibm.crypto.provider.IBMJCE

Therefore, i did the below the solve this issue:

1) Set the Java home path to the JRE folder instead of the JDK folder itself.

2) I added the security provider at runtime.
java.security.Security.addProvider(new com.ibm.crypto.provider.IBMJCE());

Finally it worked. One question is, how come it somehow did not refer to the java.security file that i set everything correctly else i do not have to do the 2nd step as mentioned. I still need to find out this.

Thursday, November 12, 2009

Load Test

Past few days i encountered one serious production issue, which the web service timeout before the backend process sent back the message to the SOAP response node in WMB flow. This was due to the high load in production that caused the delay in the backend process.

The whole process is: WMB flow extracts SOAP request message, turns it into a MQ Header message, puts the message to Java adaptor's request queue, then Java adaptor processes the content and puts a response message to the response queue, then WMB flow will read the message in the response queue and will turn it into a SOAP response.

In the progress of investigation, we decided to move one database query out from the java adaptor program to the WMB flow. The reason being is sometimes the db connection will just drop and the java adaptor program has to spend some time reinitiating the db connection. In fact according to the time recorded in the adaptor's log the process was still quite fast, it's even within miliseconds. Well we just gave it a try.

After making all the necessary changes we deployed the works to the testing environment. I then performed some load tests to the web service. The result was negative. The tps was around 3.5 but the average time taken was > 10 seconds and we had to achieve < 10 seconds! So still plenty of work to do :(

We performed a few cycles of investigation, trial and error & testing until we found the solution - increasing the WMB flow instance. This is a setting in the WMB Toolkit. So we increased the number of instances to 3. This time we managed to achieve an average time of 3 seconds! We were so happy and excited!

What about the cause? See below:

There were many messages piling at the response queue which is supposed to be read by the WMB flow. These messages were sent in by the Java Adaptor after it finished processing the data. Apparently these messages were not picked up by the WMB flow in time hence causing the timeout error. By increasing the WMB flow instance, concurrently there are 3 identical WMB flows reading the content of this queue, hence problem resolved!

I was really relieved!

Friday, July 24, 2009

NullPointerException in SecureRandom.nextBytes

 

I was facing this issue where a web service client which had always been running fine suddenly stopped functioning properly due to an error NullPointerException in SecureRandom.nextBytes

AxisFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
faultSubcode:
faultString: java.lang.NullPointerException
faultActor:
faultNode:
faultDetail:
{http://xml.apache.org/axis/}stackTrace:java.lang.NullPointerException
at java.security.SecureRandom.nextBytes(SecureRandom.java:406)
at org.apache.axis.utils.SessionUtils.generateSessionId(SessionUtils.java:62)
As you can see the exception was thrown when some class in Axis is calling the nextBytes function from SecureRandom Class. I spent quite some time in this and i think that is a bug for IBM version of JRE 1.4.2. If you want to know more, read here.
Therefore i changed the script which starts my web service client by using the java command from Java 5 instead of java 1.4.2 and finally it worked!

Saturday, May 30, 2009

Busy with Web Services on WPS

For the past two weeks i had been very busy with building web services using java 1.4. Bad thing was i had to deploy them on Websphere Process Server 6.0,

I had no problem building the web services using Rational Software Architect(RSA). I tested my work by deploying to Websphere Application Server 6.1 runtime that comes together with the RSA. Everything was working fine.

However i started to have a lot of headaches while trying to deploy these web services by using Websphere Admin Consle to Websphere Process Server 6.0.2 which is running on a remote server. My web service application just could not start!

After trying out several solutions, in the end i migrated my source codes to Websphere Integration Developer 6.0(WID). I regenerated every web service related deployment configuration files and proxy classes by using WID.

This time my web service application started successfully! Well the next problem was it was unable to get database connection! It took me quite some time to figure out what's wrong with it and finally i realized that i had to get the JDBC connection from the WPS itself instead of creating my own OracleDataSource cache.

I created all JDBC connection that the web service applications needs by using the Websphere Admin Console. I also changed my code to get the JDBC connection via JNDI.
The method is simple. Just create a default initialContext, then within the context, get your JDBC connection by name like "JDBC/MyDB" will do.

Saturday, March 21, 2009

Run java program at backend on Windows

Normally, if you want to start a Java program to run as back end process, just type the command follow by a '&'. However, how do you do the same on Windows?

Yesterday my colleague was facing this problem and i remembered i have gone through the same problem before in my previous company. After we went through the windows command list i found something, which is the 'start' command. Then i remembered i might have used this command before when i had faced the same problem last time.

So we tried the 'start' command and it was successful.

Friday, March 20, 2009

Why IT Project Fails!

I have come across an article talking about why IT project fails!

Take a look on it!

My experience told me that business users often do not want to spend much time with the developers during the development of a system. They do not realize that it is very very critical and useful to the final result of the system by spending time reviewing developers work to find out whether something is missing at the early phase of the project! Well i do agree that agile methodology approach is very very good provided the business users are willing to allocate resource to examine the system.

Friday, March 6, 2009

Working on wrong direction

One day the client raised an issue to me. That issue would not happen if the Websphere Message Broker (WMB) flow that i deployed on the server is running fine.

I checked the queue and channel status by using a tool called MQJ explorer and found out both the sender and receiver channels' status were 'inactive'. I then turned it to 'running' again. However their status will still be 'inactive' after some time. I had gone mad about this and spent a whole day trying to find out what went wrong.


In the end i know i went into the wrong direction. It is normal that after some time the status of the channels go to 'inactive'. As long as the transmission trigger is on then there will be no problem. When the next message comes in then the sender and receiver channels will be activated again.

So what actually went wrong. Argh it is because the portal team did not set the correct queue name to the JMS header of the XML message and thus no response from the whole flow!

Saturday, February 28, 2009

Complex investigation, easy solution

Yesterday I was facing one production issue where somehow at some time the connection to a database which is located at another server will be reset. I was getting java.lang.SqlException(io exception: connection resrt). I have reused a method that will reconnect to the database. I hope it works in the next deployment and i believe it should work. Code snippet as below:



public Connection getDBConnection(String dbName) throws OracleConnException, Exception {
if (logger.isInfoEnabled()) {
logger.info("getDBConnection(String) - String dbName=" + dbName); //$NON-NLS-1$
}

Connection cachedConnection = null;
if (ocDataSource == null) {
ocDataSource = new HashMap();
this.printSQL("new HashMap");
}

OracleDataSource ds = (OracleDataSource) ocDataSource.get(dbName);

if(ds == null){
this.printSQL("creatingNewOracleDS");
ds = createNewOracleDS(dbName);
this.printSQL("createdNewOracleDS");
ocDataSource.put(dbName.trim(), ds);
}

int i = 0;
int retry = KenanAdaptorProperties.getORACLE_RETRY_NUM();

for(i = 0; i < retry; i++){
try {
this.printSQL("ds.getConnection() " + ds.getPortNumber());

cachedConnection = ds.getConnection();
this.printSQL("error in connection? ");

if(!isConnectionAlive(cachedConnection)){
this.printSQL("connection is not alive???");
try { ds.close(); } catch(Exception e){
//log.debug("Can't close DataSource object!");
}
ds = null;

ocDataSource.remove(dbName);

ds = createNewOracleDS(dbName);
ocDataSource.put(dbName, ds);
} else {
break;
}

} catch (SQLException se){
logger.error("getDBConnection(String)", se); //$NON-NLS-1$
} catch (Exception e){
this.printSQL("Exception:\r\n" + Util.getStackTraceForLog(e));
}

// sleep for a specific amount of time!
//make it configurable
try {
Thread.sleep(KenanAdaptorProperties.getORACLE_RETRY_SLEEP_TIME());
} catch (InterruptedException e) {
// log.debug("Interrupted Exception:\r\n" + Util.getStackTraceForLog(e));
}

}

if(i == retry){
throw new OracleConnException("Connection is not established. Failed after " + retry + " retries.");
}

return cachedConnection;
}

Wednesday, February 25, 2009

production rollout for Kenan Adapter running on Websphere Business Integration Adapters is successful!

Finally the production rollout for Kenan Adapter is successful!

This is the third deployment after the unsuccessful first two. Well it went well in spite of some minor issues. Most of the scenarios are catered this time. The client's testing team had done a good job this time for testing thoroughly on all kind of possible scenarios! Yeah they should have done that during the UAT time! If they would allocate some time for more scenario testing, the deployment would have gone well even before year 2009! No it's approaching March and the client only managed to use it now. Well, this project does not bring any income to my team anyway. My project manager took this project to cover up some other unit's shit. Now that the long term outsource deal has been closed.

I am studying Websphere Process Server now. It looks far more complicated. I think i need some time to digest some new terms here. I should get myself involved in at least one project related to this product so that i can gain more expertise in this product.

All in all, good news this week. I am glad especially for the successfull rollout for Kenan Adapter. I have put very much effort in making this successful. I would like to thank my project manager for the support! That is important to continue to boost my morale.

Friday, January 16, 2009

Something funny has happened!

I am not sure why. Somehow the XML message that was passed to my request queue contains response tag which is not supposed to be attached to it.

What annoyed me was my WBI adapter for Kenan kept processing the same XML message over and over again! Thank to this and only i found out that there was one database connection remained opened thus causing more and more database sessions created!!! This could be a serious issue and luckily i tackled the problem before the system goes for production! However, i still need to find out why sometimes the XML message is redirected to the request queue even tough it has been processed by the adapter without encountering any Tuxedo connection error! The only clue i know now is this kind of 'problematic' XML message contains response tag! Could it be an error from the portal side? Could it be they acquired the processed XML message from response queue and then sent to request queue again? Well, it is doubtful.

Scratching head... continue tomorrow....