???這幾天實現了一個向遠程Jboss服務器中部署文件的程序,是采用Jboss 的 JMX 遠程調用方法來實現的,方法比較簡單,略微修改就可以把文件傳送到遠程啟動了Jboss服務器的機器上,希望與大家分享,此處貼上了全部實例代碼,配置好后即可運行。
???實現步驟如下:
1、下載安裝Jboss服務器
2、新建立java項目,引入jboss安裝目錄 server\default\lib 中的 jboss.jar 和 jmx-adaptor-plugin.jar 包到classpath中
3、建立 RMIAdaptorHelper.java 類,用于處理遠程調用,代碼如下:
package com.sample.jmxagent.jboss;
import java.io.Serializable;
import java.util.Properties;
import javax.management.ObjectName;
import javax.naming.CommunicationException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import org.jboss.jmx.adaptor.rmi.RMIAdaptor;
public class RMIAdaptorHelper
{
?private String??_rmiHost?= "127.0.0.1";
?private int???_rmiPort?= 1099;
?private int???_timeout?= 2000;??// ms
?private RMIAdaptor?_server;
?public RMIAdaptorHelper(String rmiHost, int rmiPort, int timeout)
???throws CommunicationException, NamingException
?{
??this._rmiHost = rmiHost;
??this._rmiPort = rmiPort;
??this._timeout = timeout;
?}
?/**
? * 遠程調用 MBEAN
? */
?public Object invoke(RmiInvokeObject rmido) throws Exception
?{
??ObjectName name = new ObjectName(rmido.getJndiname());
??return _server.invoke(name, rmido.getMethodname(), rmido
????.getMethodArgs(), rmido.getMethodArgsType());
?}
?/**
? * 連接 Jboss rmi 服務器
? */
?public void connect() throws NamingException, CommunicationException
?{
??Properties prop = System.getProperties();
??prop.put(Context.INITIAL_CONTEXT_FACTORY,
????"org.jnp.interfaces.NamingContextFactory");
??prop.put(Context.URL_PKG_PREFIXES,
????"org.jboss.naming:org.jnp.interfaces");
??prop.put(Context.PROVIDER_URL, "jnp://" + _rmiHost + ":" + _rmiPort);
??prop.put("jnp.discoveryTimeout", String.valueOf(_timeout));
??InitialContext ic = new InitialContext(prop);
??if (_server != null)
??{
???System.out.println("RMIAdaptorHelper not null");
???_server = null;
??}
??Object o = ic.lookup("jmx/rmi/RMIAdaptor");
??_server = (RMIAdaptor) o;
?}
?/**
? * 遠程調用的對象類
? */
?public class RmiInvokeObject implements Serializable
?{
??private String??jndiname;
??private String??methodname;
??private Object[]?methodArgs;
??private String[]?methodArgsType;
??public String getJndiname()
??{
???return jndiname;
??}
??public void setJndiname(String mbeanName)
??{
???this.jndiname = mbeanName;
??}
??public Object[] getMethodArgs()
??{
???return methodArgs;
??}
??public void setMethodArgs(Object[] methodArgs)
??{
???this.methodArgs = methodArgs;
??}
??public String[] getMethodArgsType()
??{
???return methodArgsType;
??}
??public void setMethodArgsType(String[] methodArgsType)
??{
???this.methodArgsType = methodArgsType;
??}
??public String getMethodname()
??{
???return methodname;
??}
??public void setMethodname(String methodname)
??{
???this.methodname = methodname;
??}
?}
}
4、建立 FileObject.java 類,用于存儲所要傳輸的文件內容,代碼如下:
package com.sample.upload.mbean;
import java.io.Serializable;
public class FileObject implements Serializable
{
?public byte[]?fileContent;
}
5、建立 FileUploadMBean.java 接口,用于 Jboss 調用,代碼如下:
package com.sample.upload.mbean;
public interface FileUploadMBean
{
?public boolean uploadFile(String fileName, FileObject fo) throws Exception;
}
6、建立 FileUpload.java 類,用于實現FileUploadMBean 接口,代碼如下:
package com.sample.upload.mbean;
import java.io.File;
import java.io.FileOutputStream;
import java.net.URI;
public class FileUpload implements FileUploadMBean
{
??? public static final String JBOSS_SERVER_BASE_URL = "jboss.server.base.url";
??? public static final String JBOSS_SERVER_NAME = "jboss.server.name";
??? public static final String JBOSS_SERVER_PATH = System.getProperty(JBOSS_SERVER_BASE_URL)+ System.getProperty(JBOSS_SERVER_NAME);
??? public static final String NODE_ADAPTOR_PATH = JBOSS_SERVER_PATH + "/";
???
?private FileOutputStream?fos?= null;
?private File????f?= null;
?public boolean uploadFile(String fileName, FileObject fo) throws Exception
?{
??boolean returnValue = false;
??try
??{
???// 在 Jboss 的 server\default 目錄下新建立文件
???f = new File(new URI( NODE_ADAPTOR_PATH + fileName));
???f.createNewFile();
???fos = new FileOutputStream(f);
???fos.write(fo.fileContent);
???returnValue = true;
??}
??catch (Exception ex)
??{
???ex.printStackTrace();
???throw ex;
??}
??finally
??{
???if (fos != null)
???{
????try
????{
?????fos.close();
????}
????catch (Exception ee)
????{
?????ee.printStackTrace();
????}
???}
??}
??return returnValue;
?}
}
7、建立 TestFileUpload.java 類,用于測試文件上傳,代碼如下:
package com.sample.upload.test;
import java.io.File;
import java.io.FileInputStream;
import com.sample.jmxagent.jboss.RMIAdaptorHelper;
import com.sample.upload.mbean.FileObject;
public class TestFileUpload
{
?private static RMIAdaptorHelper?rah;
?/**
? * 向 Jboss 上傳指定目錄的文件
? */
?public static void uploadFile(String fileName) throws Exception
?{
??File f = new File(fileName);
??byte[] b = new byte[(int) f.length()];
??FileInputStream fis = new FileInputStream(f);
??try
??{
???fis.read(b);
???FileObject fo = new FileObject();
???fo.fileContent = b;
???RMIAdaptorHelper.RmiInvokeObject rmido = rah.new RmiInvokeObject();
???rmido.setJndiname("com.sample.remotedeploy.mbean.control:service=FileUpload");
???rmido.setMethodname("uploadFile");
???rmido.setMethodArgsType(new String[]{"java.lang.String",
?????"com.sample.upload.mbean.FileObject"});
???rmido.setMethodArgs(new Object[]{f.getName(), fo});
???rah.invoke(rmido);
??}
??catch (Exception ex)
??{
???ex.printStackTrace();
??}
??finally
??{
???if (fis != null)
???{
????try
????{
?????fis.close();
????}
????catch (Exception ee)
????{
?????ee.printStackTrace();
????}
???}
??}
?}
?public static void main(String[] args)
?{
??try
??{
???rah = new RMIAdaptorHelper("127.0.0.1", 1099, 5000);
???// 連接 Jboss rmi 服務器
???rah.connect();
???// 向 Jboss 上傳指定目錄的文件
???uploadFile(args[0]);
??}
??catch (Exception e)
??{
???e.printStackTrace();
??}
??System.exit(0);
?}
}
8、在Jboss的安裝目錄server\default\deploy下建立 com.sample.sar\META-INF目錄,并在其下建立兩個文件jboss-service.xml 和 MANIFEST.MF ,用于把方法部署到Jboss中,jboss-service.xml 代碼如下:
<?xml version="1.0" encoding="UTF-8"?>
<server>
?<mbean
??code="com.sample.upload.mbean.FileUpload"
??name="com.sample.remotedeploy.mbean.control:service=FileUpload">
?
??<depends>jboss.system:service=Logging,type=Log4jService</depends>
??<!-- jboss.rmi -->
??<depends>jboss.rmi:type=RMIClassLoader</depends>
??<!-- jboss jmx -->
??<depends>jboss.jmx:name=Invoker,type=adaptor</depends>
??<depends>jboss.jmx:name=Invoker,protocol=jrmp,service=proxyFactory,type=adaptor</depends>
??<depends>jboss.jmx:alias=jmx/rmi/RMIAdaptor</depends>
??<!-- jboss.security -->
??<depends>jboss.security:service=JaasSecurityManager</depends>
??<depends>jboss.security:service=SecurityConfig</depends>
??<depends>jboss.security:service=XMLLoginConfig</depends>
??<!-- jboss -->
??<depends>jboss:service=ClientUserTransaction</depends>
??<depends>jboss:service=Naming</depends>
??<depends>jboss:service=ClientUserTransaction</depends>
??<depends>jboss:service=TransactionManager</depends>
??<depends>jboss:service=UUIDKeyGeneratorFactory</depends>
??<depends>jboss:service=invoker,type=jrmp</depends>
??<depends>jboss:service=proxyFactory,target=ClientUserTransaction</depends>
??<depends>jboss:service=proxyFactory,target=ClientUserTransactionFactory</depends>
?</mbean>
</server>
9、MANIFEST.MF 代碼如下:
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.6.2
Created-By: 1.4.2_05-b04 (Sun Microsystems Inc.)
10、此時把所有Java編譯后的class文件打包成 com.sample.jar 并拷貝到Jboss安裝目錄 server\default\lib 下,啟動Jboss(即運行bin目錄下的run.bat),再運行 TestFileUpload.java 程序進行測試(帶入參數為要上傳文件及完整目錄名,如 java com.sample.upload.test.TestFileUpload E:\test.txt 注意引入-Classpath變量),則文件會上傳到Jboss的server\default目錄中。
???希望大家有所收獲。