hengheng123456789

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            297 Posts :: 68 Stories :: 144 Comments :: 0 Trackbacks

          ???這幾天實現了一個向遠程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目錄中。

          ???希望大家有所收獲。

          posted on 2007-01-27 15:46 哼哼 閱讀(4948) 評論(4)  編輯  收藏 所屬分類: JAVA-Server

          Feedback

          # re: Jboss之JMX實例:上傳文件到Jboss目錄中[未登錄] 2007-01-29 08:14 壞男孩
          樓主辛苦了!  回復  更多評論
            

          # re: Jboss之JMX實例:上傳文件到Jboss目錄中 2007-06-20 16:06 cx
          樓主有沒有qq,我在試驗你的代碼時有問題,怎么聯系你  回復  更多評論
            

          # re: Jboss之JMX實例:上傳文件到Jboss目錄中[未登錄] 2012-03-31 15:59 good
          文件不能太在吧?  回復  更多評論
            

          # re: Jboss之JMX實例:上傳文件到Jboss目錄中 2013-09-09 14:44 開發吧
          我想單純的進行jmx之間的配置文件傳輸怎么實現呢?  回復  更多評論
            


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 长顺县| 定州市| 康马县| 城口县| 宣化县| 吉首市| 安仁县| 新郑市| 和静县| 江门市| 孟州市| 海淀区| 南城县| 丰都县| 海南省| 攀枝花市| 定结县| 台南县| 古交市| 新宁县| 军事| 朝阳市| 郓城县| 大方县| 忻城县| 郑州市| 盐山县| 新疆| 涿鹿县| 浑源县| 平凉市| 信宜市| 景东| 许昌县| 都兰县| 瑞昌市| 边坝县| 交口县| 沾化县| 琼结县| 土默特右旗|