$ORAWEB_HOME/jco/lib/jcort.jar, wrbjidl.jar, services.jarpackage myStack;
import oracle.oas.jco.*;
import java.util.Properties;
public class ServerStack implements Lifecycle {
private int stackSize = 0;
private String[] stackElements;
private int top = -1;
private ObjectManager mgr;
private Logger logger;
// === 生命周期回調 ===
public void jcoCreate() {
mgr = ObjectManager.getObjectManager(this);
logger = mgr.getLogger();
logger.setSeverity(Logger.LOG_SEVERITY_DEBUG);
try {
Properties env = mgr.getEnvironment();
setStackSize(Integer.parseInt(env.getProperty("initialStackSize")));
} catch (Exception e) { /* 忽略 */ }
}
public void jcoDestroy() {}
public void jcoPassivate() throws NonReusableException { throw new NonReusableException(); }
public void jcoActivate() {}
// === 業務方法 ===
public int getStackSize() {
logger.println("Getting stack size...");
return stackSize;
}
public void setStackSize(int size) throws StackException {
if (size < 0) throw new StackException();
logger.println("Setting stack size to " + size);
top = -1; stackSize = size; stackElements = new String[size];
}
public void push(String value) throws StackException {
if (top == stackSize - 1) throw new StackException();
logger.println("Pushing \"" + value + "\"");
stackElements[++top] = value;
}
public String pop() throws StackException {
if (top == -1) throw new StackException();
logger.println("Popping: " + stackElements[top]);
return stackElements[top--];
}
}
關鍵點:實現 Lifecycle 接口管理狀態,通過 ObjectManager 獲取環境配置與日誌服務。
package myStack;
public interface ServerStackRemote extends oracle.oas.jco.JCORemote {
int getStackSize();
void setStackSize(int size) throws StackException;
void push(String value) throws StackException;
String pop() throws StackException;
}
必須繼承 JCORemote,定義客戶端可調用的方法簽名。
package myStack;
public final class StackException extends Exception {
public StackException() {}
}
# 編譯服務端類
javac -d ..\Stack\classes_svr\myStack *.java
# 創建 JAR (含類文件與 META-INF/JCO.APP)
jar cvf Server.jar ..\Stack\classes_svr\myStack\*.class META-INF
[APPLICATION]
name=myStack_JCO
[ServerStack]
className=myStack.ServerStack
remoteInterface=myStack.ServerStackRemote
[ServerStack.ENV]
initialStackSize=20
定義應用名、實現類、遠程接口、環境參數初始值。
import oracle.oas.jco.*;
import oracle.oas.jndi.*;
import oracle.oas.jndi.oas.*;
import javax.naming.*;
import java.util.Hashtable;
import myStack.ServerStackRemote;
public class StackClient {
public static void main(String[] args) {
String url = args[0]; // https://appserver:port
Hashtable env = new Hashtable();
env.put(Context.URL_PKG_PREFIXES, "oracle.oas.jndi");
try {
Context ctx = new InitialContext(env);
String name = "oas://" + new URL(url).getHost() + "/myStack/ServerStack";
ServerStackRemote stack = (ServerStackRemote) ctx.lookup(name);
// 交互式測試
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Enter stack size: ");
stack.setStackSize(Integer.parseInt(in.readLine()));
System.out.println("Size set to: " + stack.getStackSize());
String elem;
while ((elem = in.readLine()).length() > 0) {
stack.push(elem);
}
System.out.println("Stack contents (top-down):");
while (true) {
try { System.out.println(stack.pop()); }
catch (StackException e) { break; }
}
} catch (Exception e) { e.printStackTrace(); }
finally { if (stack != null) stack.destroy(); }
}
}
關鍵:JNDI 查找名格式 oas://host/appName/remoteInterfaceName,客戶端需複製 ServerStackRemote.class 和 StackException.class。
# 編譯客戶端
javac -d ..\Stack\classes_cnt\myStack StackClient.java
# 打包客戶端 JAR
jar cvf client.jar ..\Stack\classes_cnt\myStack\*.class
# 運行
java StackClient https://oracle:80
Enter server stack size: 4 ---> Server stack size is currently 4 Enter stack element (RET to quit): 1 Enter stack element (RET to quit): 2 Enter stack element (RET to quit): 3 Enter stack element (RET to quit): 4 Enter stack element (RET to quit): ---> Server stack currently has the following 4 elements: 4 3 2 1
本文通過 myStack 完整演示了 JCORBA 在 OAS 4.0 上的開發、配置、部署、客戶端調用全流程。隨著 CORBA 組件技術與 Java 的深度融合,此類分布式組件開發將成為企業級異構系統集成的主流選擇。