`

远程调用 HttpInvoker JSP工程之间的数据交互

阅读更多

在这里我所实现的一个功能是点击一个按钮需要将PCS工程的数据传递到PIS然后交由其对数据进行更新操作。

1、PIS上的相关配置与文件   (服务器端)

web.xml  里添加下述相关内容

 <!--与PCS工程交互的配置 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:/META-INF/**/spring-*.xml,classpath*:/META-INF/**/remote-servlet.xml</param-value>
    </context-param>
    <!-- spring 加载监视器 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <listener>
        <listener-class>com.yihaodian.pis.webapp.listener.AppRequestListener</listener-class>
    </listener>
 <servlet>
	<servlet-name>remote</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
	<servlet-name>remote</servlet-name>
	<url-pattern>/remoting/*</url-pattern>
</servlet-mapping>
<!-- 另一个工程的配置-->
 <servlet>
        <description>HTTP Exporters</description>
        <servlet-name>services</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>2</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>services</servlet-name>
        <url-pattern>/services/*</url-pattern>
    </servlet-mapping>

 remote-servlet.xml  的内容           将PIS的BEAN暴露给PCS然PCS对其进行调用

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
   <bean id="rmiService" class="com.yihaodian.pis.service.testremoteinvoke.IRemoteServiceImpl"></bean>
    <bean class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter" name="/remoteService">
        <property name="service" ref="rmiService" />
        <property name="serviceInterface" value="com.yihaodian.pis.service.testremoteinvoke.IRemoteService"/>
    </bean>
</beans>
 

接口以及其实现类(有PCS对其实现类的方法进行调用)

实现类IRemoteServiceImpl。java:

package com.yihaodian.pis.service.testremoteinvoke;

import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.apache.struts2.ServletActionContext;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.newheight.service.webservice.dto.BackOperator;
import com.yihaodian.pis.dto.ProductHistoryDTO;
import com.yihaodian.pis.dto.TaskDto;
import com.yihaodian.pis.service.TaskService;

public class IRemoteServiceImpl implements IRemoteService {
	private static final Logger logger = Logger
			.getLogger(IRemoteServiceImpl.class);

	public String getString(String msg) {
		String str = "正在请求调用。。。远程服务调用成功" + msg;
		return str;
	}

	public String getProduct(String siteid, String productCode) {
		ApplicationContext context = new ClassPathXmlApplicationContext(
				new String[] { "classpath*:/META-INF/**/spring-*.xml" });
		TaskService taskSvc = (TaskService) context.getBean("taskSvc");
		//当数据很多时就会出现数组指数出界
		String[] site = siteid.split(",");
		String[] productCodes = productCode.split(",");
		int len = site.length;
		Integer[] taskIds = new Integer[len];
		for (int i = 0; i < len; i++) {
			TaskDto taskDto = new TaskDto();
			String codes = productCodes[i];
			if (null != codes && !"".equals(codes)) {
				codes = StringUtils.replace(codes, "\r\n",
						System.getProperty("line.separator"));
				taskDto.setProductCodes(codes);
			}
			taskDto.setRunStatus(TaskDto.RunStatus.BEGIN.ordinal());
			taskDto.setProcessStatus(TaskDto.ProcessStatus.WAIT.ordinal());
			// 获取已登录用户的信息
			// Long userId = ((BackOperator) ServletActionContext.getRequest()
			// .getSession().getAttribute("admin")).getId();
			Long userId = (long) 6660;
			taskDto.setUserId(userId);
			taskDto.setStartTime(new Date());
			taskDto.setName("PCS比价运行第" + (i + 1) + "任务");
			taskDto.setDescription("PCS抓价任务");
			taskDto.setType(2);
			taskDto.setSiteId(Integer.parseInt(site[i]));
			taskDto.setTaskId(taskSvc.addTask(taskDto));
			taskIds[i] = taskDto.getTaskId();

			try {
				taskSvc.batchFetchProductPrice(taskDto.getTaskId());
			} catch (Exception e) {
				logger.error("批量抓价出错:", e);
			}
		}
		// 在此处检查任务的完成情况。
		int allTime =0;
		int doneTask = 0;
		for (int i = 0; i < len; i++) {
			boolean index = true;
			while (index) {
				TaskDto task = taskSvc.getTaskById(taskIds[i]);
				if (task.getRunStatus() == 4) {
					logger.info("任务" + taskIds[i] + "已经完成!");
					taskSvc.persistPriceJob(taskIds[i]);
					doneTask++;
					index = false;
				} else {
					if(allTime<60){//超时
					allTime =allTime + 5;
					sleep(10000);//睡眠一段时间后继续检查看是否完成任务
					}else break;
				}
			}
		}
		if(doneTask<len)
			return "未能正常完成更新,可能有以下几个原因,1、当前任务太多,出现任务超时,2、PIS爬虫不够,3、系统异常";
		else
			return "恭喜,圆满完成任务!";
	}

	public void sleep(long ms) {
		try {
			Thread.sleep(ms);
		} catch (InterruptedException ex) {
			ex.printStackTrace(System.out);
		}
	}

	public static Logger getLogger() {
		return logger;
	}
}

 2、PCS工程的相关文件与配置

接口类IRemoteService。java

package com.yihaodian.pis.service.testremoteinvoke;

import java.util.List;

import com.yihaodian.pcs.dto.ProductHistoryDTO;

public interface IRemoteService {
	public String getString(String msg);
	public String getProduct(String siteid,String productCode);
}
 

在SPING里新建一个用来调用方法的BEAN 

<!-- 向旗添加PCS与PIS数据交互     -->
<bean id="remoteService" class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean"> 
        <property name="serviceUrl" value="http://127.0.0.1:8080/pis1.2/remoting/remoteService"/> 
        <property name="serviceInterface" value="com.yihaodian.pis.service.testremoteinvoke.IRemoteService"/> 
    </bean> 

 以上VALUE属性与PIS的IP和WEB.XML里的配置有关,另外如果一台电脑无法运行两个工程,可以更改服务器的端口号。

在这里我将PCS的端口号改为8880,直接能够在TOMCAT上运行。

然后再ACTION得到上述的BEAN对象对接口映射到PIS的方法进行调用

ApplicationContext beanAccontext = WebApplicationContextUtils
		.getRequiredWebApplicationContext(ServletActionContext
				.getServletContext());
		IRemoteService reService = (IRemoteService) beanAccontext.getBean("remoteService");
		//以下为返回的结果。
		String mString= "";
		try {
			mString= reService.getProduct(siteAll,proCodeAll);
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		logger.info(mString);

 

不懂的联系QQ526151410

 

 

 

分享到:
评论

相关推荐

    中间件技术与概念课件

    RMI是Java中远程方法调用的机制,允许对象在不同的Java虚拟机(JVM)之间进行交互。RMI包含两部分:客户端的invoker和服务器端的implementor。通过RMI,开发者可以创建分布式系统,使得服务器上的对象如同本地对象...

    DWR简单配置说明---xml、java、jsp层层说明

    DWR不仅提供了远程调用的功能,还内置了一些辅助功能,例如数据序列化和安全性检查等。本文档将详细解释如何在Web应用中配置DWR,并通过具体的示例来展示每个步骤。 #### 二、所需环境与文件 为了能够顺利地使用...

    JavaScript调用java方法——dwr步骤.docx

    ### JavaScript调用Java方法——DWR使用步骤详解 #### 一、DWR简介 DWR (Direct Web Remoting) 是一种使服务器端的Java对象能够被客户端...DWR的使用不仅限于此,还可以实现更复杂的数据交互功能,如数据推送等。

    通过DWR实现在HTML和Java Script中直接调用服务端的Java Bean

    在现代Web应用开发中,实现客户端(HTML/JavaScript)与服务器端(JavaBean)之间的交互是一个常见的需求。传统的解决方案通常依赖于JSP页面作为中间层来转发请求和响应,但这会增加额外的复杂性和维护难度。为了...

    一个简单的Ajax例子

    它通过在后台与服务器交换数据并局部更新页面,为用户提供更加流畅的交互体验。Ajax的核心是利用JavaScript来实现异步通信,即XMLHttpRequest对象,该对象允许浏览器在不刷新页面的情况下向服务器发送请求并接收响应...

    java开源包1

    它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准 OAuth OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式...

    spring-web.jar spring-webmvc.jar

    2. **HTTP处理**:包括`HttpInvoker`和`Remoting`支持,用于远程方法调用,使得服务可以通过HTTP协议进行通信。 3. **MIME类型解析**:`MultipartResolver`接口处理多部分(multipart)HTTP请求,如上传文件。 4. **...

    华迪软件比赛

    15. Spring框架提供了对各种远程访问技术的集成支持,比如RMI、Hessian、HTTP Invoker等,通过普通的POJO实现远程服务。 16. Spring远程支持不仅涵盖AOP技术,还涉及其他远程调用技术,如Web服务等。 17. 删除EJB...

    DWR基础教程及配置.doc

    DWR(Direct Web Remoting)是一个开源Java库,它允许Web应用程序在客户端JavaScript和服务器端Java之间进行实时通信,从而实现Ajax功能。DWR简化了异步数据交换,使得开发者可以在不刷新整个网页的情况下更新页面的...

    DWR的介绍以及使用范例.还有使用DWR的相关配置

    DWR的核心特性是将Java类动态转换成JavaScript,这样JavaScript就可以在客户端进行远程过程调用(RPC),从而实现数据的异步交换。 DWR由两大部分组成: 1. 服务器端的Java Servlet:这个Servlet处理来自浏览器的...

    Spring in action

    - **远程调用**:Spring支持多种远程调用协议,如RMI、HTTP invoker等,便于实现服务间的通信。 - **企业服务访问**:Spring还支持访问其他企业服务,如JMS消息服务、邮件发送等功能。 #### 六、Spring框架在网络层...

    【软件工程】DWR入门教程.docx

    DWR 会自动处理与服务器的通信,将 JavaScript 调用转化为 HTTP 请求,再将服务器的响应转换回 JavaScript 可以理解的数据。 ### 注意事项 - 避免在 JavaScript 中使用与关键字冲突的函数或变量名。 - 不支持 ...

    Spring.in.Action.2nd.Edition.Aug.2007.pdf

    - Spring支持多种远程服务调用方式,如RMI、HTTP Invoker等。 - 通过Spring的远程调用支持,可以轻松实现分布式系统中的服务交互。 #### 三、Spring框架的学习与实践建议 - **理解基础概念**:首先,需要深入...

    软件工程DWR入门教程.docx

    总结,DWR是一个强大的工具,能够简化Ajax开发,使得开发者能够方便地在客户端和服务器之间交换数据。通过以上步骤,你应该对DWR有了初步的了解,接下来可以深入学习其高级特性,如批处理、安全性设置、错误处理等,...

    java开源包11

    它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准 OAuth OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式...

    java开源包2

    它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准 OAuth OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式...

    java开源包3

    它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准 OAuth OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式...

    java开源包6

    它是 Spring HttpInvoker的一个轻量级选择,特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准 OAuth OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式...

Global site tag (gtag.js) - Google Analytics