`
qtlkw
  • 浏览: 307094 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Jboss之JMX实例:上传文件到Jboss目录中

 
阅读更多
这几天实现了一个向远程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目录中。

   希望大家有所收获。
分享到:
评论

相关推荐

    jboss远程调用JMX

    1. **配置JBoss**:在JBoss的配置文件(如`standalone.xml`或`domain.xml`)中启用JMX远程访问。这通常涉及开启JMX Remoting接口,并配置必要的安全设置。 2. **客户端设置**:在客户端,我们需要导入必要的JMX和...

    JBoss JMX实现架构

    JBoss JMX(Java Management Extensions)实现架构是JBoss应用服务器中用于管理和服务的核心组件。JMX提供了一种标准的方式来管理和监控分布式系统,包括应用程序、设备和网络资源。JBoss 3.x版本在JMX实现上进行了...

    JBOSS使用指南,JMX原理和应用,EJB3.0使用说明

    2. 解压:将下载的文件解压到指定目录,例如`/opt/jboss`。 3. 配置环境变量:在系统环境变量中设置JBOSS_HOME指向你的JBoss安装目录。 4. 启动与停止:通过执行`$JBOSS_HOME/bin/standalone.sh`启动服务器,使用`$...

    jboss 7 配置 jms

    总之,配置 JMS 在 JBoss 7 中涉及到对服务器配置文件的修改,创建连接工厂和目的地,以及在 Java 代码中实现消息的生产和消费。理解 JMS 的核心概念和 JBoss 7 的具体实现细节是成功部署和使用 JMS 的关键。在实际...

    Jmx实例demo下载

    在本实例中,我们将探讨`jmxdemo`项目,这是一个展示JMX如何工作的示例代码。 在`jmxdemo`这个压缩包中,包含了用于演示JMX功能的源代码。通过分析和运行这些源代码,我们可以深入理解JMX的工作原理及其在实际开发...

    jboss 中文开发文档

    - **JMX 控制台**:介绍了如何使用 JMX (Java Management Extensions) 控制台来监控和管理运行中的 JBoss 服务器。 - **停止服务器**:提供了停止 JBoss 服务器的方法。 - **运行为 Windows 服务**:说明了如何将 ...

    JBOSS4.2 自定义服务器(同一IP启动多个实例)

    首先,在 JBoss 的安装目录(通常称为 `JBOSS_HOME`)下的 `server` 目录中已经默认包含了三个服务器实例:`all`、`default` 和 `minimal`。我们可以通过复制其中一个实例来创建新的服务器实例。 - **步骤**: - ...

    JBoss Admin Development Guide3.26

    - **安装二进制包**:下载并解压JBoss的二进制文件到指定目录下。 - **默认服务器配置文件集**:JBoss提供了预配置的服务器配置文件,用于快速启动和运行服务器。 2. **基本安装测试**:完成安装后,可以通过简单...

    JBoss在MyEclipse中的配置及说明

    在"JBoss Home Directory"中,浏览并选择之前安装的JBoss目录。 4. **配置版本信息**:根据你的JBoss版本选择相应的选项,例如选择"JBoss AS 7.x"或"JBoss EAP 6.x"等,然后点击"Finish"。 5. **创建服务器实例**...

    jboss服务器配置指南

    - 解压与配置:下载后,解压到你选择的目录,然后根据`standalone.xml`或`domain.xml`配置文件进行基本设置,如端口、内存分配等。 - 启动与停止:使用`standalone.bat`(Windows)或`standalone.sh`(Linux/Unix...

    Jboss基础.pdf

    - **配置环境变量**:设置JAVA_HOME指向JDK安装路径,将JBoss的bin目录添加到PATH环境变量中。 - **启动与停止**:通过运行`standalone.bat`(Windows)或`standalone.sh`(Linux/Unix)脚本来启动和停止服务器。 ...

    JBOSS的J2EE开发实践4

    将`mssql-ds.xml`文件复制到`server/default/deploy`目录下。 2. 修改该文件中的相关参数,例如数据库连接URL、用户名、密码等。 以下是一个具体的配置示例: ```xml &lt;jndi-name&gt;VSSDB &lt;connection-url&gt;...

    jboss性能调优

    - **deploy**:应用部署目录,Jboss会自动检测此目录中的新部署。 - **log**:日志文件存储位置。 - **tmp**:临时文件存储区域。 **性能调优关键点:** 1. **JVM配置**:优化JVM参数如堆大小、垃圾收集策略和并发...

    JBoss AS 7 简介

    JBoss AS 7(Application Server 7)是JBoss系列中的一个重要版本,它标志着JBoss AS在技术架构上的一次重大革新。本文将详细介绍JBoss AS 7的历史背景、设计初衷、核心技术和内部结构,并通过实例来帮助读者更好地...

Global site tag (gtag.js) - Google Analytics