使用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 +中使用吗?
或者我是否只需要为部署时配置生成多个类?
答案 0 :(得分:0)
使用JBoss AS7.1,您可以使用JBoss特定的部署文件jboss-webservices.xml
首先将@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次添加调用会影响不同的数据库实例...