0

使用 Session Beans,我可以使用 ejb-jar.xml 文件在部署时从同一个 java 类创建多个“配置”,这些配置设置为使用不同的数据源或具有其他“部署时”配置。

考虑无状态会话 Bean 类

    package myexample;

    import javax.annotation.Resource;
    import javax.ejb.Stateless;

    @Stateless
    @Remote(MyRemote.class)
    public class MyBean  implements MyRemote {

        private javax.sql.DataSource theDS;

        @Resource(name = "beanName")
    private String beanName;

    public int add(String tag, int val) throws AppException
    {
        try {
            Connection c = null;
            Statement s = null;
            ResultSet r = null;
            int lastValue;
            try {
                c = theDB.getConnection();

    ...snip...
    }
}

和 ejb-jar.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd"
    version="3.1">
    <display-name>EJB1</display-name>
    <enterprise-beans>
        <session>
            <ejb-name>Bean1</ejb-name>
            <ejb-class>myexample.MyBean</ejb-class>
            <session-type>Stateless</session-type>
            <env-entry>
                <env-entry-name>beanName</env-entry-name>
                <env-entry-type>java.lang.String</env-entry-type>
                <env-entry-value>Bean1</env-entry-value>
            </env-entry>
            <resource-ref>
                <res-ref-name>java:/MSSQLDSXA</res-ref-name>
                <res-type>javax.sql.DataSource</res-type>
                <res-auth>Container</res-auth>
                <res-sharing-scope>Shareable</res-sharing-scope>
                <injection-target>
                    <injection-target-class>myexample.MyBean</injection-target-class>
                    <injection-target-name>theDS</injection-target-name>
                </injection-target>
            </resource-ref>

        </session>
        <session>
            <ejb-name>Bean2</ejb-name>
            <ejb-class>myexample.MyBean</ejb-class>
            <session-type>Stateless</session-type>
            <env-entry>
                <env-entry-name>beanName</env-entry-name>
                <env-entry-type>java.lang.String</env-entry-type>
                <env-entry-value>Bean2</env-entry-value>
            </env-entry>
            <resource-ref>
                <res-ref-name>java:/MSSQLDSXA2</res-ref-name>
                <res-type>javax.sql.DataSource</res-type>
                <res-auth>Container</res-auth>
                <res-sharing-scope>Shareable</res-sharing-scope>
                <injection-target>
                    <injection-target-class>myexample.MyBean</injection-target-class>
                    <injection-target-name>theDS</injection-target-name>
                </injection-target>
            </resource-ref>

        </session>
    </enterprise-beans>
</ejb-jar>

我可以查找 2 个不同的 bean“配置”,它们将绑定到不同的数据库实例并具有不同的 beanName 值;(这是一个 Jboss AS7.1,使用 ejb 上下文)。

            UserTransaction utx = null;
        InitialContext ctx = getInitialContext();

        utx = EJBClient.getUserTransaction("hath");
        utx.setTransactionTimeout(900);
        utx.begin();

        try {
                MyRemote bean = (MyRemote) ctx
        .lookup("ejb:MyEJBModule/Bean1!myexample.MyRemote");
                MyRemote bean2 = (MyRemote) ctx
        .lookup("ejb:MyEJBModule/Bean2!myexample.MyRemote");
                bean1.add("ThisRow", 1);
                bean2.add("ThisRow", 2);

...

假设我想将此 SSB 用作 WebService 的实现,那么我如何创建 2 个 WebService 实例来模仿 2 个 SSB 绑定到不同配置的方式?

是否有与应用服务器无关的 ejb-jar.xml 等效的 Web 服务?显然我需要覆盖 webservice 等的位置。旧的 JAX-RPC 机制有一个 webservices.xml 文件和一个映射文件。这些中的任何一个是否仍然相关,我将如何链接到 ejb-jar.xml 文件?

如果没有通用的 java EE 方法来执行此操作,那么 JBoss 7.1+ 中是否有可用的方法?

或者我是否必须生成多个类只是为了进行部署时间配置?

4

1 回答 1

0

使用 JBoss AS7.1,您可以使用 JBoss 特定的部署文件jboss-webservices.xml

这在 JBossWS 高级用户指南中有简要描述

首先在bean类中添加@WebService注解

@Stateless
@Remote(MyRemote.class)
@WebService
public class MyBean  implements MyRemote {

要基于上面的 2 个会话 bean 创建 2 个 Web 服务,请创建一个包含以下内容的 jboss-webservices.xml,并将其与 ejb-jar.xml 一起放在 META-INF 目录中。

<webservices xmlns="http://www.jboss.com/xml/ns/javaee"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      version="1.0"
      xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee http://www.jboss.org/j2ee/schema/jboss_webservices_1_0.xsd">
      <port-component>
        <ejb-name>Bean1</ejb-name> 
        <port-component-name>Bean1</port-component-name>
        <port-component-uri>/Bean1</port-component-uri>
      </port-component>
      <port-component>
        <ejb-name>Bean2</ejb-name>
        <port-component-name>Bean2</port-component-name>
        <port-component-uri>/Bean2</port-component-uri>
      </port-component>
</webservices>

是的,这就是我们所需要的。使用其中一个 Web 服务的 URL 生成客户端代理后,您可以在运行时指定它们的 WSDL URL,以使客户端与其中任何一个进行对话;

Bean1 service  = new Bean1Service(new URL("http://localhost:8080/MyEJBModule/Bean1?wsdl"), new QName("http://myexample/", "Bean1Service")).getBean1Port();
Bean1 service3 = new Bean1Service(new URL("http://localhost:8080/MyEJBModule/Bean2?wsdl"), new QName("http://myexample/", "Bean1Service")).getBean1Port();

System.out.println(service.add("TEST", 100));
System.out.println("Bean3: " + service3.add("TEST", 100));

2个添加调用影响不同的数据库实例......

于 2013-09-11T12:03:24.437 回答