Thursday, January 9, 2014

Sample on Accessing the Web Service Context

JAX-WS Sample
==============
package temp;

import javax.jws.*;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.handler.MessageContext;
import javax.servlet.http.HttpServletRequest;
import javax.annotation.Resource;
import javax.xml.ws.BindingType;
import javax.xml.ws.soap.SOAPBinding;

public class MyWS {

@Resource(name="wsContext")
private WebServiceContext wsContext;

public String hello() {
String reqInfo = getRequestInfo();
return reqInfo;
}

private String getRequestInfo() {
return ((HttpServletRequest)(wsContext.getMessageContext().get(MessageContext.SERVLET_REQUEST))).getRemoteAddr();
}
}
JAX-RPC Sample
=================
package test;

import javax.jws.*;
import javax.xml.rpc.handler.MessageContext;
import javax.xml.rpc.server.ServletEndpointContext;
import javax.xml.rpc.ServiceException;
import weblogic.wsee.message.WlMessageContext;
import weblogic.wsee.connection.Connection;
import weblogic.wsee.connection.transport.Transport;
import weblogic.wsee.connection.transport.servlet.HttpServerTransport;
import javax.xml.rpc.server.ServiceLifecycle;

import weblogic.webservice.context.*;
public class ServiceImpl implements ServiceLifecycle{

private WebServiceContext wsContext;
private ServletEndpointContext wsctx = null;

public void init(Object context) throws ServiceException {
System.out.println("ServletEndpointContext inited...");
wsctx = (ServletEndpointContext)context;
}
public String getRemoteAddress() {
WlMessageContext msgCtx = (WlMessageContext)wsctx.getMessageContext();
Connection conn = msgCtx.getDispatcher().getConnection();
Transport transport = conn.getTransport();

if (transport instanceof HttpServerTransport) {
return ((HttpServerTransport)transport).getRequest().getRemoteAddr();
}
else {
return null;
}
}

public void destroy() {}
public String helloWorld(){
String reqInfo = getRemoteAddress();
return "Hi";
}
}

Sample on Accessing the Web Service Context

JAX-WS Sample
==============
package temp;

import javax.jws.*;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.handler.MessageContext;
import javax.servlet.http.HttpServletRequest;
import javax.annotation.Resource;
import javax.xml.ws.BindingType;
import javax.xml.ws.soap.SOAPBinding;

public class MyWS {

@Resource(name="wsContext")
private WebServiceContext wsContext;

public String hello() {
String reqInfo = getRequestInfo();
return reqInfo;
}

private String getRequestInfo() {
return ((HttpServletRequest)(wsContext.getMessageContext().get(MessageContext.SERVLET_REQUEST))).getRemoteAddr();
}
}
JAX-RPC Sample
=================
package test;

import javax.jws.*;
import javax.xml.rpc.handler.MessageContext;
import javax.xml.rpc.server.ServletEndpointContext;
import javax.xml.rpc.ServiceException;
import weblogic.wsee.message.WlMessageContext;
import weblogic.wsee.connection.Connection;
import weblogic.wsee.connection.transport.Transport;
import weblogic.wsee.connection.transport.servlet.HttpServerTransport;
import javax.xml.rpc.server.ServiceLifecycle;

import weblogic.webservice.context.*;
public class ServiceImpl implements ServiceLifecycle{

private WebServiceContext wsContext;
private ServletEndpointContext wsctx = null;

public void init(Object context) throws ServiceException {
System.out.println("ServletEndpointContext inited...");
wsctx = (ServletEndpointContext)context;
}
public String getRemoteAddress() {
WlMessageContext msgCtx = (WlMessageContext)wsctx.getMessageContext();
Connection conn = msgCtx.getDispatcher().getConnection();
Transport transport = conn.getTransport();

if (transport instanceof HttpServerTransport) {
return ((HttpServerTransport)transport).getRequest().getRemoteAddr();
}
else {
return null;
}
}

public void destroy() {}
public String helloWorld(){
String reqInfo = getRemoteAddress();
return "Hi";
}
}

Weblogic Web service Debug flags

For advance debug logging in webservice, you can enable debugs on Weblgic webservice by adding the following -D flags to your server startup script, then restart Weblogic server: 
  • Security related:
    -Dweblogic.wsee.security.verbose=true
    -Dweblogic.wsee.security.debug=true
    -Dweblogic.debug.DebugSecurityCredMap=true
  • Crypto related:

    -Dweblogic.xml.crypto.encrypt.verbose=true
    -Dweblogic.xml.crypto.dsig.debug=true
    -Dweblogic.xml.crypto.dsig.verbose=true
    -Dweblogic.xml.crypto.wss.debug=true
    -Dweblogic.xml.crypto.wss.verbose=true
    -Dweblogic.xml.crypto.keyinfo.debug=true
    -Dweblogic.xml.crypto.keyinfo.verbose=true
    -Dweblogic.xml.crypto.dsig.debug=true
    -Dweblogic.xml.crypto.dsig.verbose=true
    -Dweblogic.xml.crypto.encrypt.debug=true
    -Dweblogic.xml.crypto.encrypt.verbose=true
  • SAML related:

    -Dweblogic.debug.DebugSecuritySAMLService=true
    -Dweblogic.debug.DebugSecuritySAMLCredMap=true
    -Dweblogic.debug.DebugSecuritySAMLAtn=true
    -Dweblogic.debug.DebugSecuritySAMLLib=true
    -Dweblogic.debug.DebugSecuritySAML2Service=true
    -Dweblogic.debug.DebugSecuritySAML2CredMap=true
    -Dweblogic.debug.DebugSecuritySAML2Atn=true
    -Dweblogic.debug.DebugSecuritySAML2Lib=true
  • General:

    -Dweblogic.log.StdoutSeverity=Debug
    -Dweblogic.wsee.verbose=weblogic.wsee.conversation.*, weblogic.wsee.callback.*
    -Dweblogic.webservice.verbose=true
    -Dweblogic.wsee.debug=*
    -Dweblogic.wsee.verbose.timestamp=true
For logging of http request and response with Metro webservice, add the following to your server startup script, and restart Weblogic Server:
  • General:
    com.sun.xml.ws.transport.http.client.HttpTransportPipe.dump=true
You can selectively enable the relevant debug flags, as needed.  By default, all logging goes to the WLS server log.
Note:  You can add more verbose debugging from individual subsystem in webservice using -Dweblogic.wsee.verbose by listing the subsystems in comma-separated list, as shown above. Alternatively, you can use use -Dweblogic.wsee.verbose=* to output all the debug logging.

Weblogic Classloader Debug Flags

Here's the list of Weblogic Server Classloader Debug flags that can be set in the start up scripts of weblogic server. 
-Dweblogic.utils.classloaders.GenericClassLoader.Verbose=true
-Dweblogic.utils.classloaders.ChangeAwareClassLoader.Verbose=true
-Dweblogic.utils.classloaders.ClasspathClassFinder=true
-Dweblogic.utils.classloaders.DefaultFilteringClassLoader.Verbose=true
-Dweblogic.utils.classloaders.FilteringClassLoader.Verbose=true
-Dweblogic.utils.classloaders.FilteringClassLoader.ResourceDump=true
-Dweblogic.utils.classloaders.URLClassFinder.Verbose=true

Different ways to take thread dumps in WebLogic Server

Different ways to take thread dumps in WebLogic Server

WebLogic Server (WLS) and Java offer several ways to generate thread dumps, they are detailed below.  It is always recommended to obtain the thread dumps by using operating system (OS) commands rather than by using Java classes or the Administration Console, because if the console is hanging, users won't be able to connect to it to issue thread dumps.
  1. Use operating system commands to get the thread dumps when WLS starts up from a command-line script:
    • On Windows OSes, thread dumps can be created by
      + -- the thread dumps are generated in the server stdout
    • On POSIX-compliant platforms (e.g. Solaris and Linux), first identify the process ID (pid) usingps -ef | grep java, then run
      kill -3 2>&1
      Signal 3 is equivalent to SIGQUIT. Note that in Solaris, the thread dump is generated in the current shell, but in Linux, the thread dump is generated in the shell which started the java process specified by the pid.
  2. Using beasvc (up to WLS 10.3.5 included):
    beasvc -dump -svcname:
    • service_name is the Windows service that is running the server instance (e.g. mydomain_myserver)
  3. Using wlsve (from 10.3.6/12.1.1):
    wlsve -dump -svcname:
  4. Using weblogic.WLST:
    setDomain.cmd or setDomain.sh depending on the OS
    java weblogic.WLST
    connect("","","t3://:")
    threadDump()
    The thread dump will be generated in Thread_Dump_AdminServer.txt.  Note 1274713.1 addresses WLST thread dump in more details with examples on how to define sleep time between each dump and number of dumps to take.
  5. From a command line or shell, a thread dump can be generated via the following command (deprecated from WLS 9.0):
    setDomain.cmd or setDomain.sh depending on the OS
    java weblogic.Admin : -username -password THREAD_DUMP
    The thread dump will be generated in the defined server stdout.
  6. From the WLS Administration Console, a thread dump can be created by navigating to Server -> -> Monitoring -> Dump threads stack. This method could lead to truncated or incomplete thread dumps.
  7. From the Services Administration Tools when WLS runs as a Windows Service, see Note 1348645.1
  8. Java VisualVM can also be used to take thread dumps while applications are running, see http://docs.oracle.com/javase/6/docs/technotes/guides/visualvm/applications_local.html for more details
  9. With jstack
    jstack or jstack -l to print additional information about locks
  10. From the JRockit command line:
    jrcmd print_threads