确保有序关闭karaf中的软件包

时间:2018-09-04 08:35:58

标签: osgi apache-karaf osgi-bundle blueprint-osgi

对于一个简单的用例,我在Karaf中有两个捆绑包:

  1. 捆绑共享库
  2. Bundle-My-Implementation->取决于(1)Bundle-Shared-Library,通过bean的depends-on属性在蓝图中提到了

我要遵循的步骤:

  1. 加载包(1)
  2. 加载包(2)
  3. 关机卡夫

很明显,(2)依赖于(1)。关闭Karaf时,首先删除Bundle(1),这会导致传输中的消息丢失,因为它找不到其依赖项并且无法进一步处理。

我尝试将(1)的开始级别设置为高于bundle(2)的开始级别。这没有帮助。

我还尝试在org.apache.aries.blueprint.preemptiveShutdown=false中设置etc/config.properties。这也没有帮助。

我在这里想念东西吗?

-编辑1-

在四处浏览后,我发现我们可以在DefaultShutdownStrategy中设置超时的自定义值。因此,作为一种解决方法,我已完成以下操作:

<bean id="shutdownStrategy" class="org.apache.camel.impl.DefaultShutdownStrategy">
        <property name="timeout" value="1" />
</bean>

我知道这不是一种干净且最佳的方法。暂时,它以某种方式帮助我避免丢失大量机上消息。

但是,任何建议或反馈都很好。

-编辑2-添加捆绑软件1的蓝图文件

<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.3.0"
           xmlns:camel="http://camel.apache.org/schema/blueprint"
           xsi:schemaLocation="
             http://www.osgi.org/xmlns/blueprint/v1.0.0 https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
             http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint.xsd
             http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.3.0 http://aries.apache.org/schemas/blueprint-cm/blueprint-cm-1.3.0.xsd
             ">

    <!-- persistent-id for shared context -->
    <cm:property-placeholder persistent-id="xxx.shared" update-strategy="none" >
        <cm:default-properties>
        ...
        </cm:default-properties>
    </cm:property-placeholder>

    <!--jms broker connection--> 
    <reference id="jmsProducerConnectionFactory" interface="javax.jms.ConnectionFactory" filter="(osgi.jndi.service.name=jms/xxx.producer)" availability="mandatory" />

    <bean id="xxx-producer" class="org.apache.camel.component.jms.JmsComponent">
        <property name="connectionFactory" ref="jmsProducerConnectionFactory"/>
    </bean>

    <!-- Source DB Reference -->
    <reference id="XDataSource" interface="javax.sql.DataSource" filter="(osgi.jndi.service.name=xxx-datasource)" availability="mandatory"/>

    <!-- Datawarehouse DB Reference -->
    <reference id="dw" interface="javax.sql.DataSource" filter="(osgi.jndi.service.name=xdb-datasource)" availability="mandatory"/>

    <bean id="prs" class="org.apache.camel.component.sql.SqlComponent">
        <property name="dataSource" ref="XDataSource"/>
    </bean>

    <bean id="timestamp" class="org.library.shared.TimestampImplementation" destroy-method="synchronize" depends-on="dw">
        <argument index="0" ref="dw" />
        <argument index="2" value="Orders" />
    </bean>

    <bean id="shutdownStrategy" class="org.apache.camel.impl.DefaultShutdownStrategy">
        <property name="timeout" value="1" />
    </bean>

    <camelContext id="camel-context" xmlns="http://camel.apache.org/schema/blueprint" depends-on="timestamp">   
        <packageScan>
            <package>org.xyz.orders.routing</package>
        </packageScan>
    </camelContext>
</blueprint>

另一个捆绑包只是几个类(一个共享库)的集合,我将其作为maven依赖项包括在内。该捆绑包没有蓝图文件。

由于组织问题,我在某些地方使用了虚拟名称。

0 个答案:

没有答案