Jakarta ee 在GlassFish 4.0中部署期间修改ejb-jar.xml的配置属性
我有一个ejb-jar.xml,其中包含一个MDB的配置信息。 在中,有以下配置: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&
<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实现占位符的阅读材料,这应该是您担心的一个原因。让我们试试这个:
@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。可能应该提到您不介意修改客户端的应用程序服务器配置。您的问题的结构就像您只寻找基于代码的解决方案一样