Date: Fri, 24 Jun 2005 14:51:29 +0300 (EEST) From: Achilleus Mantzios <achill@matrix.gatewaynet.com> To: freebsd-java@freebsd.org Subject: Wierd problem in linux 2.4.18-bf2.4, Java Blackdown-1.4.2-rc1 Message-ID: <Pine.LNX.4.44.0506241323320.12515-100000@matrix.gatewaynet.com>
next in thread | raw e-mail | index | archive | help
Ok its linux a problem, but i think it would be interesting to you. 1st off, this problem does not occur in FreeBSD 5.4-STABLE, with java 1.4.2p7. (Kudos to FreeBSD java team!!!) The situation is as follows: >From a jsp i call java.lang.Process proc = Runtime.getRuntime().exec("/usr/local/sbin/uucico_command"); proc.waitFor(); /usr/local/sbin/uucico_command has as follows: ------------------------------------------------------------ #!/bin/sh /bin/rm -f /var/lock/LCK..ttyS* /usr/local/var/lib/pgsql/dbmirror/AsyncMirrorWithSpecialTables.pl /usr/local/var/lib/pgsql/dbmirror/OFFICE.conf /usr/local/sbin/gpsavg epochsecs=`date +'%s'` pushd /usr/local/var/XML_TO_OFFICE/ tar cfj As_AND_Ds_$epochsecs.tar.bz2 A*.xml D*.xml \rm -f A*.xml D*.xml popd /usr/bin/bzip2 /usr/local/var/XML_TO_OFFICE/* export PGUSER=postgres export PGPASSWORD="" vessel_name=`/usr/local/pgsql/bin/psql -A -q -t -h localhost dynacom -c "select replace(lower(name),' ','_') from vessels limit 1"` VESSEL_NAME=`/usr/local/pgsql/bin/psql -A -q -t -h localhost dynacom -c "select replace(name,' ','_') from vessels limit 1"` uucp -r /usr/local/var/XML_TO_OFFICE/*.bz2 uucphub\!/usr/local/var/XML_FROM_VESSELS/$VESSEL_NAME/. /bin/rm -fr /usr/local/var/XML_TO_OFFICE/* /bin/rm -fr /var/spool/uucppublic/outbound > /dev/null 2>&1 /bin/rm -fr /var/spool/uucppublic/inbound > /dev/null 2>&1 outbound=`/usr/bin/wc -c /var/spool/uucp/uucphub/D./* 2>/dev/null | tail -1 | awk '{print $1}'` outbound=${outbound:=0} echo $outbound > /var/spool/uucppublic/outbound 2>/dev/null uucp -r -g 0 /var/spool/uucppublic/outbound uucphub\!/var/spool/uucppublic/$vessel_name.inbound \rm -fr /var/spool/uucp/.Status/uucphub uucp_acct_id=`/usr/local/sbin/dyna_psql $outbound 2>/dev/null` /usr/local/sbin/dyna_log_uucp_acct_update $uucp_acct_id uucico -x 4 -f -s uucphub uucpsc=`/bin/cat /var/spool/uucp/.Status/uucphub | /usr/bin/awk '{print $1}'` uucpsc=${uucpsc:=99} #logger -p uucp.info "NOTICE!!! acctid="$uucp_acct_id "uucpsc="$uucpsc /usr/local/j2sdk1.4.2/bin/java -cp "/usr/local/jboss-3.0.3/server/default/SMA_UUCP.jar:/usr/local/pgsql/share/java/postgresql.jar:/usr/local/jboss-3.0.3/client/log4j.jar" com.gatewaynet.uucp.LogUUCPAcct $uucp_acct_id $uucpsc /usr/local/j2sdk1.4.2/bin/java -cp "/usr/local/jboss-3.0.3/server/default/SMA_UUCP.jar:/usr/local/pgsql/share/java/postgresql.jar:/usr/local/jboss-3.0.3/client/log4j.jar:/usr/local/jboss-3.0.3/server/default/lib/activation.jar:/usr/local/jboss-3.0.3/server/default/lib/mail.jar" com.gatewaynet.uucp.SendCollected pushd /usr/local/var/XML_FROM_OFFICE/ for ASDS in As_AND_Ds*.tar.bz2; do tar xfj $ASDS; rm -f $ASDS; done popd /usr/bin/bunzip2 /usr/local/var/XML_FROM_OFFICE/*.bz2 ############################################ ### The command below is the problematic one ############################################ /usr/local/jboss-3.0.3/server/default/readoff /etc/cron.daily/compstatus & ------------------------------------------------------------ now the problematic /usr/local/jboss-3.0.3/server/default/readoff has as follows ------------------------------------------------------------ #!/bin/sh export CLASSPATH="/usr/local/jboss-3.0.3/server/default/SMA_PER.jar:/usr/local/jboss-3.0.3/server/default/xerces.jar:/usr/local/jboss-3.0.3/client/jbossall-client.jar:/usr/local/jboss-3.0.3/client/log4j.jar:/usr/local/pgsql/share/java/postgresql.jar" /usr/local/j2sdk1.4.2/bin/java -Djavax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl com.gatewaynet.periodic.ReadXmlFromOffice ------------------------------------------------------------ whereas ReadXmlFromOffice.java has as follows: ------------------------------------------------------------ /* * Created on 19 Ìáñ 2004, 11:55:47 ðì * */ package com.gatewaynet.periodic; import java.io.File; import java.io.FileOutputStream; import java.io.PrintStream; import java.sql.PreparedStatement; import java.util.Arrays; import java.util.Comparator; import org.w3c.dom.Node; /** * @author achill4 * * To change the template for this generated type comment go to * Window>Preferences>Java>Code Generation>Code and Comments */ public class ReadXmlFromOffice { private static String XMLFROMDIR = "/usr/local/var/XML_FROM_OFFICE"; private static String XMLTODIR = "/usr/local/var/XML_TO_OFFICE"; private static String FILEDIR = "/usr/local/var/FILES_FROM_OFFICE"; static private org.apache.log4j.Logger logger = org.apache.log4j.Logger.getLogger("dynacom.RXML"); /** * */ public ReadXmlFromOffice() { super(); // TODO Auto-generated constructor stub } public static void main(String[] args) { java.sql.Connection con=null; try { javax.naming.InitialContext ic = new javax.naming.InitialContext(); Class.forName("org.postgresql.Driver"); con = java.sql.DriverManager.getConnection("jdbc:postgresql://localhost/dynacom","postgres",""); con.setAutoCommit(false); PreparedStatement vslidst = con.prepareStatement("select id from vessels limit 1"); java.sql.ResultSet vslidrs = vslidst.executeQuery(); if (!vslidrs.next()) throw new Exception("No vessel in database. Contact IT DEPT."); int thisvesselvslid = vslidrs.getInt(1); vslidrs.close(); vslidst.close(); con.commit(); javax.xml.parsers.DocumentBuilderFactory builderFactory =javax.xml.parsers.DocumentBuilderFactory.newInstance(); builderFactory.setValidating(false); javax.xml.parsers.DocumentBuilder builder =builderFactory.newDocumentBuilder(); builder.setErrorHandler(new com.gatewaynet.web.util.xml.MyErrorHandler()); File xmldir = new File(XMLFROMDIR); File[] xmlfiles = xmldir.listFiles(); Arrays.sort(xmlfiles,new DirComparator()); String[] xerrors = new String[xmlfiles.length]; String lastdone=null; int numxerrors=0; int xmli; for (xmli = 0; xmli < xmlfiles.length; xmli++) { File xmlfile = xmlfiles[xmli]; try { String xmlfilename =xmlfile.getName(); if (!xmlfilename.endsWith(".xml") && !xmlfilename.endsWith(".XML")) continue; org.w3c.dom.Document document = builder.parse(xmlfile); org.w3c.dom.Element rootel = document.getDocumentElement(); org.w3c.dom.NamedNodeMap attrs = rootel.getAttributes(); String xidstr=null; String vslidstr=null; org.w3c.dom.Attr attr; attr = (org.w3c.dom.Attr) attrs.getNamedItem("xid"); xidstr = attr.getValue(); attr = (org.w3c.dom.Attr) attrs.getNamedItem("vslid"); vslidstr = attr.getValue(); org.w3c.dom.Node curnd; org.w3c.dom.NodeList nodes = rootel.getChildNodes(); String appname=null; String apptbl_tmp=null; String gao=null; String idstr=null; String SQL=null; String comment=null; String filename=null; String file_base64=null; String unixcommand=null; for (int i = 0; i < nodes.getLength(); i++) { curnd = nodes.item(i); if (curnd.getNodeType() == org.w3c.dom.Node.ELEMENT_NODE) { if (((org.w3c.dom.Element) curnd).getTagName().equals("appname")) appname = ((org.w3c.dom.Text) curnd.getFirstChild()).getData(); if (((org.w3c.dom.Element) curnd).getTagName().equals("apptbl_tmp")) apptbl_tmp = ((org.w3c.dom.Text) curnd.getFirstChild()).getData(); if (((org.w3c.dom.Element) curnd).getTagName().equals("id")) idstr = ((org.w3c.dom.Text) curnd.getFirstChild()).getData(); if (((org.w3c.dom.Element) curnd).getTagName().equals("gao")) gao = ((org.w3c.dom.Text) curnd.getFirstChild()).getData(); if (((org.w3c.dom.Element) curnd).getTagName().equals("sql")) { Node sqlnode = curnd.getFirstChild(); if (sqlnode != null) SQL = ((org.w3c.dom.CDATASection) curnd.getFirstChild()).getData(); } if (((org.w3c.dom.Element) curnd).getTagName().equals("comment")) { Node commentnode = curnd.getFirstChild(); if (commentnode != null) comment = ((org.w3c.dom.Text) curnd.getFirstChild()).getData(); } /** * file transfer kai unix commands */ if (((org.w3c.dom.Element) curnd).getTagName().equals("filename")) { Node filenamenode = curnd.getFirstChild(); if (filenamenode != null) filename = ((org.w3c.dom.Text) curnd.getFirstChild()).getData(); } if (((org.w3c.dom.Element) curnd).getTagName().equals("filecontent")) { Node filecontentnode = curnd.getFirstChild(); if (filecontentnode != null) file_base64 = ((org.w3c.dom.CDATASection) curnd.getFirstChild()).getData(); } if (((org.w3c.dom.Element) curnd).getTagName().equals("unixcommand")) { Node unixcommandnode = curnd.getFirstChild(); if (unixcommandnode != null) unixcommand = ((org.w3c.dom.CDATASection) curnd.getFirstChild()).getData(); } } } if (xidstr == null) throw new Exception("xid is null"); int xid = Integer.parseInt(xidstr); if (vslidstr == null) throw new Exception("vslid is null"); int vslid = Integer.parseInt(vslidstr); if (gao == null) throw new Exception("gao is null"); if (vslid != thisvesselvslid && !gao.equals("FLTRAN") && !gao.equals("UNXCOM")) throw new Exception("This Transaction is for Another Vessel. Contact IT DEPT."); logger.info("Processing file "+xmlfilename); if (gao.equals("ACKNOW")) { PreparedStatement st = con.prepareStatement("update xadmin set state='ARC' where xid=?"); st.setInt(1,xid); int rc = st.executeUpdate(); if (rc != 1) throw new Exception("Error updating xadmin to ARC."); st.close(); } else if (gao.equals("CANCEL")) { PreparedStatement st = con.prepareStatement("update xadmin set state='CAN',comment=? where xid=?"); st.setString(1,comment); st.setInt(2,xid); int rc = st.executeUpdate(); if (rc != 1) throw new Exception("Error updating xadmin to ARC."); st.close(); } else if (gao.equals("REPLIC")) { logger.info("IN REPLIC for file "+xmlfilename); // EDW MAS ENDIAFEREI MONO TO SQL. java.sql.Statement st2 = con.createStatement(); logger.info("IN REPLIC after createStatement for file "+xmlfilename); if (SQL != null) st2.execute(SQL); logger.info("IN REPLIC after execute for file "+xmlfilename); st2.close(); } else if (gao.equals("FLTRAN")) { if (filename == null) throw new Exception("File name in file transfer cannot be null. Contact IT DEPT."); if (file_base64 == null) throw new Exception("File content in file transfer cannot be null. Contact IT DEPT."); byte[] filecontent = Base64.decode(file_base64.toCharArray()); File outfile = new File(FILEDIR+"/"+filename); FileOutputStream fout = new FileOutputStream(outfile); fout.write(filecontent); fout.close(); } else if (gao.equals("UNXCOM")) { if (unixcommand == null) throw new Exception("Command in unix command cannot be null. Contact IT DEPT."); // PROSOXH SE size(unixcommands)/1024 > (getconf ARG_MAX) Process proc = Runtime.getRuntime().exec(new String[] {"sh","-c",unixcommand}); FileOutputStream fout = new FileOutputStream(new File(XMLTODIR+"/"+xmlfile.getName().replaceAll(".xml","")+".out")); PrintStream out = new PrintStream(fout); java.io.InputStream procout = proc.getInputStream(); out.println("=============="); out.println("Output (if any)"); out.println("=============="); int c; while ((c=procout.read()) >=0) { out.write(c); //System.out.write(c); //System.out.flush(); } java.io.InputStream procerr = proc.getErrorStream(); out.println("=============="); out.println("Error (if any)"); out.println("==============="); while ((c=procerr.read()) >=0) { out.write(c); //System.out.write(c); //System.out.flush(); } } else throw new Exception("GAO "+gao+" not supported. CONTACT IT DEPT."); con.commit(); boolean isdeled = xmlfile.delete(); if (!isdeled) throw new Exception("Error deleting file. Xaction Aborted."); System.out.println("OK with file "+xmlfile.getName()); lastdone=xmlfile.getName(); } catch (Exception xmle) { System.out.println("Error : "+xmle.getMessage()+": with file "+xmlfile.getName()); logger.error("Error : "+xmle.getMessage()+": with file "+xmlfile.getName()); //xmle.printStackTrace(); con.rollback(); xerrors[numxerrors++]="--------------------------"+"Error with "+xmlfile.getName()+"--------------------------\n"+ xmle.getMessage()+"\n"+"---------------------------------------------------------------------"; xmlfile.delete(); } } // end for if (lastdone != null) { FileOutputStream fout = new FileOutputStream(new File(XMLTODIR+"/lastdone.mon")); PrintStream out = new PrintStream(fout); out.println("Last XML was "+lastdone); } if (numxerrors!=0) { FileOutputStream fout = new FileOutputStream(new File(XMLTODIR+"/xerror.mon")); PrintStream out = new PrintStream(fout); int run; for (run=0;run<numxerrors;run++) { out.println(xerrors[run]); } } } catch (Exception pce) { System.out.println("A General XML Error Occured: "+pce.getMessage()); logger.error("A General XML Error Occured: "+pce.getMessage()); } finally { if (con != null) try {con.close();} catch(Exception fe){} } } } class DirComparator implements Comparator { public DirComparator () { } public int compare(Object obj, Object obj1) { File f = (File) obj; File f1 = (File) obj1; String str = f.getName(); String str1 = f1.getName(); int i,i1; //System.out.println("str="+str); //System.out.println("str1="+str1); if (str.charAt(0) < str1.charAt(0)) return -1; else if (str.charAt(0) > str1.charAt(0)) return 1; try { i = Integer.parseInt(str.substring(1,str.indexOf('.'))); //System.out.println("i="+i); } catch (Exception e) { return 1; } try { i1 = Integer.parseInt(str1.substring(1,str1.indexOf('.'))); //System.out.println("i1="+i1); } catch (Exception e) { return -1; } if (i < i1 ) return -1; else if (i==i1) return 0; else return 1; } public boolean equals(Object obj) { return false; } } ------------------------------------------------------------ Now the really wierd problem. When the /usr/local/jboss-3.0.3/server/default/readoff is run from the shell it has never stalled, behaved strange or failed. Also when the /usr/local/sbin/uucico_command is run from the shell it has never failed, or *caused* /usr/local/jboss-3.0.3/server/default/readoff to stall. BUT, when i run /usr/local/sbin/uucico_command from the JSP, then i experience a stall of the /usr/local/jboss-3.0.3/server/default/readoff script, and only if there are many (where many varies from run to run, but generally more than lets say 10) xml files to be processed in /usr/local/var/XML_FROM_OFFICE/. The java program in readoff processes *some* XML files, and then stalls for no apparent reason. The solution was to replace the last 2 lines /usr/local/jboss-3.0.3/server/default/readoff /etc/cron.daily/compstatus & with echo /usr/local/bin/afteruucico | at now where /usr/local/bin/afteruucico is just #!/bin/sh /usr/local/jboss-3.0.3/server/default/readoff /etc/cron.daily/compstatus In other words, i have a JSP calling a script, which calls another script which executes a java program. The java programm does some processing and then sleeps for no reason without finishing, without spitting out any Exceptions. When i magically "jump out" of the initial java environment (jboss/JSP), with the *at* command, then the readoff script and its ReadXmlFromOffice java programm all work fine. Any thoughts would be great. I checked ulimit,etc, with no apparent clue. This problem kinda haunted me last night, and i just wanna kill it, instead of pretending i found a workaround. The only "excuse" i can think of, is that it runs in Linux, which i am not extremely familiar with. If you need more feedback, or if any ambitious volunteer wants to hunt this down, i am happy to help. P.S. The jboss dir in FreeBSD, is a morningly tbz from the linux machine, so no tricks there. -- -Achilleus
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.LNX.4.44.0506241323320.12515-100000>