0

我想做以下事情,但我不太确定我是否没有浪费时间:我正在尝试在 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

4

1 回答 1

0

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

于 2014-09-22T18:22:01.537 回答