大家好,以编程方式访问am属性

时间:2016-10-25 07:35:18

标签: java oracle oracle-adf

我想在adf页面点击按钮时从托管bean设置应用程序模块配置属性(jbo.ampool.timetolive)值,我尝试使用以下代码,但未设置属性值。

public Object getInfo(String string, Object environment) {
    Hashtable envHashtable = (Hashtable)environment;      
    envHashtable.put(ApplicationModule.PROPERTY_LABEL.equals("jbo.ampool.timetolive"),"7200000");
    return null;
}

请帮助我解决这个问题

1 个答案:

答案 0 :(得分:0)

好的,这是棘手的事情,但这是我会尝试的:

在您的配置(bc4j.xcfg文件)中,将jbo.ampool.sessioncookiefactoryclass设置为指向您将提供的课程(让我们称之为MySessionCookieFactory

<BC4JConfig ...>
   <AppModuleConfigBag ...>
      <AppModuleConfig ...>
         <AM-Pooling jbo.ampool.sessioncookiefactoryclass="mypackage.MySessionCookieFactory"/>

该类MySessionCookieFactory必须扩展oracle.jbo.common.ampool.SessionCookieFactory并覆盖createSessionCookie才能传回自定义的EnvInfoProvider。

public SessionCookie createSessionCookie(String applicationId, String sessionId, ApplicationPool pool,
                                         Properties properties) {
    final SessionCookie cookie = mFactory.createSessionCookie(applicationId, sessionId, pool, properties);
    final EnvInfoProvider provider = new MyEnvInfoProvider();
    cookie.setEnvInfoProvider(provider);
    return cookie;
}

MyEnvInfoProvider必须扩展oracle.jbo.common.ampool.EnvInfoProvider并覆盖getInfo()以传回您想要的jbo.ampool.timetolive值的环境。

所以,在MyEnvInfoProvider ...

@Override
public Object getInfo(String infoType,
                       Object configurationEnvironmentObject) {
    // NOTE: Watch logging in this method.  It gets called for *every request* and it can really clutter up a log.
    // Cast the configuration environment passed in to it's correct type.  It's really lame that Oracle's signatures include Object types
    // instead of the correct classes or interfaces.
    final Hashtable<String, String> configurationEnvironmentHashtable =
                                     (Hashtable<String, String>) configurationEnvironmentObject;

//        if (EnvInfoProvider.INFO_TYPE_SESSION_ENVIRONMENT.equals(infoType)) {
        configurationEnvironmentHashtable.put(PropertyConstants.ENV_AMPOOL_TIME_TO_LIVE, (String) MyClass.getTTL());
//        }
    return configurationEnvironmentHashtable;
}

所以,如果你做了所有这些,你将控制jbo.ampool.timetoliveMyClass.getTTL()返回的任何内容。因此,您需要做的就是更新MyClass.getTTL()的变量,它将被用作jbo.ampool.timetolive

我已经完成了这种方法环境设置,但特别是jbo.ampool.timetolive没有,所以我无法保证这对您有用。

另外,为什么需要动态设置?为什么不在您的bc4j.xcfg文件中添加720000并完成它?