Extend Kie-server in CDI environment - maven

I want to extend Kie-server in a CDI environment (Wildfly 19).
I'm following official doc: https://docs.jboss.org/jbpm/release/7.45.0.Final/jbpm-docs/html_single/#_cdi
Currently, I have a jar file containing CDI environment producer class and some CDI beans for initialization. I put this jar inside kie-server\WEB-INF\lib manually.
Is there a way to build a war artifact using maven which extends kie-server? For example an archetype to use where I can package my jar without manual patch of the kie-server war?
Best regards,

Just in case someone has the same need.
I tried at the beginning jbpm-services-cdi with kie-server war but some services like deploymentService are present twice (CDI bean and kie-server deployment service singleton) which causes problems.
I ended up using kie-server services from ServiceRegistry.
Please note that ExecutorService is registered in ServiceRegistry only after containers are deployed. There is a system property to trigger containers synchronous deployment: org.kie.server. sync.deploy.
Thanks,

Related

Dynamic loading of spring bean from jar along with dependent beans

I am running a spring application.
My requirement is user will be placing a plugin jar file at run time at designated lib folder location.
This plugin jar file will have spring application context file as well. I want to load this jar, means all the classes - spring beans
and all its dependent beans/components(this is important), from this jar file at run time.
I do not want to create new/child application context and want to use the existing spring bean context loaded at application start up.
I reffered to few other similar threads/questions on SO and could resolve the issue of dynamically loading of spring beans.
But i am not able to resolve issue of loading all the dependent beans for the spring beans.
Could you please provide any pointers/hints to dynamically load all the dependent beans of spring bean(which is also)loaded at run time?
Thanks in advance,
Picku
If you want to be able to load the plugin after startup you are not going to get away with not creating another application context as a child.
I'd suggest you do exactly this and then create some hooks in parent context whereby your plugin will integrate itself.
The alternative is to include that plugin.jar in the main classpath and then restart the application to include the plugin.

Least intrusive way to add Spring task scheduling to a non-Spring web project?

How should I add Spring task scheduling to a non-Spring war project? Currently, the web project only has a maven dependency to org.mitre.dsmiley.httpproxy:smiley-http-proxy-servlet. It's just a simple proxy servlet now. SpringBoot is probably not a good fit for this problem as I want to keep the war artifact the deployment model. I do not want to run it embedded in a stand-alone container. I'm looking for the least intrusive approach. Any suggestions?
If you are planning to deploy the app to a server that supports Servlet 3.0, then it is actually quite easy to use Spring Boot in a traditional, war deployment model.
What you need to do is:
Extend SpringBootServletInitializer, which in turn implements WebApplicationInitializer and can configure the servlet context.
Specify the war packaging in your pom.xml (which you probably already have)
Set the provided scope for the spring-boot-starter-tomcat dependency, so that an embedded server is not created when your application runs.
See the reference guide for more details.

Classloader issue on Mule server

I am running my application on mule server. Mule server has there own sets of jars and my application that is running on mule server also has few jars. While working on Spring batch I found that JettisonMappedXmlDriver class exists in my application xstream jar as well as mule server jar as well. This class internally refer MappedXMLOutputFactory class that is in jettision jar which is also in my application but some how I am getting classnotfound error for MappedXMLOutputFactory class. This looks like class-loader issue.
If I add jettision jar in mule server then everything work fine but, I can't add this jar on my production environment. Can some body tell me how do I force to load the class from my application jettision jar file. It looks weird to me as classloader should have load MappedXMLOutputFactory class from jettision jar that is in my application folder like it is doing for other classes.
Please let me know if anybody found such issue.
The Mule application classloader is configurable: http://www.mulesoft.org/documentation/display/current/Classloader+Control+in+Mule
So just configure your application's classloader to first look at the JARs it embeds in /lib before deferring to the Mule System classloader.
You will encounter this issue if you have multiple versions of the same class in differnet jars, albeit with different method signatures. The ClassNotFound Error is usually not the only exception that occurs, you will often see another one before that, typically a "NoSuchMethodException" which forces class loader to unload the offending class.
I would suggest using maven or gradle to assemble your application and then use the dependency:tree target to query version conflicts.

Run Spring Jobs as jar module packaged in ear and deployed in Jboss

I am trying to run an ear configured with a jar module which has spring bean configuration for scheduled jobs.
Is this possible?
I am trying to eliminate need for a web app to include the scheduler bean context xml.
Have you looked at CommandLineJobRunner? Is this what you want?
You might also have luck with the Spring Batch.

EJB3 initialization code

I've searched this for a while now, but can't seem to find an answer to this. How can I execute some code in when deploying an EJB3 jar-file to a JBoss server? For example, I need to run some sql migration scripts before the beans are ready to be used.
If you can't use EJB 3.1 (with #Singleton #Startup), I would recommend packaging your EJB module in an EAR with a WAR. Add a ServletContextListener to the WAR, and take your action in the contextInitialized method.
You can create a JBoss MBean service with a Listener that can perform any initialization (SQL scripts run in your case) after JBoss is fully started and before any EJB is used.
I have created such a service and we run it on JBoss 4.2.3.GA, so, you do not need to migrate to JBoss 7.

Resources