RE: Data isolation between Karaf bundles/features: how to achieve?
Hi Christian, Thanks you very much for your response. I will look into DDD a bit, I also found the saga pattern for transactionality. Greetings, -- Jaap Van: Christian Schneider Verzonden: dinsdag 12 oktober 2021 11:03 Aan: user@karaf.apache.org Onderwerp: Re: Data isolation between Karaf bundles/features: how to achieve? I would solve this in a fashion that is independent of OSGi. Think in terms of bounded contexts in domain driven design terminology. In your case you have to decide if person and department belong to the same bounded context or not. If they belong to the same then share the db schema and also share a single transaction maybe even also bundle and persistence context. There is no need to fully shield them against each other. If they belong to different bounded contexts then separate them completely (different db schema, no shared transaction). In this case you can easily extract each bounded context as a microservice if needed but of course you loose quite a few nice features like XA transactions. Christian Am So., 10. Okt. 2021 um 20:38 Uhr schrieb jgfrm mailto:f...@gordijn.org> >: Suppose the following case: - there is a Person bundle, responsible of managing persons - there is a Department bundle, reponsible of managing departmens. - there is a constraint: A person always works for precisely one department; hence a person can not exist without the department s/he works for. Hi I am interested to understand if Isolation of data (between bundles) is possible in Karaf. Suppose the following case: - there is a Person bundle, responsible of managing persons - there is a Department bundle, responsible of managing departments. - there is a constraint: A person always works for precisely one department; hence a person can not exist without the department s/he works for. I have the following requirements: - The Person bundle can not use the data (departments) stored by the Department bundle (e.g. a table "Department") - The Department bundle can not use the data(persons) stored by the Person bundle (e.g. a table "Person") - If a department is deleted, all persons that work for that department would be deleted too (due to the formulated constraint). How to do this in Karaf/OSGI? My ideas: - each bundle (Department and Person) has an own persistence unit. The persistence unit refers to different databases with their own access control, or the different schemas in the same database with proper access control on the database level. Bundles can not see each other's persistence unit. Because these are effectively two separate databases, we can not use foreign keys to represent that an employee always works for precisely one department. Therefore: - there is a bundle that represents a transaction coordinator - the Person bundle tells the transaction coordinator that there is a constraint: namely that it want to informed if a person is deleted - in case a department is deleted the following happens: - the department bundle builds a XA transaction to delete the department - the department bundle informs the transaction coordinator that it created a transaction to delete the department, including the identifier of the department to be deleted - the transaction coordinator informs the person bundle that a department with a particular identifier is going to be deleted - the person bundle looks up all persons that work for the department, and creates a XA transaction to delete all these persons - the person bundle informs the transaction coordinator that it created a transaction to delete the persons, including a list with identifiers of the persons to be deleted - the transaction coordinator executes both transaction as one enclosing transaction using the 2-phase commit protocol. Questions: - is this a feasible scenario in Karaf? - if so, how should it be implemented? Specific tips? - are there any examples doing similar things? Best, -- Jaap -- -- Christian Schneider http://www.liquid-reality.de Computer Scientist http://www.adobe.com
RE: Data isolation between Karaf bundles/features: how to achieve?
Hi David, Thanks for your response. Of course, the scenario that is sketch is a styled example to clearly illustrate what I want to achieve. Also, at least to my current understanding, I do not propose 3 XA transaction managers but 2 XA resources and 1 transaction managers. I want build a plugin system (where a plugin could roughly correspond to a Karaf feature) in which the plugins are completely isolated meaning that they can not see each other, unless a specific service is exported. "Not seeing each other" also entails that they can not see each other data(bases). The reason for this is the plugins are provided by many different third parties who do not necessarily have to trust each other. Even more, the plugins are not aware of each other (loose coupling), except for the services that are exported. This means that the datasources have to be private to the plugin/feature. To try this out, I have developed two bundles, each with a XA resource. If however I do "service:list javax.sql.DataSource" it shows that each respective datasource is used by both plugins. This is not what I want. I have read quite a lot about XA/OSGI transactions the past few days but I can not find anything about: - branches of transactions as you mention - a good example with two or more datasources of different bundles, where updates are managed by a (global) transaction manager. I would be very happy if you/someone could point me to a few examples and/or documentation about this. With respect to idempotent messages: Just using that would not say anything about transactionality right? Thanks for your help again. Best, -- Jaap |-Oorspronkelijk bericht- |Van: David Jencks |Verzonden: zondag 10 oktober 2021 22:48 |Aan: user@karaf.apache.org |Onderwerp: Re: Data isolation between Karaf bundles/features: how to |achieve? | |As written, your proposal involves 3 XA transaction managers, two of which |are also packaged as XAResources. For this scenario, that’s ridiculous. | |If this is a toy problem for you to learn about XA, I think what you mean is: | |department bundle starts an XA transaction and removes the department in a |branch of this transaction | |something communicates the departmentId and transaction Xid to the person |bundle (normally the Xid is communicated via a thread local, i.e. it’s attached |to the current thread) | |Person bundle removes the relevant people in another branch of this same |transaction. | |Something (probably the department bundle) ends the XA transaction (commit |or rollback). | |I think there’s now an OSGI spec transaction coordinator that should help with |this, but I don’t remember the details or whether the implementation is in felix |or aries. | |If this is a real problem, it’s usually better to find a way to avoid XA, such as |sending idempotent messages. | |David Jencks | |> On Oct 10, 2021, at 11:37 AM, jgfrm wrote: |> |> Suppose the following case: |> |> - there is a Person bundle, responsible of managing persons |> - there is a Department bundle, reponsible of managing departmens. |> |> - there is a constraint: A person always works for precisely one |> department; hence a person can not exist without the department s/he |works for. |> |> Hi |> |> I am interested to understand if Isolation of data (between bundles) |> is possible in Karaf. |> |> Suppose the following case: |> - there is a Person bundle, responsible of managing persons |> - there is a Department bundle, responsible of managing departments. |> - there is a constraint: A person always works for precisely one |> department; hence a person can not exist without the department s/he |works for. |> |> I have the following requirements: |> - The Person bundle can not use the data (departments) stored by the |> Department bundle (e.g. a table "Department") |> - The Department bundle can not use the data(persons) stored by the |> Person bundle (e.g. a table "Person") |> - If a department is deleted, all persons that work for that |> department would be deleted too (due to the formulated constraint). |> |> How to do this in Karaf/OSGI? |> My ideas: |> - each bundle (Department and Person) has an own persistence unit. The |> persistence unit refers to different databases with their own access |> control, or the different schemas in the same database with proper |> access control on the database level. Bundles can not see each other's |> persistence unit. Because these are effectively two separate |> databases, we can not use foreign keys to represent that an employee |> always works for precisely one department. |> Therefore: |> - there is a bundle that represents a transaction coordinator |> - the Person bundle tells the transaction coordinator that there is a |> constraint: namely that it want to informed if a person is deleted |> -
Data isolation between Karaf bundles/features: how to achieve?
Suppose the following case: - there is a Person bundle, responsible of managing persons - there is a Department bundle, reponsible of managing departmens. - there is a constraint: A person always works for precisely one department; hence a person can not exist without the department s/he works for. Hi I am interested to understand if Isolation of data (between bundles) is possible in Karaf. Suppose the following case: - there is a Person bundle, responsible of managing persons - there is a Department bundle, responsible of managing departments. - there is a constraint: A person always works for precisely one department; hence a person can not exist without the department s/he works for. I have the following requirements: - The Person bundle can not use the data (departments) stored by the Department bundle (e.g. a table "Department") - The Department bundle can not use the data(persons) stored by the Person bundle (e.g. a table "Person") - If a department is deleted, all persons that work for that department would be deleted too (due to the formulated constraint). How to do this in Karaf/OSGI? My ideas: - each bundle (Department and Person) has an own persistence unit. The persistence unit refers to different databases with their own access control, or the different schemas in the same database with proper access control on the database level. Bundles can not see each other's persistence unit. Because these are effectively two separate databases, we can not use foreign keys to represent that an employee always works for precisely one department. Therefore: - there is a bundle that represents a transaction coordinator - the Person bundle tells the transaction coordinator that there is a constraint: namely that it want to informed if a person is deleted - in case a department is deleted the following happens: - the department bundle builds a XA transaction to delete the department - the department bundle informs the transaction coordinator that it created a transaction to delete the department, including the identifier of the department to be deleted - the transaction coordinator informs the person bundle that a department with a particular identifier is going to be deleted - the person bundle looks up all persons that work for the department, and creates a XA transaction to delete all these persons - the person bundle informs the transaction coordinator that it created a transaction to delete the persons, including a list with identifiers of the persons to be deleted - the transaction coordinator executes both transaction as one enclosing transaction using the 2-phase commit protocol. Questions: - is this a feasible scenario in Karaf? - if so, how should it be implemented? Specific tips? - are there any examples doing similar things? Best, -- Jaap
RE: Karaf 5
Hi JB, Thank you very much. I look forward to dig in to it. Best, -- Jaap |-Oorspronkelijk bericht- |Van: Jean-Baptiste Onofré |Verzonden: donderdag 30 september 2021 18:08 |Aan: user@karaf.apache.org |Onderwerp: Re: Karaf 5 | |Hi Jaap, | |let me rebase and polish a bit and I will push a first round (probably tomorrow |night or during the weekend). I will keep you posted. | |Regards |JB | |On 30/09/2021 14:40, jgfrm wrote: |> Hi JB, |> |> That sounds interesting! |> Is it possible to share what you developed? |> |> Best, |> |> -- Jaap |> |> |-Oorspronkelijk bericht- |> |Van: Jean-Baptiste Onofré |> |Verzonden: donderdag 30 september 2021 11:34 |> |Aan: user@karaf.apache.org |> |Onderwerp: Re: Karaf 5 |> | |> |Hi Jaap, |> | |> |so, yes, we are talking about the same thing ;) |> | |> |There are actually two parts: |> | |> |- registering Spring bean in the K5 service registry and use it in |> |another apps running in K5 |> |- registering "generic" services (like the json-config-loader, |> |extractor, etc) that provide shared resources (like HTTP handler) |> | |> |Regards |> |JB |> | |> |On 29/09/2021 23:30, jgfrm wrote: |> |> Perhaps. |> |> |> |> I want to be able to use a bean in other Spring module. |> |> |> |> What is also an issue it that two (or more) modules obviously |> |> result in two |> |sockets to be opened, in my case both 8400. |> |> A solution could be to open a different socket per module, e.g. |> |> negotiated |> |with a module for that purpose that also routes traffic for a |> |particular endpoint to the socket of the module handling that endpoint. |> |> |> |> In https://github.com/hank-cp/sbp (based on pf4j) they have a |> |> different |> |strategy; there they have one socket for REST calls, and specific |> |endpoints are forwarded to the appropriate plugin. |> |> |> |> Best, |> |> |> |> -- Jaap |> |> |> |> |> |> |-Oorspronkelijk bericht- |> |> |Van: JB Onofré |> |> |Verzonden: woensdag 29 september 2021 22:17 |> |> |Aan: user@karaf.apache.org |> |> |Onderwerp: Re: Karaf 5 |> |> | |> |> |I started a service bridge allowing to implicit push some spring |> |> |bean to the k5 registry and so that can be used from other modules |> |> |running in k5. It’s a local branch for now but I can push it on main. |> |> | |> |> |Is it what you are looking for ? |> |> | |> |> |Regards |> |> |JB |> |> | |> |> |> Le 29 sept. 2021 à 21:43, jgfrm a écrit : |> |> |> |> |> |> Is there already something working for exporting functionality |> |> |> of a Spring |> |> |modules to other modules? |> |> |> |> |> |> |-Oorspronkelijk bericht- |> |> |> |Van: Jean-Baptiste Onofré |> |> |> |Verzonden: woensdag 29 september 2021 17:26 |> |> |> |Aan: user@karaf.apache.org |> |> |> |Onderwerp: Re: Karaf 5 |> |> |> | |> |> |> |Thanks for the update. |> |> |> | |> |> |> |I'm happy to say you are the first one to "use/launch" Karaf 5 |> |> |> |;) |> |> |> | |> |> |> |About the TomcatURLStreamHandlerFactory is known "issue": |> |> |> | |> |> |> |https://github.com/jbonofre/karaf5/blob/main/services/spring-bo |> |> |> |ot- |> |> |> |application- |> |> |> |manager/src/main/java/org/apache/karaf/springboot/SpringBootApp |> |> |> |lic |> |> |> |ati |> |> |> |on |> |> |> |ManagerService.java#L110 |> |> |> | |> |> |> |I have to improve this ;) |> |> |> | |> |> |> |Regards |> |> |> |JB |> |> |> | |> |> |> |On 29/09/2021 17:19, jgfrm wrote: |> |> |> |> The following works: |> |> |> |> |> |> |> |> Karaf.json: |> |> |> |> |> |> |> |> { |> |> |> |>"applications": [ |> |> |> |> { |> |> |> |>"name": "e3web", |> |> |> |>"url": "file:///home/jaap/Karaf5Test/e3web-dev.jar", |> |> |> |>"type": "spring-boot", |> |> |> |>"properties": { |> |> |> |> "enableHttp": true, |> |> |> |> "enablePrometheus": true |> |> |> |>} |> |> |> |> } |> |> |> |>] |> |> |> |> } |> |> |> |> |> |> |> |> |> |> |> |> Add to Spring boot application: |> |> |> |> |> |> |>
RE: Karaf 5
Hi JB, That sounds interesting! Is it possible to share what you developed? Best, -- Jaap |-Oorspronkelijk bericht- |Van: Jean-Baptiste Onofré |Verzonden: donderdag 30 september 2021 11:34 |Aan: user@karaf.apache.org |Onderwerp: Re: Karaf 5 | |Hi Jaap, | |so, yes, we are talking about the same thing ;) | |There are actually two parts: | |- registering Spring bean in the K5 service registry and use it in another apps |running in K5 |- registering "generic" services (like the json-config-loader, extractor, etc) that |provide shared resources (like HTTP handler) | |Regards |JB | |On 29/09/2021 23:30, jgfrm wrote: |> Perhaps. |> |> I want to be able to use a bean in other Spring module. |> |> What is also an issue it that two (or more) modules obviously result in two |sockets to be opened, in my case both 8400. |> A solution could be to open a different socket per module, e.g. negotiated |with a module for that purpose that also routes traffic for a particular |endpoint to the socket of the module handling that endpoint. |> |> In https://github.com/hank-cp/sbp (based on pf4j) they have a different |strategy; there they have one socket for REST calls, and specific endpoints are |forwarded to the appropriate plugin. |> |> Best, |> |> -- Jaap |> |> |> |-Oorspronkelijk bericht- |> |Van: JB Onofré |> |Verzonden: woensdag 29 september 2021 22:17 |> |Aan: user@karaf.apache.org |> |Onderwerp: Re: Karaf 5 |> | |> |I started a service bridge allowing to implicit push some spring bean |> |to the k5 registry and so that can be used from other modules running |> |in k5. It’s a local branch for now but I can push it on main. |> | |> |Is it what you are looking for ? |> | |> |Regards |> |JB |> | |> |> Le 29 sept. 2021 à 21:43, jgfrm a écrit : |> |> |> |> Is there already something working for exporting functionality of |> |> a Spring |> |modules to other modules? |> |> |> |> |-Oorspronkelijk bericht- |> |> |Van: Jean-Baptiste Onofré |> |> |Verzonden: woensdag 29 september 2021 17:26 |> |> |Aan: user@karaf.apache.org |> |> |Onderwerp: Re: Karaf 5 |> |> | |> |> |Thanks for the update. |> |> | |> |> |I'm happy to say you are the first one to "use/launch" Karaf 5 ;) |> |> | |> |> |About the TomcatURLStreamHandlerFactory is known "issue": |> |> | |> |> |https://github.com/jbonofre/karaf5/blob/main/services/spring-boot- |> |> |application- |> |> |manager/src/main/java/org/apache/karaf/springboot/SpringBootApplic |> |> |ati |> |> |on |> |> |ManagerService.java#L110 |> |> | |> |> |I have to improve this ;) |> |> | |> |> |Regards |> |> |JB |> |> | |> |> |On 29/09/2021 17:19, jgfrm wrote: |> |> |> The following works: |> |> |> |> |> |> Karaf.json: |> |> |> |> |> |> { |> |> |>"applications": [ |> |> |> { |> |> |>"name": "e3web", |> |> |>"url": "file:///home/jaap/Karaf5Test/e3web-dev.jar", |> |> |>"type": "spring-boot", |> |> |>"properties": { |> |> |> "enableHttp": true, |> |> |> "enablePrometheus": true |> |> |>} |> |> |> } |> |> |>] |> |> |> } |> |> |> |> |> |> |> |> |> Add to Spring boot application: |> |> |> |> |> |> @SpringBootApplication |> |> |> @ComponentScan |> |> |> public class E3webApplication { |> |> |> |> |> |> ... |> |> |> public static void main(String[] args) { |> |> |> TomcatURLStreamHandlerFactory.disable(); // see |> |> |https://github.com/spring-projects/spring-boot/issues/21535 |> |> |> SpringApplication.run(E3webApplication.class, args); |> |> |> } |> |> |> |> |> |> |> |> |> Start with |> |> |> java --add-modules jdk.security.jgss -cp |> |> |> ../karaf5/assemblies/k4/target/k4-5.0-SNAPSHOT.jar:target/e3web- |> |> |> tes |> |> |> t-1 |> |> |> .0-SNAPSHOT.jar:../karaf5/services/spring-boot-application-manag |> |> |> er/ tar get/spring-boot-application-manager-5.0-SNAPSHOT.jar |> |> |> -Dkaraf.config=src/main/resources/karaf.json |> |> |> org.apache.karaf.boot.Main |> |> |> |> |> |> |-Oorspronkelijk bericht- |> |> |> |Van: JB Onofré |> |> |> |Verzonden: dinsdag 28 september 2021 06:34 |> |> |> |Aan: user@karaf.apache.org |> |>
RE: Karaf 5
Perhaps. I want to be able to use a bean in other Spring module. What is also an issue it that two (or more) modules obviously result in two sockets to be opened, in my case both 8400. A solution could be to open a different socket per module, e.g. negotiated with a module for that purpose that also routes traffic for a particular endpoint to the socket of the module handling that endpoint. In https://github.com/hank-cp/sbp (based on pf4j) they have a different strategy; there they have one socket for REST calls, and specific endpoints are forwarded to the appropriate plugin. Best, -- Jaap |-Oorspronkelijk bericht- |Van: JB Onofré |Verzonden: woensdag 29 september 2021 22:17 |Aan: user@karaf.apache.org |Onderwerp: Re: Karaf 5 | |I started a service bridge allowing to implicit push some spring bean to the k5 |registry and so that can be used from other modules running in k5. It’s a local |branch for now but I can push it on main. | |Is it what you are looking for ? | |Regards |JB | |> Le 29 sept. 2021 à 21:43, jgfrm a écrit : |> |> Is there already something working for exporting functionality of a Spring |modules to other modules? |> |> |-Oorspronkelijk bericht- |> |Van: Jean-Baptiste Onofré |> |Verzonden: woensdag 29 september 2021 17:26 |> |Aan: user@karaf.apache.org |> |Onderwerp: Re: Karaf 5 |> | |> |Thanks for the update. |> | |> |I'm happy to say you are the first one to "use/launch" Karaf 5 ;) |> | |> |About the TomcatURLStreamHandlerFactory is known "issue": |> | |> |https://github.com/jbonofre/karaf5/blob/main/services/spring-boot- |> |application- |> |manager/src/main/java/org/apache/karaf/springboot/SpringBootApplicati |> |on |> |ManagerService.java#L110 |> | |> |I have to improve this ;) |> | |> |Regards |> |JB |> | |> |On 29/09/2021 17:19, jgfrm wrote: |> |> The following works: |> |> |> |> Karaf.json: |> |> |> |> { |> |>"applications": [ |> |> { |> |>"name": "e3web", |> |>"url": "file:///home/jaap/Karaf5Test/e3web-dev.jar", |> |>"type": "spring-boot", |> |>"properties": { |> |> "enableHttp": true, |> |> "enablePrometheus": true |> |>} |> |> } |> |>] |> |> } |> |> |> |> |> |> Add to Spring boot application: |> |> |> |> @SpringBootApplication |> |> @ComponentScan |> |> public class E3webApplication { |> |> |> |> ... |> |> public static void main(String[] args) { |> |> TomcatURLStreamHandlerFactory.disable(); // see |> |https://github.com/spring-projects/spring-boot/issues/21535 |> |> SpringApplication.run(E3webApplication.class, args); |> |> } |> |> |> |> |> |> Start with |> |> java --add-modules jdk.security.jgss -cp |> |> ../karaf5/assemblies/k4/target/k4-5.0-SNAPSHOT.jar:target/e3web-tes |> |> t-1 |> |> .0-SNAPSHOT.jar:../karaf5/services/spring-boot-application-manager/ |> |> tar get/spring-boot-application-manager-5.0-SNAPSHOT.jar |> |> -Dkaraf.config=src/main/resources/karaf.json |> |> org.apache.karaf.boot.Main |> |> |> |> |-Oorspronkelijk bericht- |> |> |Van: JB Onofré |> |> |Verzonden: dinsdag 28 september 2021 06:34 |> |> |Aan: user@karaf.apache.org |> |> |Onderwerp: Re: Karaf 5 |> |> | |> |> |Hi |> |> | |> |> |No it’s not this because k5 don’t use OSGi for the spring boot |> |> |launcher. I still think it’s a missing add modules as Jvm arg. I |> |> |will check |> |today. |> |> | |> |> |Regards |> |> |JB |> |> | |> |> |> Le 27 sept. 2021 à 23:39, jgfrm a écrit : |> |> |> |> |> |> While Googling, I came across on of your blogs |> |> |(http://nanthrax.blogspot.com/2021/04/whats-new-in-apache-karaf- |> |> |431.html) that one of the changes in Karaf was to export the |> |> |java.* |> |packages. |> |> |Could that be the cause? |> |> |> |> |> |> |-Oorspronkelijk bericht- |> |> |> |Van: Jean-Baptiste Onofre |> |> |> |Verzonden: zondag 26 september 2021 18:02 |> |> |> |Aan: user@karaf.apache.org |> |> |> |Onderwerp: Re: Karaf 5 |> |> |> | |> |> |> |Hi |> |> |> | |> |> |> |No sure, it’s only class loader issue. I remember this issue in |> |> |> |pure spring boot with JDK11. |> |> |> | |> |> |> |Let me check. |> |> |> | |> |> |> |Regards |> |> |> |JB |> |> |> | |> |> |>
RE: Karaf 5
Is there already something working for exporting functionality of a Spring modules to other modules? |-Oorspronkelijk bericht- |Van: Jean-Baptiste Onofré |Verzonden: woensdag 29 september 2021 17:26 |Aan: user@karaf.apache.org |Onderwerp: Re: Karaf 5 | |Thanks for the update. | |I'm happy to say you are the first one to "use/launch" Karaf 5 ;) | |About the TomcatURLStreamHandlerFactory is known "issue": | |https://github.com/jbonofre/karaf5/blob/main/services/spring-boot- |application- |manager/src/main/java/org/apache/karaf/springboot/SpringBootApplication |ManagerService.java#L110 | |I have to improve this ;) | |Regards |JB | |On 29/09/2021 17:19, jgfrm wrote: |> The following works: |> |> Karaf.json: |> |> { |>"applications": [ |> { |>"name": "e3web", |>"url": "file:///home/jaap/Karaf5Test/e3web-dev.jar", |>"type": "spring-boot", |>"properties": { |> "enableHttp": true, |> "enablePrometheus": true |>} |> } |>] |> } |> |> |> Add to Spring boot application: |> |> @SpringBootApplication |> @ComponentScan |> public class E3webApplication { |> |> ... |> public static void main(String[] args) { |> TomcatURLStreamHandlerFactory.disable(); // see |https://github.com/spring-projects/spring-boot/issues/21535 |> SpringApplication.run(E3webApplication.class, args); |> } |> |> |> Start with |> java --add-modules jdk.security.jgss -cp |> ../karaf5/assemblies/k4/target/k4-5.0-SNAPSHOT.jar:target/e3web-test-1 |> .0-SNAPSHOT.jar:../karaf5/services/spring-boot-application-manager/tar |> get/spring-boot-application-manager-5.0-SNAPSHOT.jar |> -Dkaraf.config=src/main/resources/karaf.json |> org.apache.karaf.boot.Main |> |> |-Oorspronkelijk bericht- |> |Van: JB Onofré |> |Verzonden: dinsdag 28 september 2021 06:34 |> |Aan: user@karaf.apache.org |> |Onderwerp: Re: Karaf 5 |> | |> |Hi |> | |> |No it’s not this because k5 don’t use OSGi for the spring boot |> |launcher. I still think it’s a missing add modules as Jvm arg. I will check |today. |> | |> |Regards |> |JB |> | |> |> Le 27 sept. 2021 à 23:39, jgfrm a écrit : |> |> |> |> While Googling, I came across on of your blogs |> |(http://nanthrax.blogspot.com/2021/04/whats-new-in-apache-karaf- |> |431.html) that one of the changes in Karaf was to export the java.* |packages. |> |Could that be the cause? |> |> |> |> |-Oorspronkelijk bericht- |> |> |Van: Jean-Baptiste Onofre |> |> |Verzonden: zondag 26 september 2021 18:02 |> |> |Aan: user@karaf.apache.org |> |> |Onderwerp: Re: Karaf 5 |> |> | |> |> |Hi |> |> | |> |> |No sure, it’s only class loader issue. I remember this issue in |> |> |pure spring boot with JDK11. |> |> | |> |> |Let me check. |> |> | |> |> |Regards |> |> |JB |> |> | |> |> |> Le 26 sept. 2021 à 17:59, jgfrm a écrit : |> |> |> |> |> |> Hi JB, |> |> |> |> |> |> Fully understand that it is still work in progress. |> |> |> |> |> |> Regarding the .NoClassDefFoundError: org/ietf/jgss/GSSException |> |> |> --add-modules java.security.jgss does not solve it? |> |> |> Is it a class loader problem? |> |> |> |> |> |> Best, |> |> |> |> |> |> -- Jaap |> |> |> |> |> |> |> |> |> |-Oorspronkelijk bericht- |> |> |> |Van: Jean-Baptiste Onofre |> |> |> |Verzonden: zondag 26 september 2021 14:20 |> |> |> |Aan: user@karaf.apache.org |> |> |> |Onderwerp: Re: Karaf 5 |> |> |> | |> |> |> |Hi Jaap, |> |> |> | |> |> |> |First, maybe I was not clean in my presentation: Karaf 5 is |> |> |> |still under development and so, everything is not yet ready. |> |> |> |As said, I will “move” the code to Apache Karaf repo as soon as |> |> |> |I consider I have something clean and running. |> |> |> | |> |> |> |Anyway, about your email, I will check. Today my focus is on |> |> |> |the OsgiApplicationManager to be Karaf 4 compliant. |> |> |> |I also have to improve the Karaf Config service. |> |> |> | |> |> |> |By the way, you don’t need your own Main, just use the |> |> |> |repackage with regular provided Main (you can take a look on |> |> |> |the K4 assembly repackage as an example). I will create a |> |> |> |gradle/maven plugin with |> |> |repackage. |> |> |> | |> |> |> |Regarding y
RE: Karaf 5
The following works: Karaf.json: { "applications": [ { "name": "e3web", "url": "file:///home/jaap/Karaf5Test/e3web-dev.jar", "type": "spring-boot", "properties": { "enableHttp": true, "enablePrometheus": true } } ] } Add to Spring boot application: @SpringBootApplication @ComponentScan public class E3webApplication { ... public static void main(String[] args) { TomcatURLStreamHandlerFactory.disable(); // see https://github.com/spring-projects/spring-boot/issues/21535 SpringApplication.run(E3webApplication.class, args); } Start with java --add-modules jdk.security.jgss -cp ../karaf5/assemblies/k4/target/k4-5.0-SNAPSHOT.jar:target/e3web-test-1.0-SNAPSHOT.jar:../karaf5/services/spring-boot-application-manager/target/spring-boot-application-manager-5.0-SNAPSHOT.jar -Dkaraf.config=src/main/resources/karaf.json org.apache.karaf.boot.Main |-Oorspronkelijk bericht- |Van: JB Onofré |Verzonden: dinsdag 28 september 2021 06:34 |Aan: user@karaf.apache.org |Onderwerp: Re: Karaf 5 | |Hi | |No it’s not this because k5 don’t use OSGi for the spring boot launcher. I still |think it’s a missing add modules as Jvm arg. I will check today. | |Regards |JB | |> Le 27 sept. 2021 à 23:39, jgfrm a écrit : |> |> While Googling, I came across on of your blogs |(http://nanthrax.blogspot.com/2021/04/whats-new-in-apache-karaf- |431.html) that one of the changes in Karaf was to export the java.* packages. |Could that be the cause? |> |> |-Oorspronkelijk bericht- |> |Van: Jean-Baptiste Onofre |> |Verzonden: zondag 26 september 2021 18:02 |> |Aan: user@karaf.apache.org |> |Onderwerp: Re: Karaf 5 |> | |> |Hi |> | |> |No sure, it’s only class loader issue. I remember this issue in pure |> |spring boot with JDK11. |> | |> |Let me check. |> | |> |Regards |> |JB |> | |> |> Le 26 sept. 2021 à 17:59, jgfrm a écrit : |> |> |> |> Hi JB, |> |> |> |> Fully understand that it is still work in progress. |> |> |> |> Regarding the .NoClassDefFoundError: org/ietf/jgss/GSSException |> |> --add-modules java.security.jgss does not solve it? |> |> Is it a class loader problem? |> |> |> |> Best, |> |> |> |> -- Jaap |> |> |> |> |> |> |-Oorspronkelijk bericht- |> |> |Van: Jean-Baptiste Onofre |> |> |Verzonden: zondag 26 september 2021 14:20 |> |> |Aan: user@karaf.apache.org |> |> |Onderwerp: Re: Karaf 5 |> |> | |> |> |Hi Jaap, |> |> | |> |> |First, maybe I was not clean in my presentation: Karaf 5 is still |> |> |under development and so, everything is not yet ready. |> |> |As said, I will “move” the code to Apache Karaf repo as soon as I |> |> |consider I have something clean and running. |> |> | |> |> |Anyway, about your email, I will check. Today my focus is on the |> |> |OsgiApplicationManager to be Karaf 4 compliant. |> |> |I also have to improve the Karaf Config service. |> |> | |> |> |By the way, you don’t need your own Main, just use the repackage |> |> |with regular provided Main (you can take a look on the K4 assembly |> |> |repackage as an example). I will create a gradle/maven plugin with |> |repackage. |> |> | |> |> |Regarding your issue, as you are running with JDK11, I guess you |> |> |have to add -- add-modules java.security.jgss to avoid the |> |NoClassDefFoundException. |> |> | |> |> |Thanks anyway for your feedback, much appreciated. |> |> | |> |> |Regards |> |> |JB |> |> | |> |> |> Le 26 sept. 2021 à 12:00, jgfrm a écrit : |> |> |> |> |> |> Hi Jean-Baptiste, |> |> |> |> |> |> I managed to start (well not completely) my spring application. |> |> |> However, while starting up, I get an exception: |> |> |> |> |> |> 11:43:03.148 [main] ERROR o.s.boot.SpringApplication:837 - |> |> |> Application run failed |> |> |> org.springframework.context.ApplicationContextException: Unable |> |> |> to start web server; nested exception is |java.lang.NoClassDefFoundError: |> |> |> org/ietf/jgss/GSSException |> |> |> |> |> |> Any ideas? |> |> |> |> |> |> Also, I had to make modifications in |> |> |SpringBootApplicationManagerService/start: |> |> |> |> |> |> try { |> |> |>Thread.currentThread().setContextClassLoader(classLoader); |> |> |>// disable tomcat stream handler |> |> |>/* There is no TomcatURLStreamHandlerFactory in my spring jar |> |> |>
RE: Karaf 5
While Googling, I came across on of your blogs (http://nanthrax.blogspot.com/2021/04/whats-new-in-apache-karaf-431.html) that one of the changes in Karaf was to export the java.* packages. Could that be the cause? |-Oorspronkelijk bericht- |Van: Jean-Baptiste Onofre |Verzonden: zondag 26 september 2021 18:02 |Aan: user@karaf.apache.org |Onderwerp: Re: Karaf 5 | |Hi | |No sure, it’s only class loader issue. I remember this issue in pure spring boot |with JDK11. | |Let me check. | |Regards |JB | |> Le 26 sept. 2021 à 17:59, jgfrm a écrit : |> |> Hi JB, |> |> Fully understand that it is still work in progress. |> |> Regarding the .NoClassDefFoundError: org/ietf/jgss/GSSException |> --add-modules java.security.jgss does not solve it? |> Is it a class loader problem? |> |> Best, |> |> -- Jaap |> |> |> |-Oorspronkelijk bericht- |> |Van: Jean-Baptiste Onofre |> |Verzonden: zondag 26 september 2021 14:20 |> |Aan: user@karaf.apache.org |> |Onderwerp: Re: Karaf 5 |> | |> |Hi Jaap, |> | |> |First, maybe I was not clean in my presentation: Karaf 5 is still |> |under development and so, everything is not yet ready. |> |As said, I will “move” the code to Apache Karaf repo as soon as I |> |consider I have something clean and running. |> | |> |Anyway, about your email, I will check. Today my focus is on the |> |OsgiApplicationManager to be Karaf 4 compliant. |> |I also have to improve the Karaf Config service. |> | |> |By the way, you don’t need your own Main, just use the repackage with |> |regular provided Main (you can take a look on the K4 assembly |> |repackage as an example). I will create a gradle/maven plugin with |repackage. |> | |> |Regarding your issue, as you are running with JDK11, I guess you have |> |to add -- add-modules java.security.jgss to avoid the |NoClassDefFoundException. |> | |> |Thanks anyway for your feedback, much appreciated. |> | |> |Regards |> |JB |> | |> |> Le 26 sept. 2021 à 12:00, jgfrm a écrit : |> |> |> |> Hi Jean-Baptiste, |> |> |> |> I managed to start (well not completely) my spring application. |> |> However, while starting up, I get an exception: |> |> |> |> 11:43:03.148 [main] ERROR o.s.boot.SpringApplication:837 - |> |> Application run failed |> |> org.springframework.context.ApplicationContextException: Unable to |> |> start web server; nested exception is java.lang.NoClassDefFoundError: |> |> org/ietf/jgss/GSSException |> |> |> |> Any ideas? |> |> |> |> Also, I had to make modifications in |> |SpringBootApplicationManagerService/start: |> |> |> |> try { |> |>Thread.currentThread().setContextClassLoader(classLoader); |> |>// disable tomcat stream handler |> |>/* There is no TomcatURLStreamHandlerFactory in my spring jar |> |>final Method tomcat = |> |classLoader.loadClass("org.apache.catalina.webresources.TomcatURLStre |> |am HandlerFactory").getMethod("disable"); |> |>if (!tomcat.isBridge()) { |> |>tomcat.setAccessible(true); |> |>} |> |>tomcat.invoke(null, null); |> |> */ |> |>// invoke spring boot main |> |>final Method main = |> |classLoader.loadClass("org.springframework.boot.loader.JarLauncher"). |> |getM |> |ethod("main", String[].class); |> |>main.setAccessible(true); |> |>log.info("Call JarLauncher"); |> |>if (properties.get("args") != null) { |> |>log.info("Call JarLauncher with args"); |> |>main.invoke(null, new Object[]{ properties.get("args") }); |> |>} else { |> |>log.info("Call JarLauncher without args"); |> |>main.invoke(null, new Object[]{new String[0]}); // |> |> the original invoke |> |did not work for me |> |>} |> |>} finally { |> |>Thread.currentThread().setContextClassLoader(original); |> |>} |> |> |> |> Further details: |> |> - openjdk version "11.0.12" 2021-07-20 |> |> - invocation: |> |> java -cp |> |> ../karaf5/assemblies/k4/target/k4-5.0-SNAPSHOT.jar:target/e3web-tes |> |> t-1 |> |> .0-SNAPSHOT.jar:../karaf5/services/spring-boot-application-manager/ |> |> tar get/spring-boot-application-manager-5.0-SNAPSHOT.jar |> |> -Dkaraf.config=src/main/resources/karaf.json Main |> |> |> |> Main.java: |> |> ### |> |> public class Main { |> |>public s
RE: Karaf 5
Hi JB, Fully understand that it is still work in progress. Regarding the .NoClassDefFoundError: org/ietf/jgss/GSSException --add-modules java.security.jgss does not solve it? Is it a class loader problem? Best, -- Jaap |-Oorspronkelijk bericht- |Van: Jean-Baptiste Onofre |Verzonden: zondag 26 september 2021 14:20 |Aan: user@karaf.apache.org |Onderwerp: Re: Karaf 5 | |Hi Jaap, | |First, maybe I was not clean in my presentation: Karaf 5 is still under |development and so, everything is not yet ready. |As said, I will “move” the code to Apache Karaf repo as soon as I consider I |have something clean and running. | |Anyway, about your email, I will check. Today my focus is on the |OsgiApplicationManager to be Karaf 4 compliant. |I also have to improve the Karaf Config service. | |By the way, you don’t need your own Main, just use the repackage with |regular provided Main (you can take a look on the K4 assembly repackage as |an example). I will create a gradle/maven plugin with repackage. | |Regarding your issue, as you are running with JDK11, I guess you have to add -- |add-modules java.security.jgss to avoid the NoClassDefFoundException. | |Thanks anyway for your feedback, much appreciated. | |Regards |JB | |> Le 26 sept. 2021 à 12:00, jgfrm a écrit : |> |> Hi Jean-Baptiste, |> |> I managed to start (well not completely) my spring application. |> However, while starting up, I get an exception: |> |> 11:43:03.148 [main] ERROR o.s.boot.SpringApplication:837 - Application |> run failed |> org.springframework.context.ApplicationContextException: Unable to |> start web server; nested exception is java.lang.NoClassDefFoundError: |> org/ietf/jgss/GSSException |> |> Any ideas? |> |> Also, I had to make modifications in |SpringBootApplicationManagerService/start: |> |> try { |>Thread.currentThread().setContextClassLoader(classLoader); |>// disable tomcat stream handler |>/* There is no TomcatURLStreamHandlerFactory in my spring jar |>final Method tomcat = |classLoader.loadClass("org.apache.catalina.webresources.TomcatURLStream |HandlerFactory").getMethod("disable"); |>if (!tomcat.isBridge()) { |>tomcat.setAccessible(true); |>} |>tomcat.invoke(null, null); |> */ |>// invoke spring boot main |>final Method main = |classLoader.loadClass("org.springframework.boot.loader.JarLauncher").getM |ethod("main", String[].class); |>main.setAccessible(true); |>log.info("Call JarLauncher"); |>if (properties.get("args") != null) { |>log.info("Call JarLauncher with args"); |>main.invoke(null, new Object[]{ properties.get("args") }); |>} else { |>log.info("Call JarLauncher without args"); |>main.invoke(null, new Object[]{new String[0]}); // the original invoke |did not work for me |>} |>} finally { |>Thread.currentThread().setContextClassLoader(original); |>} |> |> Further details: |> - openjdk version "11.0.12" 2021-07-20 |> - invocation: |> java -cp |> ../karaf5/assemblies/k4/target/k4-5.0-SNAPSHOT.jar:target/e3web-test-1 |> .0-SNAPSHOT.jar:../karaf5/services/spring-boot-application-manager/tar |> get/spring-boot-application-manager-5.0-SNAPSHOT.jar |> -Dkaraf.config=src/main/resources/karaf.json Main |> |> Main.java: |> ### |> public class Main { |>public static void main(String[] args){ |>System.out.println("Starting Karaf"); |>Karaf karaf = Karaf.builder().build(); |>karaf.start(); |>} |> } |> ### |> |> Best, |> |> -- Jaap |> |> |-Oorspronkelijk bericht- |> |Van: Jean-Baptiste Onofré |> |Verzonden: vrijdag 24 september 2021 10:34 |> |Aan: user@karaf.apache.org |> |Onderwerp: Re: Karaf 5 |> | |> |Hi Jaap, |> | |> |The presentation is available here: |> | |> ||https://docs.google.com/presentation/d/1nDqd4oVbrggTDlwrzWc8zEdahKhc |S |> |VZJjlPk5FPxfBE/edit?usp=sharing |> | |> |Karaf 5 WIP is available here: |> | |> |https://github.com/jbonofre/karaf5 |> | |> |I'm available on Slack or by email if you wanna chat about Karaf5. |> | |> |Regards |> |JB |> | |> |On 24/09/2021 10:06, jgfrm wrote: |> |> Hi, |> |> |> |> I have two questions about Karaf 5: |> |> - is the presentation by Onofre at ApacheConf online somewhere? |> |> - is it possible to explore Karaf 5 (or: what is there right now)? |> |> I am in particular interested in the Spring Boot functionality, as |> |> I have a Spring Boot application that I want to port to Karaf to |> |> support dynamic loading of components. I have found the github repo |> |> of Onofre, but it is unclear to me how e.g. to start Karaf. |> |> |> |> Best, |> |> |> |> -- Jaap |> |> |>
RE: Karaf 5
Hi Jean-Baptiste, I managed to start (well not completely) my spring application. However, while starting up, I get an exception: 11:43:03.148 [main] ERROR o.s.boot.SpringApplication:837 - Application run failed org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is java.lang.NoClassDefFoundError: org/ietf/jgss/GSSException Any ideas? Also, I had to make modifications in SpringBootApplicationManagerService/start: try { Thread.currentThread().setContextClassLoader(classLoader); // disable tomcat stream handler /* There is no TomcatURLStreamHandlerFactory in my spring jar final Method tomcat = classLoader.loadClass("org.apache.catalina.webresources.TomcatURLStreamHandlerFactory").getMethod("disable"); if (!tomcat.isBridge()) { tomcat.setAccessible(true); } tomcat.invoke(null, null); */ // invoke spring boot main final Method main = classLoader.loadClass("org.springframework.boot.loader.JarLauncher").getMethod("main", String[].class); main.setAccessible(true); log.info("Call JarLauncher"); if (properties.get("args") != null) { log.info("Call JarLauncher with args"); main.invoke(null, new Object[]{ properties.get("args") }); } else { log.info("Call JarLauncher without args"); main.invoke(null, new Object[]{new String[0]}); // the original invoke did not work for me } } finally { Thread.currentThread().setContextClassLoader(original); } Further details: - openjdk version "11.0.12" 2021-07-20 - invocation: java -cp ../karaf5/assemblies/k4/target/k4-5.0-SNAPSHOT.jar:target/e3web-test-1.0-SNAPSHOT.jar:../karaf5/services/spring-boot-application-manager/target/spring-boot-application-manager-5.0-SNAPSHOT.jar -Dkaraf.config=src/main/resources/karaf.json Main Main.java: ### public class Main { public static void main(String[] args){ System.out.println("Starting Karaf"); Karaf karaf = Karaf.builder().build(); karaf.start(); } } ### Best, -- Jaap |-Oorspronkelijk bericht- |Van: Jean-Baptiste Onofré |Verzonden: vrijdag 24 september 2021 10:34 |Aan: user@karaf.apache.org |Onderwerp: Re: Karaf 5 | |Hi Jaap, | |The presentation is available here: | |https://docs.google.com/presentation/d/1nDqd4oVbrggTDlwrzWc8zEdahKhcS |VZJjlPk5FPxfBE/edit?usp=sharing | |Karaf 5 WIP is available here: | |https://github.com/jbonofre/karaf5 | |I'm available on Slack or by email if you wanna chat about Karaf5. | |Regards |JB | |On 24/09/2021 10:06, jgfrm wrote: |> Hi, |> |> I have two questions about Karaf 5: |> - is the presentation by Onofre at ApacheConf online somewhere? |> - is it possible to explore Karaf 5 (or: what is there right now)? I |> am in particular interested in the Spring Boot functionality, as I |> have a Spring Boot application that I want to port to Karaf to support |> dynamic loading of components. I have found the github repo of Onofre, |> but it is unclear to me how e.g. to start Karaf. |> |> Best, |> |> -- Jaap |>
RE: Karaf 5
Excellent, many thanks. I will first view your presentation (couldn't make it when it was presented unfortunately) and I case of questions come back to best. Best, -- Jaa[ |-Oorspronkelijk bericht- |Van: Jean-Baptiste Onofré |Verzonden: vrijdag 24 september 2021 10:34 |Aan: user@karaf.apache.org |Onderwerp: Re: Karaf 5 | |Hi Jaap, | |The presentation is available here: | |https://docs.google.com/presentation/d/1nDqd4oVbrggTDlwrzWc8zEdahKhcS |VZJjlPk5FPxfBE/edit?usp=sharing | |Karaf 5 WIP is available here: | |https://github.com/jbonofre/karaf5 | |I'm available on Slack or by email if you wanna chat about Karaf5. | |Regards |JB | |On 24/09/2021 10:06, jgfrm wrote: |> Hi, |> |> I have two questions about Karaf 5: |> - is the presentation by Onofre at ApacheConf online somewhere? |> - is it possible to explore Karaf 5 (or: what is there right now)? I |> am in particular interested in the Spring Boot functionality, as I |> have a Spring Boot application that I want to port to Karaf to support |> dynamic loading of components. I have found the github repo of Onofre, |> but it is unclear to me how e.g. to start Karaf. |> |> Best, |> |> -- Jaap |>
Karaf 5
Hi, I have two questions about Karaf 5: - is the presentation by Onofre at ApacheConf online somewhere? - is it possible to explore Karaf 5 (or: what is there right now)? I am in particular interested in the Spring Boot functionality, as I have a Spring Boot application that I want to port to Karaf to support dynamic loading of components. I have found the github repo of Onofre, but it is unclear to me how e.g. to start Karaf. Best, -- Jaap
Modularized persistence
Hi, I wonder how to implement modularized persistence, e.g. with JPA (but something else is also OK). What I want to achieve: - Each module (feature) is capable to persist its own information, and cannot access information persisted by other modules directly - A module can only obtain persisted information by other module via an API/service published by the module owning the information - Preferably, it still should be possible to relate entities from the one module to entities owned by another module ( a solution could be to omit the foreign key constraint) - A way to trigger cascaded saves and deletes of entities across multiple modules (e.g information that owns other information can only be deleted, if the owned information is deleted to, meaning that the implied foreign key between the owned and owning information is repected) - A general/shared mechanism for access control across modules which persist information, e.g. a user can only access the information he is entitled to. Thanks -- Jaap