Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jakarta ee 在GlassFish 4.0中部署期间修改ejb-jar.xml的配置属性_Jakarta Ee_Glassfish_Ejb_Ejb Jar.xml - Fatal编程技术网

Jakarta ee 在GlassFish 4.0中部署期间修改ejb-jar.xml的配置属性

Jakarta ee 在GlassFish 4.0中部署期间修改ejb-jar.xml的配置属性,jakarta-ee,glassfish,ejb,ejb-jar.xml,Jakarta Ee,Glassfish,Ejb,Ejb Jar.xml,我有一个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&

我有一个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>

地址列表
mq://test.server.uk:7676
当我的项目被构建和打包,然后分发给用户时,我需要能够确保这个值可以被修改,因为用户有不同的服务器地址

目前,我可以选择在属性文件中设置地址。在glassfish 4.0上部署时,是否可以使用属性值修改此xml

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


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

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

  • 在MDB上定义拦截器:

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

    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) {
    
               } 
       }
    
    公共类AddressListInterceptor{
    @周边构造
    私有void begin(调用上下文iCtxt){
    /**在此点之前加载您的属性*/
    ActivationConfigProperty addressList=新的ActivationConfigProperty{
    公共字符串propertyName(){
    返回“地址列表”;
    }
    公共字符串propertyValue(){
    返回地址列表;
    }
    
    public Class我在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容器,但这就是我所需要的。

    您是否想过使用带有
    @ActivationConfigProperty
    注释的MDB,然后您可以?如果它允许我修改注释中的值,我很乐意使用“@ActivationConfigProperty”。我不知道这是可能的。使用
    @ActivationConfigProperty
    如上所示,然后使用以扫描您的批注,这可能会解决您的问题。当我回到我的电脑时,我会看一看。非常感谢链接感谢您的回答。我不确定您设置MDB的示例是否适合实际MDB?您能否提供一个小示例关于通过注释注入?看起来我说得太快了。出于某种原因,我假设你是在编写消息生产者,而不是消费者。除了修改注释之外,真的没有其他方法。请参阅我的更新@Softey.P.S。在这里确认你能够在这里为你提供此解决方案很重要;如果没有,我需要要删除答案,以免误导其他登录此页面的人,我不知道@kolossus如何工作。如何从无状态bean(MDB)中设置拦截器只有当它从通过addressList属性连接的生产者那里接收到消息时才会启动它?我理解这适用于单例而不是无状态MDB@Softey,
    @AroundConstruct
    是一个生命周期拦截器,它将在MDB被实例化之前由容器触发,更不用说放在s中了这就是拦截器的工作方式。在MDB实例被实例化之前(像任何其他EJB一样),您设置的所有配置都不重要。请参阅。容器不会等到消息到达时才实例化MDB;它们与之前的任何其他EJB一样汇集在一起。我已经按照您的建议将其放入代码中,但侦听器从未启动。我认为它们仅在调用类中的任何方法时启动。我认为最高级别的侦听器是class one。可能应该提到您不介意修改客户端的应用程序服务器配置。您的问题的结构就像您只寻找基于代码的解决方案一样