hengheng123456789

            BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
            297 Posts :: 68 Stories :: 144 Comments :: 0 Trackbacks

          ???這幾天實(shí)現(xiàn)了一個(gè)向遠(yuǎn)程Jboss服務(wù)器中部署文件的程序,是采用Jboss 的 JMX 遠(yuǎn)程調(diào)用方法來(lái)實(shí)現(xiàn)的,方法比較簡(jiǎn)單,略微修改就可以把文件傳送到遠(yuǎn)程啟動(dòng)了Jboss服務(wù)器的機(jī)器上,希望與大家分享,此處貼上了全部實(shí)例代碼,配置好后即可運(yùn)行。

          ???實(shí)現(xiàn)步驟如下:

          1、下載安裝Jboss服務(wù)器

          2、新建立java項(xiàng)目,引入jboss安裝目錄 server\default\lib 中的 jboss.jar 和 jmx-adaptor-plugin.jar 包到classpath中

          3、建立 RMIAdaptorHelper.java 類,用于處理遠(yuǎn)程調(diào)用,代碼如下:

          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;
          ?}

          ?/**
          ? * 遠(yuǎn)程調(diào)用 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 服務(wù)器
          ? */
          ?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;

          ?}

          ?/**
          ? * 遠(yuǎn)程調(diào)用的對(duì)象類
          ? */
          ?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 類,用于存儲(chǔ)所要傳輸?shù)奈募?nèi)容,代碼如下:

          package com.sample.upload.mbean;

          import java.io.Serializable;

          public class FileObject implements Serializable
          {
          ?public byte[]?fileContent;
          }

          5、建立 FileUploadMBean.java 接口,用于 Jboss 調(diào)用,代碼如下:
          package com.sample.upload.mbean;

          public interface FileUploadMBean
          {
          ?public boolean uploadFile(String fileName, FileObject fo) throws Exception;
          }


          6、建立 FileUpload.java 類,用于實(shí)現(xiàn)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 類,用于測(cè)試文件上傳,代碼如下:

          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 服務(wù)器
          ???rah.connect();
          ???// 向 Jboss 上傳指定目錄的文件
          ???uploadFile(args[0]);
          ??}
          ??catch (Exception e)
          ??{
          ???e.printStackTrace();
          ??}
          ??System.exit(0);
          ?}
          }

          8、在Jboss的安裝目錄server\default\deploy下建立 com.sample.sar\META-INF目錄,并在其下建立兩個(gè)文件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、此時(shí)把所有Java編譯后的class文件打包成 com.sample.jar 并拷貝到Jboss安裝目錄 server\default\lib 下,啟動(dòng)Jboss(即運(yùn)行bin目錄下的run.bat),再運(yùn)行 TestFileUpload.java 程序進(jìn)行測(cè)試(帶入?yún)?shù)為要上傳文件及完整目錄名,如 java com.sample.upload.test.TestFileUpload E:\test.txt 注意引入-Classpath變量),則文件會(huì)上傳到Jboss的server\default目錄中。

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

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

          Feedback

          # re: Jboss之JMX實(shí)例:上傳文件到Jboss目錄中[未登錄](méi) 2007-01-29 08:14 壞男孩
          樓主辛苦了!  回復(fù)  更多評(píng)論
            

          # re: Jboss之JMX實(shí)例:上傳文件到Jboss目錄中 2007-06-20 16:06 cx
          樓主有沒(méi)有qq,我在試驗(yàn)?zāi)愕拇a時(shí)有問(wèn)題,怎么聯(lián)系你  回復(fù)  更多評(píng)論
            

          # re: Jboss之JMX實(shí)例:上傳文件到Jboss目錄中[未登錄](méi) 2012-03-31 15:59 good
          文件不能太在吧?  回復(fù)  更多評(píng)論
            

          # re: Jboss之JMX實(shí)例:上傳文件到Jboss目錄中 2013-09-09 14:44 開(kāi)發(fā)吧
          我想單純的進(jìn)行jmx之間的配置文件傳輸怎么實(shí)現(xiàn)呢?  回復(fù)  更多評(píng)論
            


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 祁阳县| 准格尔旗| 股票| 伊金霍洛旗| 元谋县| 文安县| 耿马| 哈尔滨市| 潼南县| 北宁市| 金门县| 拜城县| 娄烦县| 乐陵市| 恩施市| 长宁区| 浦江县| 甘孜| 色达县| 顺昌县| 古交市| 竹北市| 醴陵市| 遂昌县| 嘉峪关市| 泰安市| 阳泉市| 灵山县| 玛纳斯县| 仁怀市| 徐水县| 枝江市| 富民县| 长丰县| 唐河县| 蕲春县| 新蔡县| 鹤壁市| 长寿区| 开阳县| 南江县|