Expand my Community achievements bar.

SOLVED

OSGI Configuration Values are not getting updated

Avatar

Level 4

Hi, 

We are facing an issue where OSGI configuration values are not getting updated when we check in the /system/console/ConfigMgr

For Ex:
If we make changes in the config file and deploy the same it reflects correctly in crx/de But not in /system/console/ConfigMgr.
We still see old value and have to manually make the changes. 
We have taken care of run modes as well so that they should reflect the respective values. 

mrudul_1-1652303207184.png

mrudul_2-1652303448521.png

mrudul_3-1652304130250.png

 

Thanks,

Mrudul

 

 

1 Accepted Solution

Avatar

Correct answer by
Employee Advisor

Here is my sample OSGi configuration associated with Scheduler -

package com.aem.demo.core.configurations;

import org.osgi.service.metatype.annotations.AttributeDefinition;
import org.osgi.service.metatype.annotations.AttributeType;
import org.osgi.service.metatype.annotations.ObjectClassDefinition;

@ObjectClassDefinition(name = "Resource Expiration scheduler configuration", description = "Resource Expiration scheduler configuration")
public @interface ExpirationSchedulerConfiguration {

	/**
	 * This method will return the name of the Scheduler
	 * 
	 * @return {@link String}
	 */
	@AttributeDefinition(name = "Scheduler name", description = "Name of the scheduler", type = AttributeType.STRING)
	public String schdulerName() default "Expiration scheduler configuration";

	/**
	 * This method will set flag to enable the scheduler
	 * 
	 * @return {@link Boolean}
	 */

	@AttributeDefinition(name = "Enabled", description = "True, if scheduler service is enabled", type = AttributeType.BOOLEAN)
	public boolean enabled() default false;

	/**
	 * This method returns the Cron expression which will decide how the scheduler
	 * will run
	 * 
	 * @return {@link String}
	 */

	@AttributeDefinition(name = "Cron Expression", description = "Cron expression used by the scheduler", type = AttributeType.STRING)
	public String cronExpression() default "0 * * * * ?";

	/**
	 * This method returns the Asset Path
	 * 
	 * 
	 * @return {@link String}
	 */

	@AttributeDefinition(name = "Asset Path", description = "Asset Path", type = AttributeType.STRING)
	public String assetPath() default "/content/dam";

	@AttributeDefinition(name = "Page Taxonomy", description = "Page Taxonomy", type = AttributeType.STRING)
	public String contentPath() default "/content/we-retail";

}

This is Scheduler where I am reading the above OSGi configuration -

package com.aem.demo.core.configurations;

import org.osgi.service.metatype.annotations.AttributeDefinition;
import org.osgi.service.metatype.annotations.AttributeType;
import org.osgi.service.metatype.annotations.ObjectClassDefinition;

@ObjectClassDefinition(name = "Resource Expiration scheduler configuration", description = "Resource Expiration scheduler configuration")
public @interface ExpirationSchedulerConfiguration {

	/**
	 * This method will return the name of the Scheduler
	 * 
	 * @return {@link String}
	 */
	@AttributeDefinition(name = "Scheduler name", description = "Name of the scheduler", type = AttributeType.STRING)
	public String schdulerName() default "Expiration scheduler configuration";

	/**
	 * This method will set flag to enable the scheduler
	 * 
	 * @return {@link Boolean}
	 */

	@AttributeDefinition(name = "Enabled", description = "True, if scheduler service is enabled", type = AttributeType.BOOLEAN)
	public boolean enabled() default false;

	/**
	 * This method returns the Cron expression which will decide how the scheduler
	 * will run
	 * 
	 * @return {@link String}
	 */

	@AttributeDefinition(name = "Cron Expression", description = "Cron expression used by the scheduler", type = AttributeType.STRING)
	public String cronExpression() default "0 * * * * ?";

	/**
	 * This method returns the Asset Path
	 * 
	 * 
	 * @return {@link String}
	 */

	@AttributeDefinition(name = "Asset Path", description = "Asset Path", type = AttributeType.STRING)
	public String assetPath() default "/content/dam";

	@AttributeDefinition(name = "Page Taxonomy", description = "Page Taxonomy", type = AttributeType.STRING)
	public String contentPath() default "/content/we-retail";

}

As I am reading OSGi configuration in above scheduler so, PID is pointing to Scheduler Class itself as shown below -

 

DEBAL_DAS_0-1652536777251.png

I have deployed everything on local AEM author instance and every time I am modifying contentpath in CRXDE here /apps/demo/osgiconfig/config.author/com.aem.demo.core.schedulers.ResourceExpirationScheduler.config and change is getting reflected in config manager /system/console/configMgr.

 

My sample OSGi configurations is getting stored in file system under following path

C:\Users\debal\AEM-instances\demo-author\crx-quickstart\launchpad\config\com\aem\demo\core\schedulers here -

 

DEBAL_DAS_1-1652538144327.png

If we take close look this path is nothing but 

<AEM-instance-installed-directory>/crx-quickstart/launchpad/config/PID

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

View solution in original post

12 Replies

Avatar

Community Advisor

Hi,

 

Are you overwriting the out of the box configuration or it is custom config? Try adding some unique value at the end of the config file, if it is out of the box config you are updating

 

Ex: org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl-<uniqueid>.

Avatar

Employee Advisor

We had similar issue in our project. If you are having OSGi configuration structure like the below one -

 

DEBAL_DAS_0-1652329467848.png

Then please check config file[PID] under relevant config folder like config.author or config.publish or config.stage which is aligned with the run mode of that AEM instance and make necessary changes in that config file[PID].

 

Avatar

Level 4

Hi @DEBAL_DAS 
Yes, config files are having a correct naming convention and are placed in respective run modes. 
One thing we noticed here is PID is not bound to the class name but rather shows Configuration Name. 

mrudul_0-1652374523351.png

 




Avatar

Employee Advisor

Let's assume you are on prod author instance and this OSGi configuration will be having prod environment specific value.

 

Now tell me location of config file in CRXDE (full path), where you have updated the value.

Avatar

Level 4

@DEBAL_DAS 

This is the path
/apps/my-proj/config.prod.author/com.proinc.aemproinc.core.services.impl.SomeGeneratorServiceImpl.config

Avatar

Employee Advisor

Now do one thing first, search with com.proinc.aemproinc.core.services.impl.SomeGeneratorServiceImpl.config in /system/console/configMgr  and delete the entry [clicking Delete icon as shown below]

 

DEBAL_DAS_0-1652455714862.png

 

 

Then update /apps/my-proj/config.prod.author/com.proinc.aemproinc.core.services.impl.SomeGeneratorServiceImpl.config in CRXDE and then check whether updated value is getting reflected on /system/console/ConfigMgr.

 

First execute these steps on your local AEM author with prod run mode and let me know the result.

Avatar

Level 4

@DEBAL_DAS 

Sorry it didnt work and we have same issue.  
We deleted the config and made some small update in the config file in crx. and observed config got recreated but values are empty and still  PID is not linked to config class.

Avatar

Correct answer by
Employee Advisor

Here is my sample OSGi configuration associated with Scheduler -

package com.aem.demo.core.configurations;

import org.osgi.service.metatype.annotations.AttributeDefinition;
import org.osgi.service.metatype.annotations.AttributeType;
import org.osgi.service.metatype.annotations.ObjectClassDefinition;

@ObjectClassDefinition(name = "Resource Expiration scheduler configuration", description = "Resource Expiration scheduler configuration")
public @interface ExpirationSchedulerConfiguration {

	/**
	 * This method will return the name of the Scheduler
	 * 
	 * @return {@link String}
	 */
	@AttributeDefinition(name = "Scheduler name", description = "Name of the scheduler", type = AttributeType.STRING)
	public String schdulerName() default "Expiration scheduler configuration";

	/**
	 * This method will set flag to enable the scheduler
	 * 
	 * @return {@link Boolean}
	 */

	@AttributeDefinition(name = "Enabled", description = "True, if scheduler service is enabled", type = AttributeType.BOOLEAN)
	public boolean enabled() default false;

	/**
	 * This method returns the Cron expression which will decide how the scheduler
	 * will run
	 * 
	 * @return {@link String}
	 */

	@AttributeDefinition(name = "Cron Expression", description = "Cron expression used by the scheduler", type = AttributeType.STRING)
	public String cronExpression() default "0 * * * * ?";

	/**
	 * This method returns the Asset Path
	 * 
	 * 
	 * @return {@link String}
	 */

	@AttributeDefinition(name = "Asset Path", description = "Asset Path", type = AttributeType.STRING)
	public String assetPath() default "/content/dam";

	@AttributeDefinition(name = "Page Taxonomy", description = "Page Taxonomy", type = AttributeType.STRING)
	public String contentPath() default "/content/we-retail";

}

This is Scheduler where I am reading the above OSGi configuration -

package com.aem.demo.core.configurations;

import org.osgi.service.metatype.annotations.AttributeDefinition;
import org.osgi.service.metatype.annotations.AttributeType;
import org.osgi.service.metatype.annotations.ObjectClassDefinition;

@ObjectClassDefinition(name = "Resource Expiration scheduler configuration", description = "Resource Expiration scheduler configuration")
public @interface ExpirationSchedulerConfiguration {

	/**
	 * This method will return the name of the Scheduler
	 * 
	 * @return {@link String}
	 */
	@AttributeDefinition(name = "Scheduler name", description = "Name of the scheduler", type = AttributeType.STRING)
	public String schdulerName() default "Expiration scheduler configuration";

	/**
	 * This method will set flag to enable the scheduler
	 * 
	 * @return {@link Boolean}
	 */

	@AttributeDefinition(name = "Enabled", description = "True, if scheduler service is enabled", type = AttributeType.BOOLEAN)
	public boolean enabled() default false;

	/**
	 * This method returns the Cron expression which will decide how the scheduler
	 * will run
	 * 
	 * @return {@link String}
	 */

	@AttributeDefinition(name = "Cron Expression", description = "Cron expression used by the scheduler", type = AttributeType.STRING)
	public String cronExpression() default "0 * * * * ?";

	/**
	 * This method returns the Asset Path
	 * 
	 * 
	 * @return {@link String}
	 */

	@AttributeDefinition(name = "Asset Path", description = "Asset Path", type = AttributeType.STRING)
	public String assetPath() default "/content/dam";

	@AttributeDefinition(name = "Page Taxonomy", description = "Page Taxonomy", type = AttributeType.STRING)
	public String contentPath() default "/content/we-retail";

}

As I am reading OSGi configuration in above scheduler so, PID is pointing to Scheduler Class itself as shown below -

 

DEBAL_DAS_0-1652536777251.png

I have deployed everything on local AEM author instance and every time I am modifying contentpath in CRXDE here /apps/demo/osgiconfig/config.author/com.aem.demo.core.schedulers.ResourceExpirationScheduler.config and change is getting reflected in config manager /system/console/configMgr.

 

My sample OSGi configurations is getting stored in file system under following path

C:\Users\debal\AEM-instances\demo-author\crx-quickstart\launchpad\config\com\aem\demo\core\schedulers here -

 

DEBAL_DAS_1-1652538144327.png

If we take close look this path is nothing but 

<AEM-instance-installed-directory>/crx-quickstart/launchpad/config/PID

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Avatar

Level 4

Are you creating your configurations as "sling:OsgiConfig" node . I am not seeing anything in crxde like below 

<?xml version="1.0" encoding="UTF-8"?>
<jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0"
jcr:primaryType="sling:OsgiConfig"

 

Check this configuration for reference /apps/weretail/config/org.apache.sling.serviceusermapping.impl.ServiceUserMapperImpl.amended-we-retail

Avatar

Level 10

@mrudul 

If you are using OSGi annotation,

Cross check the @Designate annotation if the OCD is correctly associated to an OSGi component. 

If it is a factory config,  @Designate should have additional property named factory set to true.