服务定义及启动
<mbean code="org.jboss.naming.NamingService"
name="jboss:service=Naming"
xmbean-dd="resource:xmdesc/NamingService-xmbean.xml">
<attribute name="CallByValue">false</attribute>
<attribute name="Port">1099</attribute>
<attribute name="BindAddress">${jboss.bind.address}</attribute>
<attribute name="RmiPort">1098</attribute>
<attribute name="RmiBindAddress">${jboss.bind.address}</attribute>
<depends optional-attribute-name="LookupPool" proxy-type="attribute">jboss.system:service=ThreadPool</depends>
</mbean>
NamingService
// 构造函数 NamingService()
naming = new Main(this.getClass().getName());
Main是一个jnp名字服务的实现.
// 请关注,proxyFactory(JRMPProxyFactoryMBean)
// 启动服务 startService()
naming.start();
bind ObjectFactory to "java:comp"
Main.start()
// 构造NamingServer, NamingServer是JNDI名字服务的实现.
theServer = new NamingServer();
// initCustomSockFactories()
// initJnpInvoker(), 创建NamingServer的服务Stub.
Remote stub = UnicastRemoteObject.exportObject(theServer, ...);
serverStub = new MarshalledObject(stub);
// initBootstrapListencer()
启动一个AcceptHandler线程开始listen, 输出serverStub;
NamingServer
NamingServer为jbossns的核心实现类, 它保存着所有注册的组件,组件的存储结构为树状的。
InitialContext
InitialContext是客户端访问JNDI的入口,它通过给定的properties值进行初始化,它可以连接到本地(同一JVM)或者远程的JNDI上,典型的初始化代码如下:
Properties props = new Properties();
props.put("java.naming.factory.initial", "...");
props.put("java.naming.factory.url.pkgs", "...");
props.put("java.naming.provider.url", "jnp://...");
InitialContext initCtx = new InitialContext(props);
在InitialContext中有一个getDefaultInitCtx方法,它根据java.naming.factory.initial的值来创建Context.
// initialContext.java
protected Context getDefaultInitCtx() throws NamingException{
if (!gotDefault) {
defaultInitCtx = NamingManager.getInitialContext(myProps);
gotDefault = true;
}
return defaultInitCtx;
}
NamingContextFactory实现了InitialContextFactory接口(必须).
// org.jnp.interfaces.NamingContextFactory
public Context getInitialContext(Hashtable env)
throws NamingException {
String providerURL = (String) env.get(Context.PROVIDER_URL);
Name prefix = null;
int comma = providerURL != null ? providerURL.indexOf(',') : -1;
if( providerURL != null && comma < 0 ) {
// 处理prefix
}
return new NamingContext(env, prefix, null);
}
这里返回一个NamingContext, 它是Context的实现类,对InitialContext的一些操作都将转发给它,如lookup, bind和unbind等操作。
NamingContext
NamingContext在JBossNS中是一个客户端的角色,它与服务端进行通信并得到一个NamingServer的stub,
static Naming getServer(String host, int port,
Hashtable serverEnv)
throws NamingException {
// step 1.
SocketFactory factory = loadSocketFactory(serverEnv);
Socket s;
// parse localAddr, localPort
// ...
// step 2.
s = factory.createSocket(host, port, localAddr, localPort);
// Get stub from naming server
// step 3.
BufferedInputStream bis = new BufferedInputStream(s.getInputStream());
ObjectInputStream in = new ObjectInputStream(bis);
MarshalledObject stub = (MarshalledObject) in.readObject();
server = (Naming) stub.get();
s.close();
return server;
}
首先装载SocketFactory的实现类,然后解析localAddr和localPort并创建客户端socket与服务端进行通信,还记得前面的initBootstrapListencer吗?这里创建的socket就是与initBootstrapListencer创建的服务端socket进行连接.
最后我们就得到了一个NameingServer的stub.
[jbossns 关系图]
- 大小: 24.2 KB
分享到:
相关推荐
jboss-system.jar主要是负责JBoss服务器的启动、初始化和系统级别的管理功能。它包含了处理系统属性、类加载器、安全管理等方面的核心组件。例如,它可能包含了一些启动脚本和配置加载逻辑,以及用于处理系统层面的...
jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming"); try { Context context = new InitialContext(jndiProperties); final String appName = ""; final String moduleName = "TestEJB...
该文件包含了JBoss服务的配置,如JNDI(Java Naming and Directory Interface)命名服务、JMS(Java Message Service)消息传递服务、EJB(Enterprise JavaBeans)服务等。 6. **jboss-web.xml** 这是Web应用程序...
props.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces"); props.setProperty("jnp.disableDiscovery", "true"); InitialContext ctx = new InitialContext(props); return...
props.setProperty(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces"); props.setProperty(Context.PROVIDER_URL, "localhost:1099"); Context ctx = new InitialContext(props); HelloRemote...
System.out.println("查询结果: " + result); } catch (Exception e) { e.printStackTrace(); } } } ``` 通过上述步骤,您已经成功地在Tomcat上配置了一个数据库连接池,并且可以在Java代码中使用它来执行...
具体路径为`JBOSS_HOME/modules/system/layers/base/com/mysql`。如果尚未安装,可以从MySQL官网下载对应版本的驱动,并将其放置于上述路径下。 **步骤2:启动JBOSS CLI** 通过命令行启动JBOSS的CLI客户端。命令...
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces java.naming.provider.url=tcp://localhost:1099 ``` 3. **测试与调试**: - 在部署并启动EJB服务器后,可以通过运行客户端程序来测试功能...
import javax.naming.InitialContext; public class Client { public static void main(String[] args) throws Exception { InitialContext ctx = new InitialContext(); CalculatorRemote calc = ...
props.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces"); ctx = new InitialContext(props); return ctx; } public static void main(String[] args) { try { Context ...
5. **Exception Sorter Class Name**:用于区分数据库异常类型,以便于更精确地处理异常,如`org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter`。 6. **Type Mapping**:数据库类型映射,如`mySQL`。 ...
部署后,Java应用程序可以通过Java EE的Context and Dependency Injection (CDI) 或者JNDI(Java Naming and Directory Interface)来查找和使用适配器,建立到1C系统的连接。 总的来说,"JCA Resource Adapter for...
为了实现分布式调用,服务器必须支持JNDI和EJB容器,例如JBoss、GlassFish或TomEE。同时,客户端也需要Java EE API来查找和调用远程bean。当客户端调用`doSomething`方法时,请求会被传输到服务器端,EJB执行相应的...
`fscontext.jar`是Java的一个扩展库,主要用于实现文件系统上下文(File System Context)。这个上下文允许开发者通过JNDI接口来操作文件系统,如读取、写入和管理文件或目录。`fscontext.jar`中的类和接口提供了对...
例如,通过查看JBoss Remoting等框架可以看到这种设计理念的应用。 #### RMI的基本原理 要理解RMI的工作原理,首先要了解计算机网络通信的基本原理。网络通信的核心在于将数据从一台计算机传输到另一台计算机。这...
JNDI的主要目标是为Java开发者提供一个统一的接口来访问不同的命名和目录系统,如LDAP(Lightweight Directory Access Protocol)、DNS(Domain Name System)以及RMI Registry等。 ### JNDI的基本概念 1. **...
数据源是JNDI(Java Naming and Directory Interface)的一部分,可以在应用服务器(如Tomcat、JBoss或WebLogic)中配置,提供更高级的连接管理和池化功能。 5. 连接数据库的代码示例:以下是一个简单的JDBC连接...