그것은 이상한 클래스 로딩 또는 보안/권한 문제를 보인다. 아래는 해결 방법입니다.
주요 아이디어 : ServletContextListener
은 ClassNotFoundException
없이 new InitialContext()
을 호출 할 수 있으므로, MBean을 등록하기 전에 수신기에서 가져 와서 MBean 객체의 생성자에 전달하십시오. 간단한 웹 응용 프로그램을 사용하고 수정하지 않았습니다. tomcat/conf/web.xml
. tomcat/conf/context.xml
에
자원 구성 :
<Context>
...
<Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="root" password="..." driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/javatest?autoReconnect=true"/>
...
<Context>
web.xml
자원 구성 :
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/TestDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
MBean의 레지스터 ServletContextListener
:
import java.lang.management.ManagementFactory;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class ContextListener implements ServletContextListener {
private ObjectName objectName;
public void contextInitialized(final ServletContextEvent sce) {
System.out.println("---> bean context listener started");
final MBeanServer mbeanServer =
ManagementFactory.getPlatformMBeanServer();
try {
final InitialContext initialContext = new InitialContext();
final Context envContext =
(Context) initialContext.lookup("java:/comp/env");
objectName = new ObjectName("com.example:type=Hello");
final Hello helloMbean = new Hello(envContext);
mbeanServer.registerMBean(helloMbean, objectName);
System.out.println("---> registerMBean ok");
} catch (final Exception e) {
e.printStackTrace();
}
}
public void contextDestroyed(final ServletContextEvent sce) {
System.out.println("---> bean context listener destroyed");
final MBeanServer mbeanServer =
ManagementFactory.getPlatformMBeanServer();
try {
mbeanServer.unregisterMBean(objectName);
System.out.println("---> unregisterMBean ok");
} catch (final Exception e) {
e.printStackTrace();
}
}
}
MBean 인터페이스를 :
,451,515,
public interface HelloMBean {
void sayHello();
}
MBean의 구현 :
import java.sql.Connection;
import javax.naming.Context;
import javax.sql.DataSource;
public class Hello implements HelloMBean {
private final Context envContext;
public Hello(final Context envContext) {
this.envContext = envContext;
System.out.println("new hello " + envContext);
}
@Override
public void sayHello() {
System.out.println("sayHello()");
try {
final DataSource ds =
(DataSource) envContext.lookup("jdbc/TestDB");
final Connection conn = ds.getConnection();
System.out.println(" conn: " + conn);
// more JDBC code
} catch (final Exception e) {
e.printStackTrace();
}
}
}
MBean Descriptor How To는 mbeans-descriptor.xml
이 필요하지만 그것을 잘하지 않고 일을 말한다. HelloMBean에 jconsole
으로 연결할 수 있습니다.
conn: jdbc:mysql://localhost:3306/javatest?autoReconnect=true, \
[email protected], MySQL-AB JDBC Driver
소스 :
당신이 정확한 구성을 게시 할 수 있습니다
jconsole
통해sayHello()
는 다음과 같은 인쇄 호출? web.xml, server.xml 등등. – Tarlog