2013-08-28 64 views
0

我想要做以下事情,我不太確定是否不浪費時間:我試圖在weblogic servlet內部運行ActiveMQ嵌入式代理。這個想法是,客戶端將能夠通過http連接到JMS,並且嵌入式代理將爲請求提供服務。我知道這是一個瘋狂的想法,但它是一個遺留應用程序,很多客戶端代碼依賴於JMS。這個想法只是切換連接字符串並將庫添加到客戶端。 當我創建的TCP連接,它工作正常,但我不知道怎麼一個servlet映射到內部經紀人可通過Weblogic servlet訪問的ActiveMQ嵌入式代理

的限制是這些:

  • 在WebLogic配置沒有變化(如數據源,橋樑,JMS等)
  • 沒有春天
  • HTTP只

這是web.xml中的servlet定義:

的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> 

重要部件:

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 
} 

問題是我不知道怎麼做小服務程序的服務的方法和內部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

+0

我不知道你想達到什麼。經紀人可能需要「靜態」才能工作。無論如何,AFAIK Weblogic包含一個「真正的」JMS。對不起,我認爲這是一個黑客。 – Beryllium

+0

是的,這是一個黑客,因爲我無法改變一些政治。我想將現有的JMS提供程序更改爲可以通過http使用的嵌入式提供程序。我只有我的耳朵,不能修改其他任何東西。 – NeplatnyUdaj

+0

你在深水裏我的朋友。 –

回答

0

我試圖做同樣的事情,而且這是我所發現的是MessageListenerServlet - 我還在尋找如何設置它爲例子(我在處理servlet方面相對較新),但我認爲它應該允許這樣的事情。雖然我認爲你的主應用程序需要成爲啓動時設置BrokerService的人,並且servlet只需引用地址即可。在我的情況下,我們沒有使用websphere,但「通過http與外部源進行嵌入式ActiveMQ實例對話」的一般前提是相同的。