首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >脚本并发问题?

脚本并发问题?
EN

Stack Overflow用户
提问于 2013-03-11 17:12:47
回答 1查看 190关注 0票数 1

我使用"javax.mail“脚本进行并发调用,但显示为”antcall. Management InstanceNotFoundException“。我设置了10个并发,有时可以是10个,有时只有几个可以上升。

代码语言:javascript
复制
<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:type=etl,url="file:/informatica/infa861/oss_etl_523/src/ElectricCable/Pair_Conn.xml“javax.management.InstanceNotFoundException: scriptella:type=etl,mbean

我看scriptella源码,代码已经同步了

代码语言:javascript
复制
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");
    }
}

对于这种情况,你有什么建议?为了找到解决方案,我应该尝试什么,或者我应该阅读什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-11 21:30:09

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

作为一种变通方法,您可以切换到<java fork="true">任务,以便在派生的VM中运行脚本,因此Ant脚本将如下所示:

代码语言:javascript
复制
<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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15334754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档