在部署时配置Web服务

时间:2013-09-10 17:13:21

标签: java web-services java-ee jboss jboss7.x

使用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 +中使用吗?

或者我是否只需要为部署时配置生成多个类?

1 个答案:

答案 0 :(得分:0)

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

JBossWS Adavanced User Guide

简要介绍了这一点

首先将@WebService注释添加到bean类

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

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

<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次添加调用会影响不同的数据库实例...