使用 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+ 中是否有可用的方法?
或者我是否必须生成多个类只是为了进行部署时间配置?