Java/EJB3/Interceptor
Версия от 18:01, 31 мая 2010; (обсуждение)
Содержание
annotation override interceptor
/*
* The contents of this file are subject to the terms
* of the Common Development and Distribution License
* (the License). You may not use this file except in
* compliance with the License.
*
* You can obtain a copy of the license at
* https://glassfish.dev.java.net/public/CDDLv1.0.html or
* glassfish/bootstrap/legal/CDDLv1.0.txt.
* See the License for the specific language governing
* permissions and limitations under the License.
*
* When distributing Covered Code, include this CDDL
* Header Notice in each file and include the License file
* at glassfish/bootstrap/legal/CDDLv1.0.txt.
* If applicable, add the following below the CDDL Header,
* with the fields enclosed by brackets [] replaced by
* you own identifying information:
* "Portions Copyrighted [year] [name of copyright owner]"
*
* Copyright 2006 Sun Microsystems, Inc. All rights reserved.
*/
package enterprise.annotation_override_interceptor_appclient;
import java.util.List;
import javax.ejb.EJB;
import enterprise.annotation_override_interceptor_ejb.*;
public class StatelessSessionAppClient {
@EJB
private static StatelessSession sless;
public static void main(String args[]) {
try {
sless.initUpperCase("hello, World!!");
sless.initLowerCase("Build.xml");
} catch (Exception badEx) {
badEx.printStackTrace();
}
List<String> upperList = sless.getInterceptorNamesFor("initUpperCase");
printList("initUpperCase", upperList);
try {
sless.isOddNumber(7);
} catch (Exception badEx) {
badEx.printStackTrace();
}
List<String> isOddNumberList = sless.getInterceptorNamesFor("isOddNumber");
printList("isOddNumber", isOddNumberList);
}
private static void printList(String msg, List<String> list) {
System.out.print("Interceptors invoked for " + msg + "(): ");
String delimiter = "";
for (String str : list) {
System.out.print(delimiter + str);
delimiter = ", ";
}
System.out.println("}");
}
}
/*
* The contents of this file are subject to the terms
* of the Common Development and Distribution License
* (the License). You may not use this file except in
* compliance with the License.
*
* You can obtain a copy of the license at
* https://glassfish.dev.java.net/public/CDDLv1.0.html or
* glassfish/bootstrap/legal/CDDLv1.0.txt.
* See the License for the specific language governing
* permissions and limitations under the License.
*
* When distributing Covered Code, include this CDDL
* Header Notice in each file and include the License file
* at glassfish/bootstrap/legal/CDDLv1.0.txt.
* If applicable, add the following below the CDDL Header,
* with the fields enclosed by brackets [] replaced by
* you own identifying information:
* "Portions Copyrighted [year] [name of copyright owner]"
*
* Copyright 2006 Sun Microsystems, Inc. All rights reserved.
*/
package enterprise.annotation_override_interceptor_ejb;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;
import javax.ejb.Stateless;
import javax.interceptor.Interceptors;
import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;
// This bean uses two interceptors to validate
// the input to its (only) business method.
// Note that a single interceptor would suffice
// but to demonstrate the use of interceptor
// chaining, we use two interceptors
@Stateless
@Interceptors({ArgumentsChecker.class})
public class StatelessSessionBean
implements StatelessSession {
private static final String KEY = "interceptorNameList";
private static Map<String, List<String>> interceptorNamesForMethod
= new HashMap<String, List<String>>();
//The bean interceptor method just caches the interceptor names
// in a map which is queried in the getInterceptorNamesFor() method
@AroundInvoke
private Object intercept(InvocationContext invCtx)
throws Exception {
System.out.println("Entered aroundInvoke for Bean");
Map<String, Object> ctxData = invCtx.getContextData();
List<String> interceptorNameList = (List<String>) ctxData.get(KEY);
if (interceptorNameList == null) {
interceptorNameList = new ArrayList<String>();
ctxData.put(KEY, interceptorNameList);
}
//Add this interceptor also to the list of interceptors invoked!!
interceptorNameList.add("StatelessSessionBean");
//Cache the interceptor name list in a map that can be queried later
String methodName = invCtx.getMethod().getName();
synchronized (interceptorNamesForMethod) {
interceptorNamesForMethod.put(methodName, interceptorNameList);
}
return invCtx.proceed();
}
// This business method is called after the interceptor methods.
// Hence it is guaranteed that the argument to this method is not null
// and it starts with a letter
public String initUpperCase(String val) {
String first = val.substring(0, 1);
return first.toUpperCase() + val.substring(1);
}
// This business method is called after the interceptor methods.
// Hence it is guaranteed that the argument to this method is not null
// and it starts with a letter
public String initLowerCase(String val) {
String first = val.substring(0, 1);
return first.toLowerCase() + val.substring(1);
}
//Note:-
// Since this method takes a int as a parameter, the ArgumentChecker
// inteceptor is disabled in the ejb-jar.xml for this method.
public boolean isOddNumber(int val) {
return ((val % 2) != 0);
}
/**
* Only the default interceptor is used to intercept this method
*/
public List<String> getInterceptorNamesFor(String methodName) {
return interceptorNamesForMethod.get(methodName);
}
}
/*
* The contents of this file are subject to the terms
* of the Common Development and Distribution License
* (the License). You may not use this file except in
* compliance with the License.
*
* You can obtain a copy of the license at
* https://glassfish.dev.java.net/public/CDDLv1.0.html or
* glassfish/bootstrap/legal/CDDLv1.0.txt.
* See the License for the specific language governing
* permissions and limitations under the License.
*
* When distributing Covered Code, include this CDDL
* Header Notice in each file and include the License file
* at glassfish/bootstrap/legal/CDDLv1.0.txt.
* If applicable, add the following below the CDDL Header,
* with the fields enclosed by brackets [] replaced by
* you own identifying information:
* "Portions Copyrighted [year] [name of copyright owner]"
*
* Copyright 2006 Sun Microsystems, Inc. All rights reserved.
*/
package enterprise.annotation_override_interceptor_ejb;
import java.util.List;
import javax.ejb.Remote;
@Remote
public interface StatelessSession {
public String initUpperCase(String val)
throws BadArgumentException;
public String initLowerCase(String val)
throws BadArgumentException;
public boolean isOddNumber(int val)
throws BadArgumentException;
public List<String> getInterceptorNamesFor(String methodName);
}
/*
* The contents of this file are subject to the terms
* of the Common Development and Distribution License
* (the License). You may not use this file except in
* compliance with the License.
*
* You can obtain a copy of the license at
* https://glassfish.dev.java.net/public/CDDLv1.0.html or
* glassfish/bootstrap/legal/CDDLv1.0.txt.
* See the License for the specific language governing
* permissions and limitations under the License.
*
* When distributing Covered Code, include this CDDL
* Header Notice in each file and include the License file
* at glassfish/bootstrap/legal/CDDLv1.0.txt.
* If applicable, add the following below the CDDL Header,
* with the fields enclosed by brackets [] replaced by
* you own identifying information:
* "Portions Copyrighted [year] [name of copyright owner]"
*
* Copyright 2006 Sun Microsystems, Inc. All rights reserved.
*/
package enterprise.annotation_override_interceptor_ejb;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.lang.reflect.Method;
import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;
/**
* This is the default interceptor
*/
public class NullChecker {
@AroundInvoke
public Object checkIfNull(InvocationContext ctx)
throws Exception {
Map<String, Object> ctxData = ctx.getContextData();
List<String> interceptorNameList = (List<String>)
ctxData.get("interceptorNameList");
if (interceptorNameList == null) {
interceptorNameList = new ArrayList<String>();
ctxData.put("interceptorNameList", interceptorNameList);
}
//Now add this interceptor name to the list
interceptorNameList.add("NullChecker");
Method method = ctx.getMethod();
Object param = ctx.getParameters()[0];
if (param == null) {
// An interceptor can throw any runtime exception or
// application exceptions that are allowed in the
// throws clause of the business method
throw new BadArgumentException("Illegal argument: null");
}
// Proceed to the next interceptor OR business method
return ctx.proceed();
}
}
Around InvokeMethod
File: Employee.java
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.PostRemove;
@Entity
public class Employee implements java.io.Serializable {
private int id;
private String firstName;
private String lastName;
@Id
@GeneratedValue
public int getId() {
return id;
}
@PostRemove
public void postRemove()
{
System.out.println("@PostRemove");
}
public void setId(int id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String first) {
this.firstName = first;
}
public String getLastName() {
return lastName;
}
public void setLastName(String last) {
this.lastName = last;
}
}
File: EmployeeService.java
import javax.ejb.Stateless;
import javax.interceptor.Interceptors;
@Stateless
public class EmployeeService implements EmployeeServiceLocal, EmployeeServiceRemote {
public EmployeeService() {
}
@Interceptors(Profiler.class)
public void doAction() {
System.out.println("do Action");
}
}
File: EmployeeServiceLocal.java
import java.util.Collection;
import javax.ejb.Local;
@Local
public interface EmployeeServiceLocal {
public void doAction();
}
File: EmployeeServiceRemote.java
import java.util.Collection;
import javax.ejb.Remote;
@Remote
public interface EmployeeServiceRemote{
public void doAction();
}
File: Profiler.java
import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;
public class Profiler {
@AroundInvoke
public Object profile(InvocationContext invocation) throws Exception {
long startTime = System.currentTimeMillis();
try {
return invocation.proceed();
} finally {
long endTime = System.currentTimeMillis() - startTime;
System.out.println("Method " + invocation.getMethod() + " took " + endTime + " (ms)");
}
}
}
File: jndi.properties
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=localhost:1099
File: Main.java
import java.util.Date;
import javax.naming.InitialContext;
public class Main {
public static void main(String[] a) throws Exception {
EmployeeServiceRemote service = null;
// Context compEnv = (Context) new InitialContext().lookup("java:comp/env");
// service = (HelloService)new InitialContext().lookup("java:comp/env/ejb/HelloService");
service = (EmployeeServiceRemote) new InitialContext().lookup("EmployeeService/remote");
service.doAction();
}
}
EJB Tutorial from JBoss: Callback Listener
File: CustomerCallbackListener.java
/*
* JBoss, Home of Professional Open Source.
* Copyright 2006, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.tutorial.callback.bean;
import javax.persistence.PreRemove;
import javax.persistence.PostRemove;
import javax.persistence.PreUpdate;
import javax.persistence.PostUpdate;
import javax.persistence.PostLoad;
import javax.persistence.PrePersist;
import javax.persistence.PostPersist;
/**
* @author
== EJB Tutorial from JBoss: Interceptor ==
<!-- start source code -->
<source lang="java">
File: AccountsCancelInterceptor.java
/*
* JBoss, Home of Professional Open Source.
* Copyright 2006, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.tutorial.interceptor.bean;
import javax.interceptor.InvocationContext;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.Session;
/**
*
* @author
== Get Ejb Info From InvocationContext ==
<!-- start source code -->
<source lang="java">
File: Employee.java
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.PostRemove;
@Entity
public class Employee implements java.io.Serializable {
private int id;
private String firstName;
private String lastName;
@Id
@GeneratedValue
public int getId() {
return id;
}
@PostRemove
public void postRemove()
{
System.out.println("@PostRemove");
}
public void setId(int id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String first) {
this.firstName = first;
}
public String getLastName() {
return lastName;
}
public void setLastName(String last) {
this.lastName = last;
}
}
File: EmployeeBean.java
import javax.ejb.Stateful;
import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;
@Stateful
public class EmployeeBean implements EmployeeServiceLocal, EmployeeServiceRemote {
public EmployeeBean() {
}
public void doAction() {
System.out.println("Processing...");
}
@AroundInvoke
public Object TimerLog(InvocationContext ctx) throws Exception {
String beanClassName = ctx.getClass().getName();
String businessMethodName = ctx.getMethod().getName();
String target = beanClassName + "." + businessMethodName;
long startTime = System.currentTimeMillis();
System.out.println("Invoking " + target);
try {
return ctx.proceed();
} finally {
System.out.println("Exiting " + target);
long totalTime = System.currentTimeMillis() - startTime;
System.out.println("Business method " + businessMethodName + "in " + beanClassName + "takes "
+ totalTime + "ms to execute");
}
}
}
File: EmployeeServiceLocal.java
import javax.ejb.Local;
import javax.ejb.Remote;
@Local
public interface EmployeeServiceLocal{
public void doAction();
}
File: EmployeeServiceRemote.java
import javax.ejb.Remote;
@Remote
public interface EmployeeServiceRemote {
public void doAction();
}
File: jndi.properties
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=localhost:1099
File: Main.java
import javax.ejb.EJB;
import javax.naming.InitialContext;
public class Main {
public static void main(String[] a) throws Exception {
EmployeeServiceRemote service = null;
// Context compEnv = (Context) new InitialContext().lookup("java:comp/env");
// service = (HelloService)new InitialContext().lookup("java:comp/env/ejb/HelloService");
service = (EmployeeServiceRemote) new InitialContext().lookup("EmployeeBean/remote");
service.doAction();
}
}
Get Set Parameters In InvocationContext
File: EmployeeBean.java
import javax.ejb.Stateless;
import javax.interceptor.Interceptors;
@Stateless
@Interceptors( { MyInterceptor.class })
public class EmployeeBean implements EmployeeServiceLocal, EmployeeServiceRemote {
public EmployeeBean() {
}
public Long addBid(String userId,Long itemId,Double bidPrice) {
System.out.println("Bid for " + itemId + " received with price" + bidPrice);
return 0L;
}
}
File: EmployeeServiceLocal.java
import javax.ejb.Local;
import javax.jws.WebParam;
@Local
public interface EmployeeServiceLocal {
public Long addBid(String userId,Long itemId,Double bidPrice);
}
File: EmployeeServiceRemote.java
import javax.ejb.Remote;
@Remote
public interface EmployeeServiceRemote {
public Long addBid(String userId,Long itemId,Double bidPrice);
}
File: MyInterceptor.java
import javax.annotation.Resource;
import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;
public class MyInterceptor {
@Resource
private javax.ejb.SessionContext ctx;
@AroundInvoke
public Object checkUserRole(InvocationContext ic) throws Exception {
System.out.println("Interceptor invoked for " + ic.getMethod().getName());
if (ic.getMethod().getName().equals("addBid")
&& (((String) (ic.getContextData().get("MemberStatus"))).equals("Gold"))) {
Object[] params = ic.getParameters();
params[2] = new Double((Double) params[2] * 0.99);
System.out.println("DiscountVerifier Reducing Price by 1 percent");
ic.setParameters(params);
}
return ic.proceed();
}
}
File: Employee.java
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.PostRemove;
@Entity
public class Employee implements java.io.Serializable {
private int id;
private String firstName;
private String lastName;
@Id
@GeneratedValue
public int getId() {
return id;
}
@PostRemove
public void postRemove()
{
System.out.println("@PostRemove");
}
public void setId(int id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String first) {
this.firstName = first;
}
public String getLastName() {
return lastName;
}
public void setLastName(String last) {
this.lastName = last;
}
}
File: Main.java
import javax.ejb.EJB;
import javax.naming.InitialContext;
public class Main {
public static void main(String[] a) throws Exception {
EmployeeServiceRemote service = null;
// Context compEnv = (Context) new InitialContext().lookup("java:comp/env");
// service = (HelloService)new
// InitialContext().lookup("java:comp/env/ejb/HelloService");
service = (EmployeeServiceRemote) new InitialContext().lookup("EmployeeBean/remote");
service.addBid("userId",1L,0.1);
}
}
File: jndi.properties
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=localhost:1099
interceptor stateless
Mark Interceptors For A Remote Method
File: Employee.java
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.PostRemove;
@Entity
public class Employee implements java.io.Serializable {
private int id;
private String firstName;
private String lastName;
@Id
@GeneratedValue
public int getId() {
return id;
}
@PostRemove
public void postRemove()
{
System.out.println("@PostRemove");
}
public void setId(int id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String first) {
this.firstName = first;
}
public String getLastName() {
return lastName;
}
public void setLastName(String last) {
this.lastName = last;
}
}
File: EmployeeBean.java
import javax.ejb.Stateless;
import javax.interceptor.Interceptors;
@Stateless
@Interceptors( { MyInterceptor.class })
public class EmployeeBean implements EmployeeServiceLocal, EmployeeServiceRemote {
public EmployeeBean() {
}
@Interceptors(MyInterceptor.class)
public Long addBid(String userId,Long itemId,Double bidPrice) {
System.out.println("Bid for " + itemId + " received with price" + bidPrice);
return 0L;
}
}
File: EmployeeServiceLocal.java
import javax.ejb.Local;
import javax.jws.WebParam;
@Local
public interface EmployeeServiceLocal {
public Long addBid(String userId,Long itemId,Double bidPrice);
}
File: EmployeeServiceRemote.java
import javax.ejb.Remote;
@Remote
public interface EmployeeServiceRemote {
public Long addBid(String userId,Long itemId,Double bidPrice);
}
File: MyInterceptor.java
import javax.annotation.Resource;
import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;
public class MyInterceptor {
@Resource
private javax.ejb.SessionContext ctx;
@AroundInvoke
public Object checkUserRole(InvocationContext ic) throws Exception {
System.out.println("*** CheckPermission Interceptor invoked for " + ic.getTarget() + " ***");
if (!ctx.isCallerInRole("admin")) {
throw new SecurityException("User: "" + ctx.getCallerPrincipal().getName()
+ "" does not have permissions for method " + ic.getMethod());
}
return ic.proceed();
}
}
File: Main.java
import javax.ejb.EJB;
import javax.naming.InitialContext;
public class Main {
public static void main(String[] a) throws Exception {
EmployeeServiceRemote service = null;
// Context compEnv = (Context) new InitialContext().lookup("java:comp/env");
// service = (HelloService)new
// InitialContext().lookup("java:comp/env/ejb/HelloService");
service = (EmployeeServiceRemote) new InitialContext().lookup("EmployeeBean/remote");
service.addBid("userId",1L,0.1);
}
}
File: jndi.properties
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=localhost:1099
Use Interceptors To Check Permission
File: EmployeeBean.java
import javax.ejb.Stateless;
import javax.interceptor.Interceptors;
@Stateless
@Interceptors( { MyInterceptor.class })
public class EmployeeBean implements EmployeeServiceLocal, EmployeeServiceRemote {
public EmployeeBean() {
}
public Long addBid(String userId,Long itemId,Double bidPrice) {
System.out.println("Bid for " + itemId + " received with price" + bidPrice);
return 0L;
}
}
File: EmployeeServiceLocal.java
import javax.ejb.Local;
import javax.jws.WebParam;
@Local
public interface EmployeeServiceLocal {
public Long addBid(String userId,Long itemId,Double bidPrice);
}
File: EmployeeServiceRemote.java
import javax.ejb.Remote;
@Remote
public interface EmployeeServiceRemote {
public Long addBid(String userId,Long itemId,Double bidPrice);
}
File: MyInterceptor.java
import javax.annotation.Resource;
import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;
public class MyInterceptor {
@Resource
private javax.ejb.SessionContext ctx;
@AroundInvoke
public Object checkUserRole(InvocationContext ic) throws Exception {
System.out.println("*** CheckPermission Interceptor invoked for " + ic.getTarget() + " ***");
if (!ctx.isCallerInRole("admin")) {
throw new SecurityException("User: "" + ctx.getCallerPrincipal().getName()
+ "" does not have permissions for method " + ic.getMethod());
}
return ic.proceed();
}
}
File: Employee.java
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.PostRemove;
@Entity
public class Employee implements java.io.Serializable {
private int id;
private String firstName;
private String lastName;
@Id
@GeneratedValue
public int getId() {
return id;
}
@PostRemove
public void postRemove()
{
System.out.println("@PostRemove");
}
public void setId(int id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String first) {
this.firstName = first;
}
public String getLastName() {
return lastName;
}
public void setLastName(String last) {
this.lastName = last;
}
}
File: Main.java
import javax.ejb.EJB;
import javax.naming.InitialContext;
public class Main {
public static void main(String[] a) throws Exception {
EmployeeServiceRemote service = null;
// Context compEnv = (Context) new InitialContext().lookup("java:comp/env");
// service = (HelloService)new
// InitialContext().lookup("java:comp/env/ejb/HelloService");
service = (EmployeeServiceRemote) new InitialContext().lookup("EmployeeBean/remote");
service.addBid("userId",1L,0.1);
}
}
File: jndi.properties
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=localhost:1099