转到正文

宁静海

发现,理解,提升

存档

2012 年 1 月 的存档

 

心血来潮安装了SCSF把玩一下,在建工程的时候确报了error,相当的不爽,虽然不影响开发,但是着实让我研究了番到底为什么报错。google到一篇问同样问题的

Encoding issue on English-version Windows 7 with Chinese lanague installation

说实话,这个问题并不是因为英文环境,关键问题是在于VS2010在项目建立时默认使用Unicode,而非VS2008的ASCII,这就导致了导入SCSF模板时强制使用Unicode,所以问题是在SCSF的模板,而非VS2010,我直接回复了该帖。以下是我的解决方法原文。

 

This error occurred because the SCSF AssemblyInfo template is not saved with Unicode but ASCII. You can manually resolve this by modifying AssemblyInfo template files, these file are under following direction.
Windows 7
C:\Users\[username]\AppData\Local\Microsoft\VisualStudio\10.0\Extensions\Microsoft\Smart Client Software Factory 2010\3.0\Templates\Solutions\Projects\Infrastructure.CS\Properties\Assemblyinfo.cs.template
C:\Users\[username]\AppData\Local\Microsoft\VisualStudio\10.0\Extensions\Microsoft\Smart Client Software Factory 2010\3.0\Templates\Solutions\Projects\Module.CS\Properties\Assemblyinfo.cs.template

For I just find two errors when create the SCSF project, so I just modify these two from ASCII to UTF-8, if you still got the errors in your project, try modify other template file. After the modification, I re-create the project the error never appear again. Hope this is working for other people who google the same issue to here.
These issue work for non-unicode development environment.

 

 

 

Function ClickMenuButtonByNum(menuBarH, buttonNum)
    menuButtonBounds = menuBarH.Object.VisibleLinks.Item(buttonNum).Bounds
    boundsArray = Split(menuButtonBounds, ",")
    boundsXArray = Split(boundsArray(0), "=")
    iX = boundsXArray(1)
    boundsYArray = Split(boundsArray(1), "=")
    iY = boundsYArray(1)
    menuBarH.Click iX, iY
End Function

Function ClickMenuButtonByName(menuBarH, buttonName)
    buttonCount =  menuBarH.Object.VisibleLinks.Count
    For i = 0 to buttonCount - 1
        Set buttonItem = menuBarH.Object.VisibleLinks.Item(i)
        If buttonItem.Caption = buttonName Then
            menuButtonBounds = buttonItem.Bounds
            boundsArray = Split(menuButtonBounds, ",")
            boundsXArray = Split(boundsArray(0), "=")
            iX = boundsXArray(1)
            boundsYArray = Split(boundsArray(1), "=")
            iY = boundsYArray(1)
            menuBarH.Click iX, iY
        End If
    Next
End Function

 

 

Public Function SelectSectionByName(groupControlH, sectionName)
    groupCount = groupControlH.Object.Groups.Count
    For i = 0 to groupCount - 1
    Set currentGroup = groupControlH.Object.Groups.Item(i)
    groupName = currentGroup.Caption
    If groupName = sectionName Then
        groupControlH.Object.ActiveGroupName = currentGroup.Name
    End If
Next End Function

 

1、目前的QTP常用版本为10,增强组建已经附带在DVD中。

2、Add-IN和Add-IN SDK是两个不同的概念,Add-IN提供特别语言的支持,Add-IN SDK提供可自定义组建映射的开发。

3、安装Add-IN SDK的路径在DVD光盘的 X:\Add-in Extensibility SDKs\ 目录下。可按需求单独安装。

4、Add-IN SDK需要用VS开发,支持的VS版本为VS2003、VS2005、VS2008。VS2010会提示不支持,无法继续安装。

5、关于VS2008集成后,新建项目无法找到QuickTestCustomServer,这是由于VS2008多语言版本造成的,参考。该参考的源头无法考证,英语版本的部分是来自于SDK的开发文档的安装部分(大概29页的样子)。而非英语版本的插件安装方式可能参考了其他类似插见的解决方案。

具体解决方案:

VS的项目模板根据语言不同,将由于模板的安装默认会安装入英文版本的语言目录。

C:\Program Files\Microsoft Virtual Studio 9.0\Common7\IDE\ProjectTemplates\CSharp\Windows\1033\QuickTestCustomServerVB.zip

在这里1033是语言编号,是Windows规范,称为Local ID。中文就是2052,所以我们要做的就是把1033中的插件拷贝进2052中,并重新注册。

C:\Program Files\Microsoft Virtual Studio 9.0\Common7\IDE\ProjectTemplates\CSharp\Windows\2052\QuickTestCustomServerVB.zip

注意,如果是VB语言扩展,需要拷贝

C:\Program Files\Microsoft Virtual Studio 9.0\Common7\IDE\ProjectTemplates\VisualBasic\Windows\1033\QuickTestCustomServerVB.zip

C:\Program Files\Microsoft Virtual Studio 9.0\Common7\IDE\ProjectTemplates\VisualBasic\Windows\2052\QuickTestCustomServerVB.zip

光拷贝是不够的,VS中还是不会显示,需要进行模板的载入。

直接执行

C:\Program Files\Microsoft Virtual Studio 9.0\Common7\IDE

该Sample为用JMS直接访问MQ的简单例子,其中牵涉3个最基本的JMS模型,Producer/Consumer/Browser,因为在该Sample中Browser作用更像是个Monitor,所以类名使用的是Monitor。

注意一点,该Sample连接方式使用的是Bind方式,该方式将会自动连接本地的MQ服务器,如果改成Client,除非连接远程客户机,并且有正确的用户设置方式,不然即使host写成本地IP,依然会抛 2035 (MQRC_NOT_AUTHORIZED) 错误。

Prducer

 

package jms.direct;

import javax.jms.Connection;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;

import com.ibm.msg.client.jms.JmsConnectionFactory;
import com.ibm.msg.client.jms.JmsFactoryFactory;
import com.ibm.msg.client.wmq.WMQConstants;

public class JMSProducer {
	
	private String MQ_HOST = "localhost";
	private int MQ_PORT = 1416;
	private String MQ_CHANNEL = "";
	private String MQ_QUEUEMANAGER_NAME = "MW_QM";
	private String MQ_QUEUE_NAME = "MW_QUEUE";

	private JmsFactoryFactory jff = null;
	private JmsConnectionFactory jcf = null;
	private Connection connection = null;
	private Session session = null;
	private Queue queue = null;
	private MessageProducer producer = null;
	private Message msg = null;

	public JMSProducer() {
		try {
			// Create a connection factory
			jff = JmsFactoryFactory.getInstance(WMQConstants.WMQ_PROVIDER);
			jcf = jff.createConnectionFactory();
			// Set the properties
//			jcf.setStringProperty(WMQConstants.WMQ_HOST_NAME, MQ_HOST);
//			jcf.setIntProperty(WMQConstants.WMQ_PORT, MQ_PORT);
//			jcf.setStringProperty(WMQConstants.WMQ_CHANNEL, MQ_CHANNEL);
//			jcf.setStringProperty(WMQConstants.USERID, "");
//			jcf.setStringProperty(WMQConstants.PASSWORD, "");
//			jcf.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_CLIENT);
			jcf.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_BINDINGS);
			jcf.setStringProperty(WMQConstants.WMQ_QUEUE_MANAGER, MQ_QUEUEMANAGER_NAME);

			// Create JMS objects
			connection = jcf.createConnection();
			session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

			queue = session.createQueue(MQ_QUEUE_NAME);
			producer = session.createProducer(queue);
			
			connection.start();
		} catch (JMSException e) {
			e.printStackTrace();
		}
	}
	
	public void sendMsg(String msgStr, String msgId) {
		try {
			msg = session.createMessage();
			msg.setStringProperty("STRMSG", msgStr);
			msg.setJMSCorrelationID(msgId);
			producer.send(msg);
		} catch (JMSException e) {
			e.printStackTrace();
		}
		System.out.println("-------------");
		System.out.println("Message send complete!");
		System.out.println("MessageId: " + msgId);
		System.out.println("Message: " + msgStr);
	}
	
	public void close() throws JMSException {
		producer.close();
		session.close();
		connection.close();
    }

	public static void main(String[] args) {
		try {
			System.out.println("Starting ...");
			JMSProducer producer = new JMSProducer();
			producer.sendMsg("Hello1", "000000001");
			producer.sendMsg("Hello2", "000000002");
			producer.sendMsg("Hello3", "000000003");
			producer.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

 

Consumer

 

package jms.direct;

import javax.jms.Connection;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.Queue;
import javax.jms.Session;

import com.ibm.msg.client.jms.JmsConnectionFactory;
import com.ibm.msg.client.jms.JmsFactoryFactory;
import com.ibm.msg.client.wmq.WMQConstants;

public class JMSConsumer {
	private String MQ_QUEUEMANAGER_NAME = "MW_QM";
	private String MQ_QUEUE_NAME = "MW_QUEUE";

	private JmsFactoryFactory jff = null;
	private JmsConnectionFactory jcf = null;
	private Connection connection = null;
	private Session session = null;
	private Queue queue = null;
	private MessageConsumer consumer = null;
	private Message msg = null;

	public JMSConsumer() {
		try {
			// Create a connection factory
			jff = JmsFactoryFactory.getInstance(WMQConstants.WMQ_PROVIDER);
			jcf = jff.createConnectionFactory();
			// Set the properties
			jcf.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_BINDINGS);
			jcf.setStringProperty(WMQConstants.WMQ_QUEUE_MANAGER, MQ_QUEUEMANAGER_NAME);

			// Create JMS objects
			connection = jcf.createConnection();
			session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

			queue = session.createQueue(MQ_QUEUE_NAME);
			consumer = session.createConsumer(queue);
			
			connection.start();
		} catch (JMSException e) {
			e.printStackTrace();
		}
	}
	
	public void consume() {
		try {
			msg = consumer.receive();
			
			String msgId = msg.getJMSCorrelationID();
			String msgStr = msg.getStringProperty("STRMSG");
			
			System.out.println("-------------");
			System.out.println("Message received!");
			System.out.println("MessageId: " + msgId);
			System.out.println("Message: " + msgStr);
		} catch (JMSException e) {
			e.printStackTrace();
		}
	}
	
	public void close() throws JMSException {
		consumer.close();
		session.close();
		connection.close();
    }
	
	public static void main(String[] args) {
		try {
			System.out.println("Receiving ...");
			JMSConsumer receiver = new JMSConsumer();
			receiver.consume();
			receiver.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 

Browser

 

package jms.direct;

import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;

import javax.jms.Connection;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Queue;
import javax.jms.QueueBrowser;
import javax.jms.Session;

import com.ibm.msg.client.jms.JmsConnectionFactory;
import com.ibm.msg.client.jms.JmsFactoryFactory;
import com.ibm.msg.client.wmq.WMQConstants;

public class JMSMonitor {
private String MQ_QUEUEMANAGER_NAME = "MW_QM";
private String MQ_QUEUE_NAME = "MW_QUEUE";

private JmsFactoryFactory jff = null;
private JmsConnectionFactory jcf = null;
private Connection connection = null;
private Session session = null;
private Queue queue = null;
private QueueBrowser monitor = null;
private Message msg = null;
private List<string> msgIdList = null;

public void initMsgIdList() {
msgIdList = new ArrayList<string>();
msgIdList.add("000000001");
msgIdList.add("000000002");
msgIdList.add("000000003"); } public JMSMonitor() {
initMsgIdList();
try {
// Create a connection factory
jff = JmsFactoryFactory.getInstance(WMQConstants.WMQ_PROVIDER);
jcf = jff.createConnectionFactory();
// Set the properties
jcf.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_BINDINGS);
jcf.setStringProperty(WMQConstants.WMQ_QUEUE_MANAGER, MQ_QUEUEMANAGER_NAME);
// Create JMS objects
connection = jcf.createConnection();
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
queue = session.createQueue(MQ_QUEUE_NAME);
monitor = session.createBrowser(queue);
connection.start();
} catch (JMSException e) {
e.printStackTrace();
}
}

public void startMonitor() {
while (true) {
if (msgIdList.size() > 0) {
try {
Enumeration<message> msgs = monitor.getEnumeration();
List<string> remainMsgIdList = new ArrayList<string>();
while (msgs.hasMoreElements()) {
Message msg = msgs.nextElement();
String msgId = msg.getJMSCorrelationID();
if (msgIdList.contains(msgId)) {
remainMsgIdList.add(msgId);
System.out.println("Message ID [" + msgId + "] found, this message still not be consumed!");
} else if (!msgIdList.contains(msgId)) {
System.out.println("Message ID [" + msgId + "] is not be recorded by the sender yet, just ignnore it.");
}
}
msgIdList = remainMsgIdList;
// All message scan complete.
if (msgIdList.size() > 0) {
System.out.println("------------------------------");
System.out.println("Following Msg not be consumed!");
System.out.println("------------------------------");
for (String msgId : msgIdList) {
System.out.println(msgId);
}
} else {
System.out.println("No message record in the data base.");
// The sample end here, for the list will not be added
// again.
}
} catch (JMSException e) {
e.printStackTrace();
}
}
synchronized (this) {
try {
this.wait(5000);
} catch (InterruptedException ie) {
ie.printStackTrace();
}
}