jersey rest web 服务与 Activemq 中间件集成

Posted

技术标签:

【中文标题】jersey rest web 服务与 Activemq 中间件集成【英文标题】:jersey rest web Service with Activemq middleware integration 【发布时间】:2013-11-11 11:23:47 【问题描述】:

我有一个使用 JAX-RS 和 jersey 开发的 Restful 服务 API。我已经在 TOMCAT 7 中部署了相同的内容。现在我想实现 Activemq,以便将所有请求保存在队列中并处理请求资源。如何做到这一点并与tomcat7集成。如何将 ActiveMq 与 Tomcat7 或我的 rest 服务 webapp 集成。如何调用服务。

重要:- 在 Rest Api 内部,出于安全考虑,我使用了 FilterChaining 概念,并且在验证调用方之后,我只是将请求转发到资源。为此,我已在 web.xml 中添加。

谢谢

这是我的课:-

    public class LimitFilter implements Filter 

        public void doFilter(ServletRequest request, ServletResponse response,
                FilterChain chain) throws IOException, ServletException 

//some authentication
                if (true) 
                    // let the request through and process as usual
                    chain.doFilter(request, response);

                 else 
                    // handle limit case, e.g. return status code 429 (Too Many
                    // Requests)
                    // see http://tools.ietf.org/html/rfc6585#page-3
                    ((HttpServletResponse) response).sendError(429);
                
             
            
        

这是我的 activemq 示例类:-

public class Qservlet extends HttpServlet 

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException 
            String body = "";
        try 
            // Create a ConnectionFactory

            ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("admin", "admin", ActiveMQConnection.DEFAULT_BROKER_URL);

            // Create a Connection

            Connection connection = connectionFactory.createConnection();


            Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);

            Destination destination = session.createQueue("testQ"); 
            TextMessage message = session.createTextMessage();
            message.setText( "My text message was send and received");//
            message.setJMSRedelivered(true);
            message.setJMSCorrelationID(request.getSession().getId());

            connection.start();

            MessageProducer producer = session.createProducer(destination);
            producer.setDeliveryMode(DeliveryMode.PERSISTENT);
            producer.send(message);

            message = null;
            MessageConsumer consumer = session.createConsumer(destination);
            message = (TextMessage) consumer.receive(1000);
            if (message != null) 
                body = message.getText();
            


            producer.close();
            consumer.close();
            session.close();
            connection.close();

         catch (Exception e) 
            System.out.println(e.toString());
        

    


现在,如果限制过滤器类中有任何请求,我会在一些身份验证机制之后直接转发到资源。这就是为什么我使用过滤器概念来捕获所有请求。

第二类是我跑步时的示例类;消息正在入队和出队;我可以在 ActiveMq 的控制台中看到。

在第一个类中,我只是编写 "chain.doFilter(request, response)" 来将所有 http 请求转发到相应的资源。现在怎么办。将 HTTP 请求放在哪里。我需要异步处理每个请求。 REST 是同步的。

请提出一些建议。并解释你的答案。

谢谢/问候 库马尔·肖拉夫

【问题讨论】:

反对者请发表评论。这个问题有什么问题? 您是否对 HttpServletRequest 中的自定义对象感兴趣,或者您需要它,因为您想稍后将信息传递回客户端? @Phani 是的,在 Httpservlet 请求中。 【参考方案1】:

您是否看过 Apache ActiveMQ 上的 REST 文档:http://activemq.apache.org/rest.html

您是在谈论将 ActiveMQ 作为代理嵌入到 Tomcat 中,还是在单独的盒子/jvm 中运行 ActiveMQ 代理?

由于独立的 ActiveMQ 具有开箱即用的 REST API,如上面的链接所述。

【讨论】:

我已经阅读了这个文档。但是,我无法从这个开始。你有什么小例子……请告诉我。谢谢你的回答。 我不知道,但我需要将所有传入的 Http 请求放入队列中,然后转发到服务。【参考方案2】:

由于缺少凭据,您在点击休息 URL 时看到 ActiveMQ 管理控制台的原因,请使用基本身份验证传递凭据。我写了一个 groovy 客户端来调用 rest URL。你可以使用类似的东西......

import groovyx.net.http.HTTPBuilder;
import groovyx.net.http.Method;
import groovyx.net.http.ContentType;
import groovyx.net.http.RESTClient;
import groovyx.net.http.HttpResponseDecorator;
import groovy.json.JsonSlurper;

def headers= ["Authorization": 'Basic'   +'admin:admin'.bytes.encodeBase64().toString()];
println headers;
def restClient = new RESTClient('http://servername:8161');
def restClientResponse = restClient.get(path: '/api/message/queueName?type=queue',headers:headers,requestContentType: ContentType.JSON)
println restClientResponse.status;
println restClientResponse.headers['Content-Length'];
println restClientResponse.getData();

【讨论】:

以上是关于jersey rest web 服务与 Activemq 中间件集成的主要内容,如果未能解决你的问题,请参考以下文章

与 Jersey RESTful Web 服务中的其他对象一起上传文件

AJAX POST To Jersey 启用 RESTful Web 服务跨域

Jersey REST Web 服务、Tomcat、Eclipse 和 404

使用 Jersey 和 Spring Security 实现 RESTful Web 服务

使用 Jersey 和 Apache Tomcat 构建 RESTful Web 服务

使用 Jersey 的 RESTful Web 服务的会话管理