JBoss AS 7部署顺序和时序

时间:2012-07-05 11:49:58

标签: deployment jboss jboss7.x

我这里有一个问题,一般是部署顺序,特别是时间。

我有一个耳朵1,通过bean和一些队列提供一些功能。队列在standalone.xml中配置。另一个耳朵2使用来自ear1的这项服务。

所以依赖关系看起来像:ear1< - ear2

所以我将耳2的部署结构配置为依赖于耳朵1,现在部署顺序本身是正确的。

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
    <deployment>
        <dependencies>
            <module name="deployment.ear1.ear" />
        </dependencies>
    </deployment>
</jboss-deployment-structure>

部署顺序现在是正确的,但我现在拥有的是竞争条件,因为(我猜)未初始化来自耳朵1的bean。

当我延迟部署ear2时,一切正常。

有谁知道如何控制部署的时间。是否可以通过jboss-deployment-structure.xml指定部署顺序,还可以指定开始下一次部署所需的生命周期?

更新

我试图指定包含要使用的服务的实际bean jar。这也行不通。它看起来像:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
    <deployment>
        <dependencies>
            <module name="deployment.ear1.ear.bean.jar" />
        </dependencies>
    </deployment>
</jboss-deployment-structure>

2 个答案:

答案 0 :(得分:5)

正如您现在可能知道的那样,将在JBoss 7.2中引入耳内依赖性 一个EAR定义了其他EAR使用的服务,我遇到了同样的问题。我通过在standalone.xml中完全关闭自动部署来解决这个问题:

    <subsystem xmlns="urn:jboss:domain:deployment-scanner:1.1">
        <deployment-scanner path="deployments" relative-to="jboss.server.base.dir" scan-interval="5000" auto-deploy-zipped="false" auto-deploy-exploded="false"/>
    </subsystem>

在启动JBoss之前,在单独的线程中运行以下脚本。该脚本创建部署列表,并使用JBoss 7部署扫描程序标记文件按指定顺序部署它们。即它为第一次部署创建.dodeploy标记,然后等待它部署,然后为第二次部署创建.dodeploy标记等。

#!/bin/bash
function contains() {
    local n=$#
    local value=${!n}
    for ((i=1;i < $#;i++)) {
        if [ "${!i}" == "${value}" ]; then
            echo "y"
            return 0
        fi
    }
    echo "n"
    return 1
}


DD="/home/martinv/jboss-as-7.1.1.Final/standalone/deployments"
ORDER_FILE="/home/martinv/order.txt"

echo "[MDC] Manual deployment control"
echo "[MDC] -------------------------"
echo "[MDC] Removing markers"
rm -f $DD/*.dodeploy $DD/*.isdeploying $DD/*.deployed $DD/*.failed $DD/*.undeployed $DD/*.pending $DD/*.isundeploying

APPS_ALL=( $( ls -1 $DD | grep '.ear$\|.jar$\|.war$\|.sar$' ) )

APPS_ORDER=( $( cat $ORDER_FILE ) )

echo "[MDC] ${#APPS_ALL[@]} apps in $DD: ${APPS_ALL[@]}"
echo "[MDC] Order defined for ${#APPS_ORDER[@]} apps: ${APPS_ORDER[@]}"

for APP in "${APPS_ALL[@]}"
do
    if [ $(contains "${APPS_ORDER[@]}" $APP) == "n" ]; then
        APPS_ORDER=("${APPS_ORDER[@]}" "$APP")
    fi
done

echo "[MDC] Final order of ${#APPS_ORDER[@]} apps: ${APPS_ORDER[@]}"

for APP in "${APPS_ORDER[@]}"
do
    echo "[MDC] Scheduled for deploy: $APP"
    touch "$DD/$APP.dodeploy"
    while [ ! -f "$DD/$APP.deployed" -a ! -f "$DD/$APP.failed" ]; do
        sleep 1
    done
    RESULT=`ls -1 $DD | egrep "$APP.failed|$APP.deployed"`
    echo "[MDC] Finished deploying $APP, result: $RESULT"
done

答案 1 :(得分:0)

我过去这样做的方法是修改ear文件的名称。部署似乎按字母顺序执行。如果您希望首先部署ear1,请将其重命名为a_ear1.ear,将ear2重命名为z_ear2.ear。