`
bigbullyRN
  • 浏览: 1296 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

使用restlet暴露activeMQ5的队列信息对外发布resource

阅读更多
第一次写blog把自己的经验写到网上分享,有点小兴奋呢。

restful一直很火热,而且由restful提供出的resource非常轻便快捷。

我是在研究spring mvc和activiti5的过程中逐渐接触到restful的,尤其在修改activiti5源码的时候觉得activiti5使用的restlet非常轻便,配置文件也很简洁。

所以当我们项目组在监控activeMQ的queue时我就想能不能把activeMQ的队列信息暴露出来,供我们的监控接口实时进行监控呢。后来下了activeMQ-5.2.0的源码之后发现activeMQ所有的资源信息都已经加载到spring环境中了,有了spring这么熟悉的框架的帮助下要做的事情就变得非常清晰了。

把重点放在activeMQ项目下的activemq-web-console这个子项目上。(访问http://localhost:8161/admin其实就是访问的这个web应用)首先在classpath下加入以下几个restlet的jar包:org.restlet.ext.fileupload-2.0.8.jar,org.restlet.ext.jackson-2.0.8.jar,org.restlet.ext.servlet-2.0.8.jar,org.restlet-2.0.8.jar。
restlet的环境就已经准备好了,然后在web.xml中加入restlet的servlet配置(所有*/service/*的请求就都会由这个servlet进行分发了):

  <!-- restlet -->
  <servlet> 
    <servlet-name>RestletServlet</servlet-name> 
    <servlet-class>org.restlet.ext.servlet.ServerServlet</servlet-class>
    <init-param>
      <!-- Application class name -->
      <param-name>org.restlet.application</param-name>
      <param-value>org.apache.activemq.web.restful.ActiveMqRestApplication</param-value>
    </init-param>
  </servlet>
 
  <!-- Catch all requests --> 
  <servlet-mapping> 
    <servlet-name>RestletServlet</servlet-name> 
    <url-pattern>/service/*</url-pattern> 
  </servlet-mapping>

当然'org.apache.activemq.web.restful'这个目录是我新建的,所以接下来我们要在这个新建的目录下编写ActiveMqRestApplication。

import org.restlet.Application;
import org.restlet.Restlet;
import org.restlet.data.ChallengeScheme;
import org.restlet.routing.Router;
import org.restlet.security.ChallengeAuthenticator;
import org.restlet.security.SecretVerifier;
import org.restlet.security.Verifier;

public class ActiveMqRestApplication extends Application {

private ChallengeAuthenticator authenticator;

@Override
public synchronized Restlet createInboundRoot() {
Verifier verifier = new SecretVerifier() {

@Override
public boolean verify(String username, char[] password){
return true;
}
};
authenticator = new ChallengeAuthenticator(null, true,ChallengeScheme.HTTP_BASIC,
          "ActiveMQ Realm",verifier);

Router router = new Router(getContext());

router.attach("/comsumers/{queueName}", ConsumersResource.class);

authenticator.setNext(router);

return authenticator;
}
}

所有想要暴露的资源都按照以上形式attach到router中即可。我现在暴露了一个查看某队列所有consumers数量的资源。

接下来就要编写ConsumersResource类了:

import org.apache.activemq.broker.jmx.QueueViewMBean;
import org.apache.activemq.web.LocalBrokerFacade;
import org.restlet.representation.Representation;
import org.restlet.resource.Get;
import org.restlet.resource.ServerResource;
import org.springframework.context.ApplicationContext;

public class ConsumersResource extends ServerResource {

@Get
public String getConsumerCount(Representation entity) {
try {
String queueName = (String) getRequest().getAttributes().get("queueName");
ApplicationContext context = RestfulApplicationContextUtil.getContext();
LocalBrokerFacade brokerQuery = (LocalBrokerFacade)context.getBean("brokerQuery");
QueueViewMBean queue = brokerQuery.getQueue(queueName);
if (queue != null){
return queue.getConsumerCount() + "";
}else {
return "-1";
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("检测队列消费者时出错");
}
}
}

这个类就是通过get请求根据queueName查找这个queue的consumers的数量,然后返回字符串

这里的RestfulApplicationContextUtil是自己写的一个工具类,用于能把spring环境中管理的bean拿出来在非spring环境中使用,其实就是一个静态方法调出web工程中的spring环境。

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

public class RestfulApplicationContextUtil implements ApplicationContextAware {

private static ApplicationContext applicationContext;// 声明一个静态变量保存

public static ApplicationContext getContext() {
return applicationContext;
}

public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
this.applicationContext = applicationContext;
}
}

然后把这个工具类放到spring环境里,我图省事就但写了一个spring的配置文件springUtil.xml

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
                           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
  <bean id ="restfulApplicationContextUtil" class="org.apache.activemq.web.restful.RestfulApplicationContextUtil"></bean>
</beans>

最后一步就是找到这个web工程加载默认环境的初始化类中的初始化方法(用的默认的数据源配置,并没有把消息信息进行持久化)
WebConsoleStarter类的createWebapplicationContext()方法,在加载configuration时捎带手的把新建的springUtil.xml也加载进去:

private WebApplicationContext createWebapplicationContext(ServletContext servletContext) {
        String webconsoleType = System.getProperty("webconsole.type", "embedded");
        String configuration = "/WEB-INF/webconsole-" + webconsoleType + ".xml";

        XmlWebApplicationContext context = new XmlWebApplicationContext();
        context.setServletContext(servletContext);
        context.setConfigLocations(new String[] {
            configuration, "/WEB-INF/springUtil.xml"
        });
        context.refresh();
        context.start();

        servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, context);

        return context;
    }

由于activemq用的web容器是jetty,我对jetty一点也不熟,所以就没有在eclipse里进行部署和测试,不过把那4个restlet的jar包扔到apache-activemq-5.2.0\lib目录下,编译过后的.class文件按相应目录结构扔到apache-activemq-5.2.0\webapps\admin之后启动访问
http://localhost:8161/admin/service/comsumers/MyQueue这个地址就能获得MyQueue这个队列的consumers的数量了。

用restlet客户端调用也非常简单,首先把restlet环境加进去(那4个jar包),具体代码就两行:

import org.restlet.resource.ClientResource;

ClientResource cr = new ClientResource("http://localhost:8161/admin/service/comsumers/MyQueue");
String resultStr = cr.get().getText();

返回的resultStr如果是"1"的话就说明MyQueue这个队列只有一个消费者。

然后,就没然后了。
分享到:
评论

相关推荐

    基于Spring的Restlet实例

    5. **创建REST资源**:使用Restlet,我们可以创建代表特定业务对象的Resource类,这些类会映射到特定的HTTP URI。每个Resource类包含处理HTTP请求的方法,如@Get、@Post、@Put和@Delete注解。 6. **数据序列化与反...

    restlet项目

    Restlet项目是一个开源框架,专门用于构建RESTful(Representational State Transfer)Web服务。REST是一种软件架构风格,它强调简洁、可扩展性和无状态性,是Web服务设计的主流方式。Restlet框架提供了全面的工具集...

    restlet2.1学习笔记项目代码

    在Restlet中,资源由`org.restlet.resource.ServerResource`或`org.restlet.resource.ClientResource`类表示,负责处理请求并返回响应。 3. **代表(Representation)**:在REST中,资源的状态通过数据的表示形式...

    restlet实现最简单的restful webservice

    本文将深入探讨如何使用Restlet来实现一个最简单的RESTful Web服务。 首先,了解REST的基本概念是必要的。REST强调的是资源的概念,通过URI(Uniform Resource Identifier)来标识,使用HTTP协议中的方法(如GET、...

    restlet

    RESTlet是一款开源框架,专为构建基于REST(Representational ...通过学习这些资料,开发者可以深入理解RESTlet的工作原理,掌握如何使用RESTlet构建RESTful服务和客户端应用,从而提升其在Web服务开发领域的专业技能。

    restlet-jse-2.2.1.zip

    Restlet允许通过继承`org.restlet.resource.Resource`类来创建自定义资源。 - 处理HTTP方法:Restlet支持GET、POST、PUT、DELETE等HTTP方法,通过重写`handle`或`service`方法来定义不同方法的行为。 - 构建URI...

    restlet工程示例

    在本示例中,我们将深入探讨如何使用Restlet框架来创建和使用RESTful服务。 首先,理解REST的基本原则至关重要。RESTful服务基于HTTP协议,使用HTTP方法(GET、POST、PUT、DELETE等)来操作资源。资源通过URI...

    org.restlet-2.3.0.jar 最新版本

    5. **更易用的API**:简化了API接口,降低了学习曲线,使得开发者能够更快速地集成和使用RESTlet。 6. **扩展性**:提供了丰富的扩展点,可以方便地添加自定义处理器、过滤器和组件,满足特定业务需求。 7. **文档...

    Restlet开发实例

    本系列的开发实例将带你深入理解并掌握Restlet框架的使用,从基础的JAX-RS实现到高级的Component和Application结构,再到与Spring框架的整合。 首先,我们来看看"RESTLET开发实例(一)基于JAX-RS的REST服务.doc"。...

    Restlet开发的Basic认证

    Restlet是一个轻量级的Java Web服务开发框架,它提供了构建RESTful(Representational State Transfer)应用程序的工具和API。REST是一种架构风格,强调简洁、无状态和可缓存的网络交互,常用于构建高性能、高可用性...

    Restlet所需要的所有jar包

    5. **开发工具**:为了简化开发过程,Restlet还提供了IDE插件(如Eclipse和IntelliJ IDEA)以及测试工具,帮助开发者调试和测试REST服务。 在Java Web服务开发中,正确配置和使用这些jar包至关重要。首先,你需要将...

    Restlet2 + Spring3 注解方式配置

    5. **路径匹配模式**:Restlet支持正则表达式和其他模式来匹配URL路径。例如,你可以使用`@Path("/game/{id}")`来匹配形如`/game/123`的URL,其中`{id}`是一个动态参数。 通过以上步骤,你可以在Spring 3环境中配置...

    RESTLET开发

    ### RESTLET开发实例详解 #### 一、RESTLET框架简介 **RESTLET**是一个轻量级且全面的框架,旨在实现REST(Representational State Transfer)原则与Java类之间的映射。该框架支持广泛的REST式系统构建,不仅仅...

    restlet处理各种请求方式参考示例

    在Restlet中,应用程序由资源(Resource)组成,这些资源是可交互的对象,它们响应客户端的请求并提供响应。资源通过代表者(Representation)来表达其状态,代表者可以是文本、图像或其他任何形式的数据。 1. GET...

    RESTLET IN ACTION

    **RESTLET IN ACTION** 这本书是一部关于RESTlet框架的详细介绍,旨在帮助读者更好地理解和掌握REST架构,并使用RESTlet框架来构建高质量的Web应用程序和服务。本书分为三个部分,分别是:“开始启动(Getting ...

    restlet1.1文档

    1. **使用Maven进行配置**:如果您使用的是Maven作为构建工具,可以通过添加依赖项来轻松集成Restlet。 2. **使用Eclipse进行配置**:如果您使用的是Eclipse IDE,则可以通过导入项目模板或手动添加库文件来进行配置...

    restlet-jee-2.0.3

    Restlet是一个开源框架,专为构建RESTful Web服务和应用程序设计。REST(Representational State Transfer)是一种轻量级的架构风格,广泛应用于Web服务和API的设计,强调资源的表示和状态转移。Restlet JEE 2.0.3是...

    Restlet Client-2.13.2

    Restlet Client插件是一款运行在chrome内核浏览器上的Web服务测试插件,该插件主要用于测试各种Web服务,能查看网站基本信息、浏览网页代码并能发送HTTP请求来测试网站Web服务,同时支持自动化API场景。用户在安装了...

Global site tag (gtag.js) - Google Analytics