第一次写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这个队列只有一个消费者。
然后,就没然后了。
分享到:
相关推荐
5. **创建REST资源**:使用Restlet,我们可以创建代表特定业务对象的Resource类,这些类会映射到特定的HTTP URI。每个Resource类包含处理HTTP请求的方法,如@Get、@Post、@Put和@Delete注解。 6. **数据序列化与反...
Restlet项目是一个开源框架,专门用于构建RESTful(Representational State Transfer)Web服务。REST是一种软件架构风格,它强调简洁、可扩展性和无状态性,是Web服务设计的主流方式。Restlet框架提供了全面的工具集...
在Restlet中,资源由`org.restlet.resource.ServerResource`或`org.restlet.resource.ClientResource`类表示,负责处理请求并返回响应。 3. **代表(Representation)**:在REST中,资源的状态通过数据的表示形式...
本文将深入探讨如何使用Restlet来实现一个最简单的RESTful Web服务。 首先,了解REST的基本概念是必要的。REST强调的是资源的概念,通过URI(Uniform Resource Identifier)来标识,使用HTTP协议中的方法(如GET、...
RESTlet是一款开源框架,专为构建基于REST(Representational ...通过学习这些资料,开发者可以深入理解RESTlet的工作原理,掌握如何使用RESTlet构建RESTful服务和客户端应用,从而提升其在Web服务开发领域的专业技能。
Restlet允许通过继承`org.restlet.resource.Resource`类来创建自定义资源。 - 处理HTTP方法:Restlet支持GET、POST、PUT、DELETE等HTTP方法,通过重写`handle`或`service`方法来定义不同方法的行为。 - 构建URI...
在本示例中,我们将深入探讨如何使用Restlet框架来创建和使用RESTful服务。 首先,理解REST的基本原则至关重要。RESTful服务基于HTTP协议,使用HTTP方法(GET、POST、PUT、DELETE等)来操作资源。资源通过URI...
5. **更易用的API**:简化了API接口,降低了学习曲线,使得开发者能够更快速地集成和使用RESTlet。 6. **扩展性**:提供了丰富的扩展点,可以方便地添加自定义处理器、过滤器和组件,满足特定业务需求。 7. **文档...
本系列的开发实例将带你深入理解并掌握Restlet框架的使用,从基础的JAX-RS实现到高级的Component和Application结构,再到与Spring框架的整合。 首先,我们来看看"RESTLET开发实例(一)基于JAX-RS的REST服务.doc"。...
Restlet是一个轻量级的Java Web服务开发框架,它提供了构建RESTful(Representational State Transfer)应用程序的工具和API。REST是一种架构风格,强调简洁、无状态和可缓存的网络交互,常用于构建高性能、高可用性...
5. **开发工具**:为了简化开发过程,Restlet还提供了IDE插件(如Eclipse和IntelliJ IDEA)以及测试工具,帮助开发者调试和测试REST服务。 在Java Web服务开发中,正确配置和使用这些jar包至关重要。首先,你需要将...
5. **路径匹配模式**:Restlet支持正则表达式和其他模式来匹配URL路径。例如,你可以使用`@Path("/game/{id}")`来匹配形如`/game/123`的URL,其中`{id}`是一个动态参数。 通过以上步骤,你可以在Spring 3环境中配置...
### RESTLET开发实例详解 #### 一、RESTLET框架简介 **RESTLET**是一个轻量级且全面的框架,旨在实现REST(Representational State Transfer)原则与Java类之间的映射。该框架支持广泛的REST式系统构建,不仅仅...
在Restlet中,应用程序由资源(Resource)组成,这些资源是可交互的对象,它们响应客户端的请求并提供响应。资源通过代表者(Representation)来表达其状态,代表者可以是文本、图像或其他任何形式的数据。 1. GET...
**RESTLET IN ACTION** 这本书是一部关于RESTlet框架的详细介绍,旨在帮助读者更好地理解和掌握REST架构,并使用RESTlet框架来构建高质量的Web应用程序和服务。本书分为三个部分,分别是:“开始启动(Getting ...
1. **使用Maven进行配置**:如果您使用的是Maven作为构建工具,可以通过添加依赖项来轻松集成Restlet。 2. **使用Eclipse进行配置**:如果您使用的是Eclipse IDE,则可以通过导入项目模板或手动添加库文件来进行配置...
Restlet是一个开源框架,专为构建RESTful Web服务和应用程序设计。REST(Representational State Transfer)是一种轻量级的架构风格,广泛应用于Web服务和API的设计,强调资源的表示和状态转移。Restlet JEE 2.0.3是...
Restlet Client插件是一款运行在chrome内核浏览器上的Web服务测试插件,该插件主要用于测试各种Web服务,能查看网站基本信息、浏览网页代码并能发送HTTP请求来测试网站Web服务,同时支持自动化API场景。用户在安装了...