[jboss-jira] [JBoss JIRA] (DROOLS-1354) Drools PermGen OOM When create kiebulider several times

Shukang Guo (JIRA) issues at jboss.org
Fri Nov 4 05:40:00 EDT 2016


     [ https://issues.jboss.org/browse/DROOLS-1354?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Shukang Guo updated DROOLS-1354:
--------------------------------
    Description: 
When i need updating the rule , first i will delete it from kieFileSystem , then add it .Second i will create a new KieBuilder and buildAll().But after several time i have done , it would be gone by PermGen OOM.
{code:java}
	@Autowired
	private RuleService ruleService;

	private KieServices ks = KieServices.Factory.get();
	private KieFileSystem kFileSystem = ks.newKieFileSystem();

	private KieContainer kContainer;
	private KieBase kieBase;
	private KieBuilder kbuilder;
	private String defaultPath;

	/*
	 * (non-Javadoc)
	 */
	@Override
	@PostConstruct
	public void init() {
		List<Rule> rules = new ArrayList<>();
		rules.add(ruleService.selectById(15));
		// List<Rule> rules = ruleService.selectAll(0, 0);
		String[] paths = new String[rules.size()];
		for (int i = 0; i < paths.length; i++) {
			paths[i] = rules.get(i).getPath();
		}
		init(paths);

	}

	public void init(String[] paths) {
		boolean isSetDefaultPath = false;
		for (String path : paths) {
			if (isSetDefaultPath)
				kFileSystem
						.write(ks.getResources().newClassPathResource(path));
			else {
				Resource resource = ks.getResources().newClassPathResource(
						path);
				kFileSystem.write(resource);
				defaultPath = resource.getResourceType().getDefaultPath() + "/";
				isSetDefaultPath = true;
			}

		}
		kbuilder = ks.newKieBuilder(kFileSystem);
		kbuilder.buildAll();
		kContainer = ks.newKieContainer(ks.getRepository()
				.getDefaultReleaseId());
		kieBase = kContainer.getKieBase();

	}

	/*
	 * (non-Javadoc)
	 */
	public void refresh() {

		kbuilder = ks.newKieBuilder(kFileSystem);
		kbuilder.buildAll();
		kContainer.updateToVersion(ks.getRepository().getDefaultReleaseId());

	}

	/*
	 * (non-Javadoc)
	 */
	@Override
	public KieSession getKieSession() {
		return kieBase.newKieSession();
	}

	@Override
	public void add(String path) {
		kFileSystem.write(ks.getResources().newClassPathResource(path));
		refresh();
	}

	@Override
	public void delete(String path) {
		kFileSystem.delete(defaultPath + path);
		refresh();
	}

	@Override
	public void update(String path) {
		kFileSystem.delete(defaultPath + path);
		kFileSystem.write(ks.getResources().newClassPathResource(path));
		refresh();
	}

{code}




  was:
When i need updating the rule , first i will delete it from kieFileSystem , then add it .Second i will create a new KieBuilder and buildAll().But after several time i have done , it would be gone by PermGen OOM.
{code:java}
	@Autowired
	private RuleService ruleService;

	private KieServices ks = KieServices.Factory.get();
	private KieFileSystem kFileSystem = ks.newKieFileSystem();

	private KieContainer kContainer;
	private KieBase kieBase;
	private KieBuilder kbuilder;
	private String defaultPath;

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.huawei.datalifecycle.rules.RunRuless#init(java.lang.String[])
	 */
	@Override
	@PostConstruct
	public void init() {
		List<Rule> rules = new ArrayList<>();
		rules.add(ruleService.selectById(15));
		// List<Rule> rules = ruleService.selectAll(0, 0);
		String[] paths = new String[rules.size()];
		for (int i = 0; i < paths.length; i++) {
			paths[i] = rules.get(i).getPath();
		}
		init(paths);

	}

	public void init(String[] paths) {
		boolean isSetDefaultPath = false;
		for (String path : paths) {
			if (isSetDefaultPath)
				kFileSystem
						.write(ks.getResources().newClassPathResource(path));
			else {
				Resource resource = ks.getResources().newClassPathResource(
						path);
				kFileSystem.write(resource);
				defaultPath = resource.getResourceType().getDefaultPath() + "/";
				isSetDefaultPath = true;
			}

		}
		kbuilder = ks.newKieBuilder(kFileSystem);
		kbuilder.buildAll();
		kContainer = ks.newKieContainer(ks.getRepository()
				.getDefaultReleaseId());
		kieBase = kContainer.getKieBase();

	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.huawei.datalifecycle.rules.RunRuless#refresh(java.lang.String)
	 */
	public void refresh() {

		kbuilder = ks.newKieBuilder(kFileSystem);
		kbuilder.buildAll();
		kContainer.updateToVersion(ks.getRepository().getDefaultReleaseId());

	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.huawei.datalifecycle.rules.RunRuless#getKieSession()
	 */
	@Override
	public KieSession getKieSession() {
		return kieBase.newKieSession();
	}

	@Override
	public void add(String path) {
		kFileSystem.write(ks.getResources().newClassPathResource(path));
		refresh();
	}

	@Override
	public void delete(String path) {
		kFileSystem.delete(defaultPath + path);
		refresh();
	}

	@Override
	public void update(String path) {
		kFileSystem.delete(defaultPath + path);
		kFileSystem.write(ks.getResources().newClassPathResource(path));
		refresh();
	}

{code}






> Drools PermGen OOM When create kiebulider several times
> -------------------------------------------------------
>
>                 Key: DROOLS-1354
>                 URL: https://issues.jboss.org/browse/DROOLS-1354
>             Project: Drools
>          Issue Type: Bug
>          Components: core engine
>    Affects Versions: 6.4.0.Final
>         Environment: Windows7 Tomcat7 JDK1.7 
>            Reporter: Shukang Guo
>            Assignee: Mario Fusco
>
> When i need updating the rule , first i will delete it from kieFileSystem , then add it .Second i will create a new KieBuilder and buildAll().But after several time i have done , it would be gone by PermGen OOM.
> {code:java}
> 	@Autowired
> 	private RuleService ruleService;
> 	private KieServices ks = KieServices.Factory.get();
> 	private KieFileSystem kFileSystem = ks.newKieFileSystem();
> 	private KieContainer kContainer;
> 	private KieBase kieBase;
> 	private KieBuilder kbuilder;
> 	private String defaultPath;
> 	/*
> 	 * (non-Javadoc)
> 	 */
> 	@Override
> 	@PostConstruct
> 	public void init() {
> 		List<Rule> rules = new ArrayList<>();
> 		rules.add(ruleService.selectById(15));
> 		// List<Rule> rules = ruleService.selectAll(0, 0);
> 		String[] paths = new String[rules.size()];
> 		for (int i = 0; i < paths.length; i++) {
> 			paths[i] = rules.get(i).getPath();
> 		}
> 		init(paths);
> 	}
> 	public void init(String[] paths) {
> 		boolean isSetDefaultPath = false;
> 		for (String path : paths) {
> 			if (isSetDefaultPath)
> 				kFileSystem
> 						.write(ks.getResources().newClassPathResource(path));
> 			else {
> 				Resource resource = ks.getResources().newClassPathResource(
> 						path);
> 				kFileSystem.write(resource);
> 				defaultPath = resource.getResourceType().getDefaultPath() + "/";
> 				isSetDefaultPath = true;
> 			}
> 		}
> 		kbuilder = ks.newKieBuilder(kFileSystem);
> 		kbuilder.buildAll();
> 		kContainer = ks.newKieContainer(ks.getRepository()
> 				.getDefaultReleaseId());
> 		kieBase = kContainer.getKieBase();
> 	}
> 	/*
> 	 * (non-Javadoc)
> 	 */
> 	public void refresh() {
> 		kbuilder = ks.newKieBuilder(kFileSystem);
> 		kbuilder.buildAll();
> 		kContainer.updateToVersion(ks.getRepository().getDefaultReleaseId());
> 	}
> 	/*
> 	 * (non-Javadoc)
> 	 */
> 	@Override
> 	public KieSession getKieSession() {
> 		return kieBase.newKieSession();
> 	}
> 	@Override
> 	public void add(String path) {
> 		kFileSystem.write(ks.getResources().newClassPathResource(path));
> 		refresh();
> 	}
> 	@Override
> 	public void delete(String path) {
> 		kFileSystem.delete(defaultPath + path);
> 		refresh();
> 	}
> 	@Override
> 	public void update(String path) {
> 		kFileSystem.delete(defaultPath + path);
> 		kFileSystem.write(ks.getResources().newClassPathResource(path));
> 		refresh();
> 	}
> {code}



--
This message was sent by Atlassian JIRA
(v7.2.3#72005)


More information about the jboss-jira mailing list