【问题标题】:Modify configuration properties of ejb-jar.xml during deployment in GlassFish 4.0在 GlassFish 4.0 中部署期间修改 ejb-jar.xml 的配置属性
【发布时间】:2016-05-05 23:22:53
【问题描述】:

我有一个 ejb-jar.xml,其中包含我的一个 MDB 的配置信息。 里面有一个配置:

 <activation-config-property>
        <activation-config-property-name>addressList</activation-config-property-name>
        <activation-config-property-value>mq://test.server.uk:7676</activation-config-property-value>
</activation-config-property>

当我的项目被构建和打包然后分发给用户时,我需要能够确保这个值可以被修改,因为用户有不同的服务器地址。

目前我可以选择在属性文件中设置地址。无论如何,我可以在 glassfish 4.0 上部署期间使用属性值修改此 xml 吗?

如果不是每次有人想要应用程序并重新构建它时,我是否必须设置该值?

我愿意将配置放在我只需要动态的地方,以便用户可以在属性文件中设置服务器地址。

【问题讨论】:

标签: jakarta-ee glassfish ejb ejb-jar.xml


【解决方案1】:

您可以尝试的一件事是使用@AroundConstruct 拦截器在运行时设置MDB 上的值。值得注意的是,虽然可以在您的 ejb-jar.xml 中使用占位符,但它主要依赖于容器,并且明显缺乏有关如何为 Glassfish 完成它的阅读材料,这应该是您担心的根源。让我们试试这个:

  1. 在你的 MDB 上定义一个拦截器:

    @MessageDriven
    @Interceptors(AddressListInterceptor.class)
    public class YourMDB
    
  2. 定义你的拦截器

    public class AddressListInterceptor {
    
        @AroundConstruct
        private void begin(InvocationContext iCtxt) {
    
            /**load your property prior to this point */
    
    
            ActivationConfigProperty addressList = new ActivationConfigProperty{
    
                                                      public String propertyName(){
                                                        return "addressList";
                                                      }
                                                      public String propertyValue(){
                                                        return theAddressList;
                                                       }
    
                                     public Class<? extends Annotation> annotationType(){
                                          return ActivationConfigProperty.class;
                                      }                 
    
                                                   };
    
              try {
                    /**get the annotations, with the intention of adding yours (addressList) to the array using the method demonstrated in 
                      http://stackoverflow.com/a/14276270/1530938  */
                   Annotations[] annotations = iCtxt.getClass().getAnnotations(); 
    
                    iCtxt.proceed(); //this will allow processing to continue as normal
               } catch (Exception ex) {
    
               } 
       }
    

除了不幸需要自己扫描和修改注解之外,这种方法给您带来的好处是,您可以在 bean 实例化之前进入 MDB 的生命周期并修改注解的值。到 bean 投入使用时,它将采用您设置的值,并且一切都应该井井有条

【讨论】:

  • 感谢您的回答。我不确定您设置 MDB 的示例在哪里适合实际的 MDB?你能提供一个关于通过注解注入的小例子吗?
  • 看来我说得太早了。出于某种原因,我假设您正在编写消息生产者,而不是消费者。除了摆弄注释之外,真的没有任何办法。请参阅我的更新@Softey。附言请务必在此处确认您能够在此处获得此解决方案为您工作;如果没有,我需要删除答案,以免误导登陆此页面的其他人
  • 我不明白这是如何工作的@kolossus。您如何从无状态 bean (MDB) 中设置拦截器,该 bean 仅在收到来自通过 addressList 属性连接的生产者的消息后才启动?我会理解这适用于 Singleton 但不适用于无状态 MDB
  • @Softey,@AroundConstruct 是一个生命周期拦截器,它会在 MDB 实例化之前由容器触发,更不用说投入使用了。这就是这个拦截器的工作原理。在实例化 MDB 实例之前(与任何其他 EJB 一样),您设置的所有配置都不重要。见the lifecycle of an MDB。容器等到消息到达才实例化MDB;它们像任何其他 EJB 一样事先被汇集在一起​​。
  • 我已按照您的建议将其放入我的代码中,但从未启动拦截器。我认为它们仅在调用类中的任何方法时才启动。我认为最高级别的拦截器是一级拦截器。
【解决方案2】:

我发现了一种在 glassfish 4.0 中修改地址列表的简单方法。此解决方案允许您仍然使用 @ActivationConfigProperty 的其余部分。对我来说,当用户使用安装脚本进行安装时,我可以运行以下命令:

asadmin server.jms-service.type = REMOTE

asadmin set configs.config.server-config.jms-service.jms-host.default_JMS_host.host=
"testserver.test.te.uk" 

asadmin restart-domain

您将默认 JMS 主机设置为键入 REMOTE,然后告诉代理使用默认 JMS 主机中定义的地址。

然后您使用 asadmin set 命令设置主机地址。

完成后,您需要重新启动 glassfish。

这显然取决于 glassfish 容器,但这就是我所需要的。

【讨论】:

  • 可能应该提到您不介意修改客户端的应用服务器配置。您的问题就像您只是在寻找基于代码的解决方案一样
猜你喜欢
  • 1970-01-01
  • 2015-10-12
  • 1970-01-01
  • 2014-01-28
  • 1970-01-01
  • 1970-01-01
  • 2011-08-17
  • 2014-03-16
  • 2018-02-28
相关资源
最近更新 更多