[
https://issues.apache.org/jira/browse/OWB-1040?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14521308#comment-14521308
]
Mark Struberg commented on OWB-1040:
------------------------------------
The spec pretty clearly says that events need to be executed bean by bean. Otoh
Weld seems to already break this. Wonder whether we should evaluate what it
means for OWB to also scan the InjectionPoints up front for all classes,
collect this info and then process the rest class-per-class.
We need to take care about possible parallel processing options, etc. So not
sure what the result would be and how much we need to change (IF we go that
route).
> Lifecycle events fired during bean discovery do not follow specification
> sequence
> ---------------------------------------------------------------------------------
>
> Key: OWB-1040
> URL: https://issues.apache.org/jira/browse/OWB-1040
> Project: OpenWebBeans
> Issue Type: Bug
> Components: Lifecycle
> Affects Versions: 1.5.0
> Reporter: Antonin Stefanutti
> Assignee: Reinhard Sandtner
> Priority: Critical
>
> The lifecycle events, like {{ProcessInjectionPoint}} and
> {{ProcessBeanAttributes}} are not fired according to the sequence specified
> in the [Bean
> discovery|http://docs.jboss.org/cdi/spec/1.2/cdi-spec.html#bean_discovery_steps]
> section of the specification.
> Besides, the {{BeanAttributes}} set with the {{ProcessBeanAttributes}} event
> are accessed directly which contradicts the [{{ProcessBeanAttributes}}
> event|http://docs.jboss.org/cdi/spec/1.2/cdi-spec.html#process_bean_attributes]
> specification:
> {quote}
> Any observer of this event is permitted to wrap and/or replace the
> BeanAttributes. The container must use the final value of this property,
> after all observers have been called, to manage instances of the bean.
> Changes to BeanAttributes are not propagated to the annotated type from which
> the bean definition was created.
> {quote}
> Failing test can be found here:
> https://github.com/astefanutti/camel-cdi/blob/a9e94607beaee546f76b7f6e70b9652bf8468d77/envs/se/src/test/java/org/apache/camel/cdi/se/EventEndpointTest.java
> The following exception is thrown when executed with OWB (not systematically
> though maybe due to multi-threading):
> {code}
> org.apache.webbeans.exception.WebBeansDeploymentException:
> javax.enterprise.inject.UnsatisfiedResolutionException: Api type
> [org.apache.camel.cdi.CdiEventEndpoint] is not found with the qualifiers
> Qualifiers: [@org.apache.camel.cdi.se.qualifier.BarQualifier()]
> for injection into Field Injection Point, field name :
> barQualifierCdiEventEndpoint, Bean Owner : [EventConsumingRoute,
> WebBeansType:MANAGED, Name:null, API
> Types:[org.apache.camel.builder.RouteBuilder,org.apache.camel.builder.BuilderSupport,org.apache.camel.cdi.se.bean.EventConsumingRoute,java.lang.Object,org.apache.camel.RoutesBuilder],
> Qualifiers:[javax.enterprise.inject.Any,javax.enterprise.inject.Default]]
> {code}
> This is not supposed to happen as the missing qualifiers are dynamically
> added in the Camel CDI extension here:
> https://github.com/astefanutti/camel-cdi/blob/a9e94607beaee546f76b7f6e70b9652bf8468d77/impl/src/main/java/org/apache/camel/cdi/CdiCamelExtension.java#L118.
> The problem is that OWB calls the observer methods in a different sequence
> than expected:
> {code}
> ProcessBeanAttributes<?>:class
> org.apache.camel.cdi.se.bean.EventProducingRoute
> ProcessBeanAttributes<?>:class
> org.apache.camel.cdi.se.EventEndpointTest$EventObserver
> ProcessBeanAttributes<?>:class org.apache.camel.cdi.CdiCamelFactory$1
> ProcessBeanAttributes<?>:class org.apache.camel.cdi.CdiEventComponent
> ProcessBeanAttributes<?>:class
> org.apache.camel.cdi.se.bean.EventConsumingRoute
> ProcessBeanAttributes<?>:class org.apache.camel.cdi.se.EventEndpointTest
> ProcessBeanAttributes<?>:class org.apache.camel.cdi.CdiCamelFactory
> ProcessBeanAttributes<?>:interface org.apache.camel.Endpoint
> ProcessBeanAttributes<T>:interface org.apache.camel.Endpoint
> BeanAttributes.getQualifiers()
> ProcessBeanAttributes<?>:class org.apache.camel.component.mock.MockEndpoint
> ProcessBeanAttributes<T>:class org.apache.camel.component.mock.MockEndpoint
> BeanAttributes.getQualifiers()
> ProcessBeanAttributes<?>:class org.apache.camel.component.mock.MockEndpoint
> ProcessBeanAttributes<T>:class org.apache.camel.component.mock.MockEndpoint
> BeanAttributes.getQualifiers()
> ProcessBeanAttributes<?>:class org.apache.camel.component.mock.MockEndpoint
> ProcessBeanAttributes<T>:class org.apache.camel.component.mock.MockEndpoint
> BeanAttributes.getQualifiers()
> ProcessBeanAttributes<?>:interface org.apache.camel.TypeConverter
> ProcessBeanAttributes<?>:CdiEventEndpoint<T extends class java.lang.Object>
> ProcessBeanAttributes<T>:CdiEventEndpoint<T extends class java.lang.Object>
> BeanAttributes.getQualifiers()
> ProcessBeanAttributes<?>:interface org.apache.camel.ProducerTemplate
> BeanAttributes.getQualifiers()
> ProcessInjectionPoint<?>:class
> org.apache.camel.cdi.se.bean.EventProducingRoute
> ProcessInjectionPoint<?>:class
> org.apache.camel.cdi.se.bean.EventProducingRoute
> ProcessInjectionPoint<?>:class
> org.apache.camel.cdi.se.bean.EventProducingRoute
> ProcessInjectionPoint<?>:class
> org.apache.camel.cdi.se.bean.EventProducingRoute
> ProcessInjectionPoint<?>:class
> org.apache.camel.cdi.se.bean.EventProducingRoute
> ProcessInjectionPoint<?>:class
> org.apache.camel.cdi.se.bean.EventProducingRoute
> ProcessInjectionPoint<?>:class
> org.apache.camel.cdi.se.bean.EventConsumingRoute
> ProcessInjectionPoint<?>:class
> org.apache.camel.cdi.se.bean.EventConsumingRoute
> ProcessInjectionPoint<?>:class
> org.apache.camel.cdi.se.bean.EventConsumingRoute
> ProcessInjectionPoint<?>:class
> org.apache.camel.cdi.se.bean.EventConsumingRoute
> ProcessInjectionPoint<?>:class
> org.apache.camel.cdi.se.bean.EventConsumingRoute
> ProcessInjectionPoint<?>:class
> org.apache.camel.cdi.se.bean.EventConsumingRoute
> {code}
> For example, the sequence for the {{EventProducingRoute}} bean is:
> {code}
> ProcessBeanAttributes<?>:class
> org.apache.camel.cdi.se.bean.EventProducingRoute
> ProcessInjectionPoint<?>:class
> org.apache.camel.cdi.se.bean.EventProducingRoute
> ProcessInjectionPoint<?>:class
> org.apache.camel.cdi.se.bean.EventProducingRoute
> ProcessInjectionPoint<?>:class
> org.apache.camel.cdi.se.bean.EventProducingRoute
> ProcessInjectionPoint<?>:class
> org.apache.camel.cdi.se.bean.EventProducingRoute
> ProcessInjectionPoint<?>:class
> org.apache.camel.cdi.se.bean.EventProducingRoute
> ProcessInjectionPoint<?>:class
> org.apache.camel.cdi.se.bean.EventProducingRoute
> {code}
> While from the specification, the {{ProcessInjectionPoint}} event must be
> fired before the {{ProcessBeanAttributes}}. Note that this sequence differs
> from one run to another.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)