Jboss EnhancedQueueExecutor源码解读

在JDK线程池中自带的Executor遵循一种典型的生产者,消费者队列模型,即一个统一的阻塞队列,然后一个线程数组不停地消费其中的数据。其本身的处理逻辑为 coreSize->queueSize->maxSize 的增长方式,即先尝试增加 coreSize, 然后再不断地将任务放进队列中,如果队列满了,则再尝试增加 maxSize, 直至拒绝任务。

通过一些手法可以调整策略为 coreSize->maxSize->queueSize。

本文则描述一个由 jboss-threads 中提到的 EnhancedQueueExecutor,中文为增加型队列执行器。其除支持典型的executor模型外,也同样保留如 coreSize,maxSize, queueSize 这些模型。与jdk中实现相区别的是,其本身采用单个链表来完成任务的提交和线程的执行,同时采用额外的数据来存储计数类数据. 更重要的是,其默认线程策略即 coreSize->maxSize->queueSize, 同时可以根据参数调整此策略.

创建对象与ThreadPoolExecutor类似,指定相应的参数即可,如下所示:

EnhancedQueueExecutor executor = new EnhancedQueueExecutor.Builder()
        .setCorePoolSize(corePoolSize)
        .setMaximumPoolSize(maxPoolSize)
        .setKeepAliveTime(Duration.ofMinutes(5))
        .setMaximumQueueSize(1024)
        .setThreadFactory(threadFactory)
        .setExceptionHandler(uncaughtExceptionHandler)
        .setRegisterMBean(false)
        .setGrowthResistance(growthResistance) //增长因子,控制新线程创建逻辑(if >= coreSize时)
        .build();
继续阅读“Jboss EnhancedQueueExecutor源码解读”

xwork classFinder在jboss 7环境不能正确处理url resource的问题以及解决方法

在struts2中,有一个组件为classFinder,它可以在整个项目中查找任意一个指定条件的类。如查找实现了某一个接口的所有实现类,或者查找有指定注解的所有类。这个组件的好处自不用说,但是在jboss7环境下,即会出现查找不到对象的问题。

如以下的条件就不能查找任何信息:只查找以com.iflym包名开头的满足指定条件的类。那么,这个classFinder的构建方法就是:

    public ClassFinder(ClassLoaderInterface classLoader, String... dirNames) {
        this(classLoader, getURLs(classLoader, dirNames));
    }

这个方法,会按照指定的包名,组装多个url地址,那么在jboss7中,就会组装成以下的一个地址:

jboss/standalone/tmp/vfs/deplymentxxx/iflym.jar-xxx/contents/com/iflym

那么,在这个目录下,肯定没有任何东西。那么xword在实现jboss vfs的查找时,会使用以下方法进行定位:

            if (s.startsWith("class org.jboss.vfs.VirtualFile")) { // JBoss 7 and probably JBoss 6
                File physicalFile = readJBossPhysicalFile(content);
                return physicalFile.toURI().toURL();

    private static File readJBossPhysicalFile(Object content) throws Exception {
        Method method = content.getClass().getDeclaredMethod("getPhysicalFile");
        return (File) method.invoke(content);
    }

这样就会返回以上的文件目录的一个url对象,而实现上,这个url对象下面没有任何class文件,自然就不会返回任何信息。
以上的问题,只存在于我们要查找的类在一个jar中的情况,如果在classes目录下,是没有问题的。

解决这个问题,我们需要使用另一个组件:reflections。官方地下:http://code.google.com/p/reflections/

继续阅读“xwork classFinder在jboss 7环境不能正确处理url resource的问题以及解决方法”

jboss7中配置get方式的编码处理

在tomcat中,处理get方式请求是通过在server.xml中,配置URIEncoding=UTF-8即可以处理编码问题,并且在早期的jboss中,也是通过类似的方式进行处理。但是在jboss7当中,这种处理方式已不再有效,需要采用其它的方式。

其实也很简单,针对于使用standard方式启动的jboss,只需要在standard.xml中配置以下即可。

<server xmlns="urn:jboss:domain:1.2">
    <extensions>
        <extension module="org.jboss.as.clustering.infinispan"/>
        <extension module="org.jboss.as.configadmin"/>
        <extension module="org.jboss.as.connector"/>
        <extension module="org.jboss.as.deployment-scanner"/>
    </extensions>
......
    <system-properties>
        <property name="org.apache.catalina.connector.URI_ENCODING" value="UTF-8"/>
        <property name="org.apache.catalina.connector.USE_BODY_ENCODING_FOR_QUERY_STRING" value="true"/>
    </system-properties>
......
    <management>
        <security-realms>

只需要将上文中,省略号之间的代码加到配置文件中即可。这其实与以前的配置差不多,只是放到其它位置而已。
针对post请求处理,需要使用encodingFilter即可,这与原来的处理是一样的。
本文参考了:http://jbosscn.iteye.com/blog/1180591 JBoss7配置指南(四)

将jboss 7安装成系统服务

本文自:https://community.jboss.org/wiki/RunningJBossAS7AsAWindowsService

首先从地址 http://www.jboss.org/jbossweb/downloads/jboss-native-2-0-10 下载最新的jboss native文件,将其copy到jboss的bin目录下,原bin目录是不会有native包里的东西的。然后依次进行以下操作即可

  1. 修改service.bat文件,将里面的SVCNAME, SVCDISP and SVCDESC分别修改为自己想要安装成服务的相关信息,即服务名,服务标识以及服务描述信息。
  2. 修改里面的JAVA_OPTS信息配置信息,以配置相应的java内存配置信息,在原service.bat文件中,有默认的-Xrs选项,不过这个选项先不能删掉,以避免某些远程桌面信息会导致jboss停掉的问题。此外,还需要配置比如JAVA_HOME等信息。
  3. 将service.bat中的所有run.bat修改为standalone.bat,在最新的jboss版本中,已不再使用call.bat了。
  4. 将service.bat中关于停止服务的 call shutdown 部分修改为 call jboss-cli.bat –connect command=:shutdown >> shutdown.log 2>&1。因为已经没有shutdown.bat这个文件,如果不修改的话,此调用将直接重启机器。此外,如果配置多个jboss,只需要在后面追加 –controller=host:mport 即可。
  5. 在cmd下运行 service.bat install安装服务,然后在服务中将其启动方式修改为auto即可。

继续阅读“将jboss 7安装成系统服务”