91.4. 例

次の例では、次のように定義された Greater EJB を使用します。

GreaterLocal.java

public interface GreaterLocal {

    String hello(String name);

    String bye(String name);

}

そして実装

GreaterImpl.java

@Stateless
public class GreaterImpl implements GreaterLocal {

    public String hello(String name) {
        return "Hello " + name;
    }

    public String bye(String name) {
        return "Bye " + name;
    }

}

91.4.1. Java DSL の使用

この例では、EJB で hello メソッドを呼び出します。この例は Apache OpenEJB を使用した単体テストに基づいているため、OpenEJB 設定を使用して EJB コンポーネントに JndiContext を設定する必要があります。

@Override
protected CamelContext createCamelContext() throws Exception {
    CamelContext answer = new DefaultCamelContext();

    // enlist EJB component using the JndiContext
    EjbComponent ejb = answer.getComponent("ejb", EjbComponent.class);
    ejb.setContext(createEjbContext());

    return answer;
}

private static Context createEjbContext() throws NamingException {
    // here we need to define our context factory to use OpenEJB for our testing
    Properties properties = new Properties();
    properties.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.LocalInitialContextFactory");

    return new InitialContext(properties);
}

これで、Camel ルートで EJB を使用する準備が整いました。

from("direct:start")
    // invoke the greeter EJB using the local interface and invoke the hello method
    .to("ejb:GreaterImplLocal?method=hello")
    .to("mock:result");

実際のアプリケーションサーバーで

実際のアプリケーションサーバーでは、ほとんどの場合、EJB コンポーネントに JndiContext をセットアップする必要はありません。これは、アプリケーションサーバーと同じ JVM にデフォルトの JndiContext を作成するためです。これにより、通常、JNDI レジストリーにアクセスして EJB をルックアップできます。ただし、リモート JVM などのアプリケーションサーバーにアクセスする必要がある場合は、事前にプロパティーを準備する必要があります。

91.4.2. Spring XML の使用

これは、代わりに Spring XML を使用した同じ例です。

これも単体テストに基づいているため、EJB コンポーネントをセットアップする必要があります。

<!-- setup Camel EJB component -->
<bean id="ejb" class="org.apache.camel.component.ejb.EjbComponent">
    <property name="properties" ref="jndiProperties"/>
</bean>

<!-- use OpenEJB context factory -->
<p:properties id="jndiProperties">
    <prop key="java.naming.factory.initial">org.apache.openejb.client.LocalInitialContextFactory</prop>
</p:properties>

Camel ルートで EJB を使用する準備が整う前に:

<camelContext xmlns="http://camel.apache.org/schema/spring">
    <route>
        <from uri="direct:start"/>
        <to uri="ejb:GreaterImplLocal?method=hello"/>
        <to uri="mock:result"/>
    </route>
</camelContext>