miercuri, 25 august 2010

Server launched but failed initialization - WebSphere

I tried the innocent action of starting the WebSphere Application Server on the machine with zOS and I got the following problem:

ADMU0128I: Starting tool with the ProcSrvBG profile
ADMU3100I: Reading configuration for server: server1
ADMU3200I: Server launched. Waiting for initialization status.
ADMU3011E: Server launched but failed initialization. Server log files
> should contain failure information


I wasted almost a day trying to figure out what happened, among the possible reasons and solutions there were:
1. another process is already using the port that the Applcation Server wants to use(see here)
2. reinitializing the configuration by running "osgiCfgInit.bat" from ./profiles/profilename/bin (see here)
3. host name changes

None of these worked in my case. The reason was there was not enough space on disk. An it was that bad, that we couldn't even start the servers even worse it could not be logged anymore and the only thing that could be found was some output in native_stderr.log under ./websphere_location/profiles/profilename/logs/servername/native_stderr.log:

An exception occurred while writing to the platform log:
java.io.IOException: There is not enough space in the file system.
at java.io.FileOutputStream.write(FileOutputStream.java:290)
at sun.nio.cs.StreamEncoder$ConverterSE.implFlushBuffer(StreamEncoder.java:285)
at sun.nio.cs.StreamEncoder$ConverterSE.implFlush(StreamEncoder.java:291)
at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:202)
at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:236)
at java.io.BufferedWriter.flush(BufferedWriter.java:257)
at org.eclipse.core.runtime.adaptor.EclipseLog.log(EclipseLog.java:309)
at org.eclipse.core.runtime.adaptor.EclipseLog.log(EclipseLog.java:295)
at org.eclipse.osgi.internal.baseadaptor.BaseStorage.saveBundleDatas(BaseStorage.java:520)
at org.eclipse.osgi.internal.baseadaptor.BaseStorage.saveAllData(BaseStorage.java:372)
at org.eclipse.osgi.internal.baseadaptor.BaseStorage.access$1(BaseStorage.java:362)
at org.eclipse.osgi.internal.baseadaptor.BaseStorage$StateSaver.run(BaseStorage.java:1081)
at java.lang.Thread.run(Thread.java:811)
Logging to the console instead.

!ENTRY system.bundle 4 0 2010-08-25 14:54:16.265
!MESSAGE FrameworkEvent.ERROR
!STACK 0

java.io.IOException: There is not enough spa


(Please notice how abrupt he error message had to end - it might not look funny to you but when I saw it I laughed for 10 minutes...in the bathroom).


While trying to figure out the problem I got to the conclusion that I don't like the netstat command under zOS at least - just a personal attitude.

miercuri, 2 iunie 2010

SQL query for finding duplicates

I've noticed this problem among persons who seemed to have some experience on querying data bases.
Detect duplicates in a table. For example we have he table TABLE1 with columns C1, C2, C3 and we need all the entries that have duplicate C1 value or duplicate combination C1,C2.

One of the solution is this:

select * from TABLE1 t where 1>(select count(*) from TABLE1 t1 where t.C1 = t1.C1);

select * from TABLE1 t where 1>(select count(*) from TABLE1 t1 where t.C1 = t1.C1 and t.C2 = t1.C2);

Same syntax is used for DB2, Informix, Oracle.

marți, 1 iunie 2010

Business Process Choreographer Process Instances

You can manipulate the business process templates and instances from BPC Explorer but, of course, you felt like doing it from Java or from Jhyton (or from somewhere else I can't help you with :).

So if you need to do things with your BPC process instances in IBM Websphere you might find this article useful.

First if you want to get to a process instance you want to locate the Business Flow Manager (because it is an EJB) and use the obtained object to delete, terminate and do whatever action you need with a process, check BusinessFlowManager's API here. And by getting the Process Instance itself (see API here), a ProcessInstanceData object needs to be obtained, for example by id: bfm.getProcessInstance(PIID id) or bfm.getProcessInstance(String identifier);

ok, just to make it more clear:

In Java
:

...
//initialize context and lookup the home interface
InitialContext context= new InitialContext();
Object object = context.lookup("com/ibm/bpe/api/BusinessFlowManagerHome");

//typecast (narrow down) the object to BusinessFlowManagerHome
BusinessFlowManagerHome bfmHome =
(BusinessFlowManagerHome)javax.rmi.PortableRemoteObject.narrow(object,
BusinessFlowManagerHome.class);

//Access the remote interface for the BusinessFlowManager bean
BusinessFlowManager bfm = bfmHome.create();

String id= "_PI:90030128.f2ab6a6e.bc87e953.d13606e2");

ProcessInstaceData pd = fm.getProcessInstance(id);
if (ProcessInstaceData.STATE_FAILEDSTATE_RUNNING.equals(pd.getExecutionState())) {
bfm.delete();
}


...

In Jhyton:

from javax.naming import InitialContext
from java.util import Hashtable

env = Hashtable()
env.put("java.naming.factory.initial","com.ibm.websphere.naming.WsnInitialContextFactory")
//server's ip and bootstrap port (found in the admin console application servers->ports)
env.put("java.naming.provider.url","corbaloc:iiop:112.24.120.11:1111")


context = InitialContext(env)

home = context.lookup("com/ibm/bpe/api/BusinessFlowManagerHome")
bfm = home.create()

processInstance = bfm.getProcessInstance(piid)
execState = processInstance.getExecutionState()
if execState == processInstance.STATE_FAILED :
print "failed"
bfm.delete(piid)
elif execState == processInstance.STATE_RUNNING :
print "running"
bfm.forceTerminate(piid)
bfm.delete(piid)


You can refer the examples for Java and documentation for Jhyton.

luni, 31 mai 2010

Edit/update blob data in Informix

If you are using informix as your data base and you want to upload data in clob or blob column from a file you can use FILETOBLOB or FILETOCLOB.

FILETOBLOB(path, location)
FILETOBLOB(path, location)

path - path to the file to be uploaded
location - client/server - the file is uploaded from the client of from the server of the Data Base

Examples:

UPDATE table SET value = FILETOCLOB("E://MyDocuments/Utils/temp/complInf.xml", 'client');

UPDATE table SET value = FILETOBLOB("E://MyDocuments/Utils/temp/complInf.xml", 'server');

INSERT INTO table
VALUES (437, FILETOBLOB('datafile', 'client'),
FILETOCLOB('tmp/text', 'server'));