Spring Boot和WebLogic 12c

banq發表於2019-01-10

在針對WebLogic 12c執行Spring Boot應用程式時,您有兩個選擇:
  • 從外部連線到WebLogic並在Tomcat或其他容器上獨立執行Spring Boot應用程式
  • 將Spring Boot應用程式直接部署到WebLogic


1. 初始化InitialContext並從外部連線到WebLogic 12c:

@Bean
    public InitialContext webLogicInitialContextExt() {
        System.out.println("Initializing WL context!");

        Hashtable<String, String> h = new Hashtable<String, String>(7);
        h.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
        h.put(Context.PROVIDER_URL, "t3://localhost:7001");
        h.put(Context.SECURITY_PRINCIPAL, "weblogic");
        h.put(Context.SECURITY_CREDENTIALS, "weblogic123");

        InitialContext ctx = null;

        try {
            ctx = new InitialContext(h);
        } catch (NamingException e) {
            e.printStackTrace();
        }
        return ctx;
    }


要執行它,您只需要將weblogic客戶端jar安裝為maven依賴項,避免發生“weblogic.jndi.WLInitialContextFactory”的ClassNotFoundException。
只需參考您的Oracle WebLogic安裝的server / lib資料夾並查詢wlthint3client.jar,它是一個最小的jar,包含連線到WLS和獲取一些JNDI內容的必要類的最小列表。我強烈建議透過maven安裝它以避免頭痛問題。

mvn install:install-file -Dfile=<path-to-file> -DgroupId=<group-id> \
    -DartifactId=<artifact-id> -Dversion=<version> -Dpackaging=<packaging>



2. 在WebLogic 12c中執行的InitialContext和Spring Boot
如果您在WebLogic中執行Spring Boot應用程式,那麼初始化Context會更簡單:

@Bean
    public Context webLogicInitialContextServerSide() throws NamingException{
        return new InitialContext();
    }

您無需指定工廠或URL。預設情況下,伺服器將使用WLInitialContextFactory類及其URL。

使用InitialContext透過JNDI獲取伺服器工件
讓我們建立一個簡單的應用程式,它將每秒將JMS訊息推送到JMS佇列中。
首先請參考伺服器端建立的InitialContext :(如果您希望來自外部WebLogic的InitialContext,只需將bean名稱更改為“webLogicInitialContextExt”)

@Resource(name =“webLogicInitialContextServerSide”)
    public Context ctx;


整個傳送類:(適當配置你的JMS):

@Service
public class JMSUtils {
    @Resource(name="webLogicInitialContextServerSide")
    public Context ctx;

    // Defines the JMS context factory.
    public final static String JMS_FACTORY="jms.hs.ConnectionFactory";

    // Defines the queue.
    public final static String QUEUE="jms.hs.Test";

    private QueueConnectionFactory qconFactory;
    private QueueConnection qcon;
    private QueueSession qsession;
    private QueueSender qsender;
    private Queue queue;
    private TextMessage msg;

    @Scheduled(fixedRate = 1000)
    public void sendIntoJMSQueue() throws Exception{
        try {
            System.out.println("Initializing...");
            init(ctx, QUEUE);
            Date currentTime = new Date();
            System.out.println(currentTime);
            send(currentTime.toString());
        } finally {
            close();
        }
    }

    public void init(Context ctx, String queueName)
            throws NamingException, JMSException
    {
        qconFactory = (QueueConnectionFactory) ctx.lookup(JMS_FACTORY);
        qcon = qconFactory.createQueueConnection();
        qsession = qcon.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
        queue = (Queue) ctx.lookup(queueName);
        qsender = qsession.createSender(queue);
        msg = qsession.createTextMessage();
        qcon.start();
    }

    /**
     * Sends a message to a JMS queue.
     *
     * @param message  message to be sent
     * @exception JMSException if JMS fails to send message due to internal error
     */
    public void send(String message) throws JMSException {
        msg.setText(message);
        qsender.send(msg);
    }

    /**
     * Closes JMS objects.
     * @exception JMSException if JMS fails to close objects due to internal error
     */
    public void close() throws JMSException {
        qsender.close();
        qsession.close();
        qcon.close();
    }
}


在WebLogic 12c上執行Spring Boot應用程式時,幾乎沒有任何問題
您的應用需要在src / main / webapp / WEB-INF資料夾中包含weblogic.xml描述符。其他地方不起作用。有關其他詳細資訊,請閱讀Spring-Boot部署到WebLogic。另外不要忘記設定以下依賴項:

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
            <exclusions>
                <exclusion>
                    <artifactId>tomcat-embed-el</artifactId>
                    <groupId>org.apache.tomcat.embed</groupId>
                </exclusion>
            </exclusions>
        </dependency>

有了這個,您將確保嵌入式servlet容器不會干擾將部署war檔案的servlet容器。

測試:
  • 安裝Weblogic 12c
  • 使用JMS佇列“jms.hs.Test”和JMS連線工廠“jms.hs.ConnectionFactory”在那裡建立域
  • git clone https://bitbucket.org/tomask79/spring-boot-weblogic-jms.git
  • 將WAR從目標資料夾部署到WebLogic並啟動它
  • 新訊息應出現在“jms.hs.Test”佇列中。

點選標題看原文!

相關文章