Thanks Stuart - I hadn't thought of that.

It does bring up a couple of questions/concerns though:
1) The AspectJ attach EJB would need to be in an independent module from the rest of the application (minor detail)
2) The EJB required is of a singleton pattern.  How would that work in a clustered environment?  A @Singleton @Startup EJB would only be spawned in a single JVM - other nodes in the cluster won't trigger the @PostConstruct method of it and consquently not load the weaver.

Is there a way to force eager initialization of a @Stateless bean instead?  


Baring that, I did run across a blog entry that indicates the use of the Observer pattern listening for the ApplicationScope (https://rmannibucau.wordpress.com/2015/03/10/cdi-and-startup/).  But I suspect that at that point the beans have already been scanned.

@ApplicationScoped
public class ProvisioningDataForApplicationLifecycle {
    private final Map<String, User> users = new HashMap<>(); // + getter
 
    public void init(@Observes @Initialized(ApplicationScoped.class) Object init) {
        users.put("cdi", new User("cdi", "1.1"));
        users.put("deltaspike", new User("deltaspike", "1.3"));
    }
 
    public void destroy(@Observes @Destroyed(ApplicationScoped.class) Object init) {
        users.clear();
    }
}



This seems fairly like a complex solution to a fairly simple ask.  Or am I misunderstanding the @Singleton pattern?  

Thanks,

Eric


On Wed, Oct 18, 2017 at 10:55 AM, Stuart Douglas <stuart.w.douglas@gmail.com> wrote:
So one possibility that comes to mind would be to create a small deployment that does the aspectJ attach on deploy (e.g. in a @PostConstruct method of an @Startup EJB). 

You could then add an inter-deployment dependency on this deployment to all your other deployments, which should ensure that this code is run before other modules are created/loaded.

Stuart

On Wed, Oct 18, 2017 at 4:00 AM, Eric B <ebenzacar@gmail.com> wrote:
Hi,

I'm looking to use AspectJ Load Time Weaving with Wildfly 10.  Looking around at some posts, it is a little complicated to get Wildfly launched properly with the AJ weaver due to the way the AJ library intializes the logging subsystem differently than WF.

Digging around, I found a config that actually works.  It is documented here (obviously some of the class names/versions have to change): https://github.com/ChienChingLee/How-to-launch-Wildfly-9.0-with-AspectJ-1.8-LTW

But I'm not a fan of changing my conf file to something that has hardcoded paths/jar names in it - for example adding:
 -Xbootclasspath/p:$JBOSS_HOME/modules/system/layers/base/org/jboss/logmanager/main/jboss-logmanager-2.0.0.Final.jar 


Digging around some more in AJ, I saw that as of AJ 1.8.7, there is a way to dynamically attach the weaver to the JVM.  Very cool.  https://www.eclipse.org/aspectj/doc/released/README-187.html  
But in order to use the LTW effectively, I need to ensure that the weaver is loaded prior to WF scanning and loading any of my classes (EJB, annotated beans, pojos, etc).  But I have no ideas how to do that.

In the case of a console application, it is pretty straight forward - make it the first item in the application's main() method.  But in the case of a JEE app, I don't know of any main() equivalent.


Is there a way to hook into the classloading mechanism of WF instead to tell it to load the weaver if it isn't already loaded?  Can this be done from within the EAR deployment?  Or is there a single point of entry that WF accesses before scanning any of the classes in the EAR?  Or is there a simpler way of configuring or attaching the AJ Weaver?  I did find an old ticket (https://issues.jboss.org/browse/WFLY-895) that related to this issue, but it is marked as WONT FIX.

Am not sure of the best approach at this point.


Thanks,

Eric

_______________________________________________
wildfly-dev mailing list
wildfly-dev@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/wildfly-dev