2013-03-11 71 views
1

我使用“antcall”脚本并发调用,但出现“javax.mail。Management InstanceNotFoundException”。我设置了10个并发,有时可以是10个,有时候只有几个可以上升。scriptlla并发问题?

<target name="PAIR_CONN"> 
     <etl debug="true"> 
      <fileset file="Pair_Conn.xml" /> 
     </etl> 
    </target> 
    <target name="pair_conn_mult"> 
     <parallel threadCount='5'> 
      <antcall target="PAIR_CONN"> 
       <param name="g_flag" value="1" /> 
      </antcall> 
      <antcall target="PAIR_CONN"> 
       <param name="g_flag" value="2" /> 
      </antcall> 
      <antcall target="PAIR_CONN"> 
       <param name="g_flag" value="3" /> 
      </antcall> 
      <antcall target="PAIR_CONN"> 
       <param name="g_flag" value="4" /> 
      </antcall> 
      <antcall target="PAIR_CONN"> 
       <param name="g_flag" value="0" /> 
      </antcall> 
     </parallel> 
    </target> 

无法注销的mbean scriptella:类型= ETL,URL = “文件:/informatica/infa861/oss_etl_523/src/ElectricCable/Pair_Conn.xml” javax.management.InstanceNotFoundException:scriptella:类型= ETL, URL = “文件:/informatica/infa861/oss_etl_523/src/ElectricCable/Pair_Conn.xml”

我认为scriptella源代码,该代码已经同步,

public synchronized void register() { 
    if (name != null) { 
     throw new IllegalStateException("MBean already registered"); 
    } 
    server = getMBeanServer(); 
    String url = ctx.getScriptFileURL().toString(); 
    System.out.println("LM:"+url); 
    boolean registered = false; 
    for (int i = 0; i < 1000; i++) { 
     if (name == null || server.isRegistered(name)) { 
      registered = true; 
      name = toObjectName(url, i); 
      System.out.println("LM:"+name); 
     } else { 
      registered = false; 
      break; 
     } 
    } 
    etlThread = Thread.currentThread(); 
    if (!registered) { 
     try { 
      server.registerMBean(this, name); 
      started = new Date(); 
      LOG.info("Registered JMX mbean: " + name); 
     } catch (Exception e) { 
      throw new SystemException("Unable to register mbean " + name, e); 
     } 
    } else { 
     throw new SystemException("Unable to register mbean for url " + url + ": too many equal tasks already registered"); 
    } 
} 

什么建议给你做这个情况?我应该尝试什么,或者我应该阅读什么才能找到解决方案?

回答

0

感谢您指出一个严重的错误。我已打开JavaForge ticket来跟踪此问题。

正如你可以切换到<java fork="true">任务在分叉虚拟机上运行Scriptella一种解决方法,所以Ant脚本会变成这样的事情:

<path id="scriptella.class.path"> 
    <pathelement location="../../build/scriptella.jar"/> 
</path> 
<taskdef resource="antscriptella.properties" classpathref="scriptella.class.path"/> 

<target name="PAIR_CONN"> 
    <java fork="yes" classname="scriptella.tools.launcher.EtlLauncher" classpathref="scriptella.class.path"> 
     <arg value="Pair_Conn.xml"/> 
     <arg value="-d"/> 
     <sysproperty key="g_flag" value="${g_flag}"/> 
    </java> 
</target> 


<target name="pair_conn_mult"> 
    <parallel threadCount='5'> 
     <antcall target="PAIR_CONN"> 
      <param name="g_flag" value="1" /> 
     </antcall> 
     <antcall target="PAIR_CONN"> 
      <param name="g_flag" value="2" /> 
     </antcall> 
     <antcall target="PAIR_CONN"> 
      <param name="g_flag" value="3" /> 
     </antcall> 
     <antcall target="PAIR_CONN"> 
      <param name="g_flag" value="4" /> 
     </antcall> 
     <antcall target="PAIR_CONN"> 
      <param name="g_flag" value="0" /> 
     </antcall> 
    </parallel> 
</target> 
+0

感谢您的答复。 – 2013-03-12 05:38:46

+0

顺便说一句。这个问题现在应该已经解决了。您可以通过输入'mvn clean package'或'ant zip',从http://javaforge.com/svn/scriptella构建一个svn版本。 – ejboy 2013-03-12 07:59:02