【问题标题】:ActiveMQ embedded broker accessible via Weblogic servlet可通过 Weblogic servlet 访问的 ActiveMQ 嵌入式代理
【发布时间】:2013-08-31 17:03:35
【问题描述】:

我想做以下事情,但我不太确定我是否没有浪费时间:我正在尝试在 weblogic servlet 中运行 ActiveMQ 嵌入式代理。这个想法是,客户端将能够通过 http 连接到 JMS,并且嵌入式代理将为请求提供服务。我知道这是一个疯狂的想法,但它是一个遗留应用程序,并且很多客户端代码都依赖于 JMS。这个想法只是切换连接字符串并将库添加到客户端。 当我创建 tcp 连接时它工作正常,但我不知道如何将 servlet 映射到内部代理

限制如下:

  • weblogic 配置没有变化(如数据源、网桥、JMS 等)
  • 没有弹簧
  • 仅 HTTP

这是来自 web.xml 的 servlet 定义:

<servlet>
    <servlet-name>ActiveMQServlet</servlet-name>
    <servlet-class>com.mycompany.ActiveMQServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>ActiveMQ</servlet-name>
    <url-pattern>/servlet/ActiveMQServlet</url-pattern>
</servlet-mapping>

servlet 的重要部分:

public class ActiveMQServlet extends HttpServlet {
private BrokerService broker;

private static final Log log = LogFactory.getLog(new Object() {
}.getClass().getEnclosingClass());


@Override
public void init() throws ServletException {
    log.info("Load activeMQ");
    // configure the broker
    try {
        TransportConnector connector = new TransportConnector();
        connector.setUri(new URI(ACTIVE_MQ_URL));
        broker = new BrokerService();
        broker.addConnector(connector);
        broker.start();
        log.info("ActiveMQ loaded succesfully");

    } catch (Exception e) {
        log.error("Unable to load ActiveMQ!", e);
    }
}

@Override
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    log.info("Received call.... ");
    log.info("Request: "+request);
    //todo
}

问题是我不知道如何在 servlet 的服务方法和内部 ActiveMQ 代理之间进行请求/响应映射。 另一件事是,我正在尝试解决一些由 ActiveMQ 代理使用的 slf4j 引起的类路径冲突,并且已经花费了几个小时。 但也许我只是在做一些不可能/非常愚蠢的事情。

当我尝试通过简单客户端进行连接时,我遇到了这个异常

javax.jms.JMSException: Could not connect to broker URL: http://localhost:8888/myapp/servlet/ActiveMQServlet. Reason: java.io.IOException: Failed to perform GET on: http://localhost:8888/myapp/servlet/ActiveMQServlet as response was: Not Found
at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:35)
at org.apache.activemq.ActiveMQConnectionFactory.createActiveMQConnection(ActiveMQConnectionFactory.java:293)
at org.apache.activemq.ActiveMQConnectionFactory.createConnection(ActiveMQConnectionFactory.java:191)
...
Caused by: java.io.IOException: Failed to perform GET on: http://localhost:8888/myapp/servlet/ActiveMQServlet as response was: Not Found
    at org.apache.activemq.transport.http.HttpClientTransport.doStart(HttpClientTransport.java:275)
at org.apache.activemq.util.ServiceSupport.start(ServiceSupport.java:55)

执行此操作时,不执行 servlet 中的代码。 servlet 路径很好。如果我在浏览器中打开它,我会得到空白页面和日志消息。

我正在使用 ActiveMQ 5.8.0 和 Weblogic 10.3.6

【问题讨论】:

  • 我不知道你想要达到什么目标。可能经纪人需要static 才能工作。无论如何,AFAIK Weblogic 包含一个“真正的”JMS。抱歉,我认为这是一个 hack。
  • 是的,由于某些我无法改变的政治,这是一种黑客行为。我想将现有的 JMS 提供程序更改为可通过 http 使用的嵌入式提供程序。我只有耳朵,不能修改其他任何东西。
  • 朋友,你在深水中。
  • 所以你认为这不可行?

标签: java servlets jms weblogic activemq


【解决方案1】:

我正在尝试做类似的事情,我发现的是MessageListenerServlet - 我仍在寻找设置它的示例(我在处理 servlet 方面相对较新)但我认为它应该允许这种事情。虽然我认为你的主要应用程序需要在启动时设置 BrokerService ,而 servlet 只需要引用地址。就我而言,我们没有使用 websphere,但“通过 http 从外部源与嵌入式 ActiveMQ 实例对话”的一般前提是相同的。

【讨论】:

    猜你喜欢
    • 2011-05-28
    • 2012-05-13
    • 2013-01-06
    • 1970-01-01
    • 2015-10-27
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多