Don't know how the factory exactly would work, but as I already know the
name I wrote a small method to register it by its class name:
public void bindByName(String beanId, String className){
Class<?> clazz = null;
try {
clazz = Class.forName(className);
Object bean = clazz.getDeclaredConstructor().newInstance();
registry.bind(beanId, bean);
} catch (Exception e) {
//Ignore if class not found
}
}
Raymond
On Sat, Oct 1, 2022 at 3:53 PM ski n <[email protected]> wrote:
> I use Camel standalone.
>
> I first thought that I maybe could set the bean with a string parameter
> (similarly to setting a bean with an xml file):
>
> Registry registry = context.getRegistry();
> registry.bind("CurrentAggregateStrategy", "org.mypackage.AggregateStrategy");
>
> But this method isn't an available. Then I looked at annotation based
> solutions. As I understand it:
>
> For runtimes like main and Quarkus one can set this on the bean:
>
> @BindToRegistry("myBeanId")
>
> And for Spring runtimes:
>
> @Component("myBeanId")
>
> But these both are probably not usable from standalone Camel?
>
> I even tried putting camel-spring on the classpath and add the package to
> the componentscan, but this didn't change the result.
>
> I also tried to set it from an XML like this:
>
> String beans = "<beans
> xmlns=\"http://www.springframework.org/schema/beans\"\n" +
> " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
> " xsi:schemaLocation=\"\n" +
> " http://www.springframework.org/schema/beans
> http://www.springframework.org/schema/beans/spring-beans.xsd\n" +
> " http://camel.apache.org/schema/spring
> http://camel.apache.org/schema/spring/camel-spring.xsd\">\n" +
> "\n" +
> " <bean id=\"myBeanId\" class=\"org.package.AggregateStrategy\"/>\n" +
> "\n" +
> "</beans>";
>
> RoutesLoader loader = extendedCamelContext.getRoutesLoader();
> Resource resource = IntegrationUtil.setResource(beans);
> loader.loadRoutes(resource);
>
> This seems to load, but the bean is still not found.
>
> I was able to set from a String through Jooq/Joor:
>
> Reflect.compile(
> "com.example.RegisterBean",
> "package com.example;\n" +
> "class RegisterBean implements
> java.util.function.Supplier<String> {\n" +
> " public String get() {\n" +
> " return \"Hello World!\";\n" +
> " }\n\n" +
> " public String
> register(org.apache.camel.support.SimpleRegistry registry) throws Exception
> {\n" +
> " registry.bind(\"myBeanId\", new
> org.package.AggregateStrategy());\n" +
> "return \"done\";\n" +
> " }\n" +
> "}\n").create().call("register",registry).get();
>
> I haven't worked with Joor before, but surprisingly it worked. I also got
> it to work with AspectJ that bind the bean to the registry after the
> CamelContext/Registry is set. However, both solutions seem a bit of
> workaround compared to the annotation based solutions.
>
> I will check the code for the camel-debug and see how that works. Thanks
> for the suggestions so far.
>
> Raymond
>
>
>
>
>
>
>
>
>
>
>
>
>
>
> On Sat, Oct 1, 2022 at 2:36 PM Claus Ibsen <[email protected]> wrote:
>
>> Hi
>>
>> If you are using spring boot, quarkus, cdi etc then they have auto
>> configuration and cdi startup annotations you can use to trigger custom
>> code.
>>
>> If you talk about plain standalone camel then its a bit more work to do,
>> but we do this with some classpath scanning such as what we can do when
>> you
>> have camel-debug JAR on classpath or not. You could have your own service
>> factory class you active on startup that then scans for custom JARs with a
>> specific @JdkService factory which then can trigger calling this on
>> startup
>> where you can do custom code.
>>
>>
>>
>>
>>
>> On Sat, Oct 1, 2022 at 4:36 AM ski n <[email protected]> wrote:
>>
>> > I can register a bean like this:
>> >
>> > Registry registry = context.getRegistry();
>> > registry.bind("CurrentAggregateStrategy", new AggregateStrategy());
>> >
>> > But I want this dependency to be optional, so I am not sure that the
>> class
>> > (in this example AggregateStrategy) is on the classpath.
>> >
>> > Is it possible that the bean can autoregister itself?
>> >
>> > Raymond
>> >
>>
>>
>> --
>> Claus Ibsen
>> -----------------
>> http://davsclaus.com @davsclaus
>> Camel in Action 2: https://www.manning.com/ibsen2
>>
>