cxf源码
‘壹’ Mule ESB使用了中文,则返回乱码,怎么解决
解决这个问题有两种方案:
1. 改变jvm的默认字符编码。
2. 修改CxfInboundMessageProcessor类的源代码。
第一种方案通过修改服务器的启动参数,追加一段“-Dfile.encoding=UTF-8”,就可以改变服务器的java运行环境。
此时启动服务器时会发现,虽然WSDL中文不再出现乱码了,但是服务器控制台显示的中文 却全都成了乱码 。wsdl 是否出现乱码依赖于运行服务器的默认字符集,对于OECP平台来说是不可控的。OECP平台使用什么样的字符编码应该依赖于应用自己的配置。
修改mule 的源代码,CxfInboundMessageProcessor这个类,在升级的过程中没有改动,不然就要反编译来获取源码了。
将201行的msg = out.toString();修改为如下代码:
java 代码
String enc = event.getMuleContext().getConfiguration().getDefaultEncoding(); msg = out.toString(enc);
从mule 的配置中得到配置的编码格式,并在将Stream转换为String的时候指定使用此编码格式.至此问题解决了.
‘贰’ java调用webservice例子
现在大多数项目都会用到spring,所以选择 CXF 框架,cxf能很好的和spring结合
在官网下载最新版 xcf 3.0.3 网站 http://cxf.apache.org/
MyEclipse项目结构图
结构图中各个文件源码
HelloWorldImpl.java
---------
import javax.jws.WebService;
@WebService(endpointInterface = "IHelloWorld", serviceName = "HelloWorld")
public class HelloWorldImpl implements IHelloWorld {
@Override
public String sayHello(String text) {
return "serviceSay: " + text;
}
}
------------------------------------------------------------------------------------------------
IHelloWorld.java
---------
import javax.jws.WebService;
@WebService
public interface IHelloWorld {
public String sayHello(String text);
}
------------------------------------------------------------------------------------------------
Test.java
---------
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.endpoint.dynamic.DynamicClientFactory;
public class Test {
public static void main(String[] args) throws Exception {
DynamicClientFactory dcf = DynamicClientFactory.newInstance();
Client c = dcf.createClient("http://localhost:8080/cxf/ws/hwUrl?wsdl");
Object[] param = new Object[] { "----test....." };
Object[] result = c.invoke("sayHello", param);
System.out.println(result[0].toString());
}
}
------------------------------------------------------------------------------------------------
cxf-servlet.xml
-----------------
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:soap="http://cxf.apache.org/bindings/soap"
xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/bindings/soap http://cxf.apache.org/schemas/configuration/soap.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
<jaxws:server id="hwService" serviceClass="IHelloWorld"
address="/hwUrl">
<jaxws:serviceBean>
<bean class="HelloWorldImpl" />
</jaxws:serviceBean>
</jaxws:server>
</beans>
------------------------------------------------------------------------------------------------
web.xml
---------
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>cxfS</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>cxfS</servlet-name>
<url-pattern>/ws/*</url-pattern>
</servlet-mapping>
</web-app>
------------------------------------------------------------------------------------------------
部署项目,然后运行Test.java
在浏览器里面输入http://localhost:8080/cxf/ws/hwUrl?wsdl 可查看webservice服务接口信息
‘叁’ 记一次生产系统每隔10小时(36000000毫秒)固定进行一次Full GC排查思路
在生产环境中,应用每10小时固定触发一次Full GC操作。然而,系统监控数据显示,应用业务量不大且常规情况下不应触发Full GC,直觉告诉我这可能由定时任务引起,但未发现相关业务代码。
深入排查后,注意到Java中的`Daemon`类,发现其继承自`Thread`类并调用`System.gc()`方法。通过测试环境验证,应用中确有名为`GC Daemon`的守护线程在运行。
源码解析显示,`LogUtils`类加载时,通过静态代码块调用`JDKBugHacks.doHacks()`方法。此方法根据`org.apache.cxf.JDKBugHacks.gcRequestLatency`系统环境变量,决定是否执行`sun.misc.GC.requestLatency`方法。初始化时,若未设置该变量,默认执行逻辑,创建`GC Daemon`守护线程。
为解决固定Full GC问题,需在项目启动脚本中添加代码跳过创建守护线程的逻辑,避免不必要的Full GC触发,提升应用性能。