在针对WebLogic 12c运行Spring Boot应用程序时,您有两个选择:
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 */<font> <b>public</b> <b>void</b> send(String message) throws JMSException { msg.setText(message); qsender.send(msg); } </font><font><i>/** * Closes JMS objects. * @exception JMSException if JMS fails to close objects due to internal error */</i></font><font> <b>public</b> <b>void</b> close() throws JMSException { qsender.close(); qsession.close(); qcon.close(); } } </font>
在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容器。
测试:
点击标题看原文!