私は似たようなことに取り組んでおり、@Richが提供した解決策がうまくいきました。ただし、weblogic.management.jmx.MBeanServerInvocationHandler を (少なくとも直接は) 使用する必要のない、わずかに異なるアプローチに行き着きました。
探していることを実行するコードを次に示します。
package scratch;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.Hashtable;
import javax.management.JMX;
import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import javax.naming.Context;
import weblogic.management.mbeanservers.domainruntime.DomainRuntimeServiceMBean;
import com.bea.wli.sb.management.configuration.ALSBConfigurationMBean;
import com.bea.wli.sb.management.configuration.SessionManagementMBean;
public class TestOSB_JMX {
public static void main(String[] args) throws Throwable {
// Provide connection information for OSB WebLogic AdminServer on command line
String host = args[0];
int port = Integer.parseInt(args[1]);
String user = args[2];
String password = args[3];
JMXConnector conn = initJmxConnection(host, port, user, password);
try {
System.out.println("Opened JMX connection to " + host + ":" + port + " as " + user);
// get mbean connection
MBeanServerConnection mbconn = conn.getMBeanServerConnection();
// Get SessionmanagementMBean
SessionManagementMBean sm =
JMX.newMBeanProxy(mbconn, ObjectName.getInstance(SessionManagementMBean.OBJECT_NAME), SessionManagementMBean.class);
// Create a session
String sessionName = "MySession";
sm.createSession(sessionName);
// Get the configuration MBean for the session, do stuff, and then discard the session.
try
{
System.out.println("Session exists? : " + sm.sessionExists(sessionName));
ALSBConfigurationMBean configMBean =
JMX.newMBeanProxy(
mbconn,
ObjectName.getInstance("com.bea:Name=" +ALSBConfigurationMBean.NAME + "." + sessionName +",Type=" + ALSBConfigurationMBean.TYPE),
ALSBConfigurationMBean.class
);
System.out.println("Got the config MBean for session: " + configMBean.getSession());
// Do stuff in the session here....
}
finally
{
// use activateSession to commit session changes instead
sm.discardSession(sessionName);
}
} finally {
conn.close();
System.out.println("Closed JMX connection");
}
}
public static JMXConnector initJmxConnection(String hostname, int port,String username, String password)
throws IOException, MalformedURLException
{
JMXServiceURL serviceURL = new JMXServiceURL("t3", hostname, port, "/jndi/" + DomainRuntimeServiceMBean.MBEANSERVER_JNDI_NAME);
Hashtable<String, String> h = new Hashtable<String, String>();
h.put(Context.SECURITY_PRINCIPAL, username);
h.put(Context.SECURITY_CREDENTIALS, password);
h.put(JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES, "weblogic.management.remote");
return JMXConnectorFactory.connect(serviceURL, h);
}
}
私のソリューションについて注意すべき点がいくつかあります。
- 私のクラスパスは、次の WebLogic および OSB JAR ファイルを直接参照しています: alsb.jar、osb-server-modules-ref.jar、wlfullclient.jar
- これらの JAR は、マニフェスト ファイルの Class-Path エントリを介して (多くの) 他の JAR を参照します。
- http://docs.oracle.com/cd/E17904_01/web.1111/e13717/jarbuilder.htmで説明されているように、wlfullclient.jar ファイルを生成する必要がある場合があります。
- このタイプのクライアント アプリケーションには、weblogic.jar の代わりに wlfullclient.jar を使用することをお勧めします。私は最初に weblogic.jar を使用していましたが、多くのクラス ロードの問題が発生しました。
- Oracle Service Bus バージョン: 11.1.1.4、WebLogic バージョン: 10.3.4、および Java 1.6.0_29 を使用しています。