论坛首页 Java企业应用论坛

mina 实现与memcached 连接工具

浏览 5435 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (1)
作者 正文
   发表时间:2010-02-24  
前段时间学习了mina框架.就确定写一个小实例玩一下.
看到不少开源第三方的memcached连接工具(xmemcached),都采用NIO方式.
于是就有了一个想法用mina作为底层NIO框架与memcached连接.
希望能给学习Mina的新人帮助.
能力有限项目还没有很好完善.不过基本的相关操作已实现.
如果大家有兴趣和我一起完善这个项目,请站内信联络.
源码(svn):
http://asksite.googlecode.com/svn/trunk/minamemcahed

测试类及相关API调用
public class CacheTest {

	static MinaConnect mc = null;

	static LinkedList<CacheFilter> filterList = new LinkedList<CacheFilter>();

	@BeforeClass
	public static void init() {

		List<MemCachedAddress> addreeList = new ArrayList<MemCachedAddress>();

		//memcached server ip address and port
		InetSocketAddress address1 = new InetSocketAddress("127.0.0.1", 11211);

		InetSocketAddress address2 = new InetSocketAddress("192.168.1.105",11212);

		//add memcached server
		addreeList.add(new MemCachedAddress(address1, 3));

		addreeList.add(new MemCachedAddress(address2, 7));

		mc = new MinaConnect(addreeList);

		//start connect
		mc.connect();
	}

	@AfterClass
	public static void destory() {
		mc.shutDown();
	}

	@Test
	@Ignore
	public void testSet() throws Exception {
		User user = new User();
		user.setId(1);
		user.setName("tina");
		boolean result = mc.set("name", 0, user);
		System.out.println(result);

	}

	@Test
	public void testGet() throws Exception {
		User user = (User) mc.get("name");
		System.out.println(user.getName());
		/*
		 * user = (User) mc.get("user2"); System.out.println(user.getName());
		 * user = (User) mc.get("user3"); System.out.println(user.getName());
		 */
	}

	@Test
	@Ignore
	public void testReplace() throws Exception {
		User user = new User();
		user.setId(1);
		user.setName("replacetest");
		boolean result = mc.replace("test2", 10000, user);
		System.out.println(result);
	}

	@Test
	@Ignore
	public void testDelete() throws Exception {
		boolean result = mc.delete("test2");
		System.out.println(result);
	}

	@Test
	@Ignore
	public void testIncr() throws Exception {
		long i = mc.incr("incrtest", 2);
		System.out.println(i);
	}

	
	@Test
	@Ignore
	public void testGets() throws Exception {

		User[] users = new User[10];

		for (int i = 0; i < users.length; i++) {
			users[i] = new User();
			users[i].setId(i);
			users[i].setName("test" + i);

			if (i == 3) {
				InetSocketAddress address2 = new InetSocketAddress(
						"192.168.1.105", 11212);
				mc.removeServer(address2);
			}

			boolean result = mc.set("user" + i, 0, users[i]);

			System.out.println(result);
		}

		List<String> list = new ArrayList<String>();

		for (int i = 0; i < 10; i++) {
			list.add("user" + i);
		}

		Map<String, Object> map = mc.gets(list);

		Iterator<String> keySet = map.keySet().iterator();

		while (keySet.hasNext()) {
			User user = (User) map.get(keySet.next());
			System.out.println(user.getName());
		}
	}

	@Test
	@Ignore
	public void testSomeNoreplay() throws Exception {

		
		User pan = (User) mc.get("test");

		System.out.println(pan.getName());

	}

	
}


spring 定义服务
	
<bean id="minaBean"
		class="com.memcached.spring.MinaMemcachedFactoryBean">
		<property name="address">
			<list>
				<value>127.0.0.1:11211</value>
			</list>
		</property>
		
		<property name="weights">
		    <list>
		        <value>3</value>
		    </list>
		</property>
	</bean>


相关jar依赖 mina 和 mina依赖的jar 包
jar包在附件中
   发表时间:2010-02-25  
构思不错,正学习Mina有用.
0 请登录后投票
   发表时间:2010-02-25  
memcached 写道
构思不错,正学习Mina有用.

希望对你有用,多提建议.
0 请登录后投票
   发表时间:2010-02-25  
jboss 的 netty 也不错
0 请登录后投票
   发表时间:2010-02-25  
lvgang 写道
jboss 的 netty 也不错

好像听说过比mina的性能还要好,不知稳定性怎么样.
0 请登录后投票
   发表时间:2010-02-25  
pan_java 写道
lvgang 写道
jboss 的 netty 也不错

好像听说过比mina的性能还要好,不知稳定性怎么样.


我记得都是同一个作者。
0 请登录后投票
   发表时间:2010-02-26  
nishizhutou 写道
pan_java 写道
lvgang 写道
jboss 的 netty 也不错

好像听说过比mina的性能还要好,不知稳定性怎么样.


我记得都是同一个作者。


都是lee写的,不过netty3性能确实比mina好

plurk的comet server就是用netty3实现的
引用

Using Netty we have comet running on 100.000+ open connections - this uses some GB of memory and 20% of CPU on a quad core server. I.e. we have solved the C10k * 10 problem using non-blocking technology and some pretty impressive libraries (namely Java NIO and Netty).

A big kudos goes to Trustin Lee for his amazing work on Netty!

0 请登录后投票
   发表时间:2010-02-28  
nishizhutou 写道
pan_java 写道
lvgang 写道
jboss 的 netty 也不错

好像听说过比mina的性能还要好,不知稳定性怎么样.


我记得都是同一个作者。

是一个韩国人,trustin Lee。我最近在看netty的源代码,觉得netty的建模比较好
0 请登录后投票
   发表时间:2010-02-28  
有空学习一下netty.
0 请登录后投票
   发表时间:2010-03-23  
有空看看开源bbossgroups项目中基于mina协议的rpc调用框架

很实用也很简单:
1.客服端和服务端配置以下组件(基于bboss-aop框架):
<property name="rpc.test" singlable="true" class="org.frameworkset.spi.remote.RPCTest"/>
2.获取远程组件实例
         单点调用

RPCTestInf testInf = (RPCTestInf)BaseSPIManager.getBeanObject("(mina::172.16.17.216:1186)/rpc.test");

         多点调用

RPCTestInf testInf = (RPCTestInf)BaseSPIManager.getBeanObject("(mina::192.168.11.102:1186;192.168.11.102:12346)/rpc.test");

         组播调用

RPCTestInf testInf = (RPCTestInf)BaseSPIManager.getBeanObject("(mina::all)/rpc.test");



         单点调用-传递认证信息

RPCTestInf testInf = (RPCTestInf)BaseSPIManager.getBeanObject("(mina::172.16.17.216:1186)/rpc.test?user=admin&password=123456");

         多点调用-传递认证信息

RPCTestInf testInf = (RPCTestInf)BaseSPIManager.getBeanObject("(mina::192.168.11.102:1186;192.168.11.102:12346)/rpc.test?user=admin&password=123456");

         组播调用-传递认证信息

RPCTestInf testInf = (RPCTestInf)BaseSPIManager.getBeanObject("(mina::all)/rpc.test?user=admin&password=123456");


3.远程方法调用
Object count = testInf.getCount();

4.调用结果处理
单点调用的结果就是服务接口返回的值,无需处理。如果方法调用失败,系统将抛出具体的远程异常。

多点调用和组播调用的结果处理方法一样,以多点调用为例:

RPCTestInf testInf = (RPCTestInf)BaseSPIManager.getBeanObject("(mina::192.168.11.102:1186;192.168.11.102:12346)/rpc.test?User=admin&password=123456");

Object count = testInf.getCount();

Object count = testInf.getCount();

获取192.168.11.102:1186返回的结果:

Object count_1186 = BaseSPIManager.getRPCResult("192.168.11.102", "1186", count);如果返回值是异常,那么直接抛出该异常。

或者

Object count_1186 = BaseSPIManager.getMinaRPCResult

("192.168.11.102:1186", count);如果返回值是异常,那么直接抛出该异常。

或者

Object count_1186 =

    BaseSPIManager.getRPCResult("192.168.11.102:1186", count,

org.frameworkset.remote.Target.BROADCAST_TYPE_MINA);  如果返回值是异常,那么直接抛出该异常。

获取192.168.11.102:12346返回的结果:

Object count_12346 = BaseSPIManager.getRPCResult("192.168.11.102", "12346", count); 如果返回值是异常,那么直接抛出该异常。

或者

Object count_12346 = BaseSPIManager.getMinaRPCResult

("192.168.11.102:12346", count);

或者

Object count_12346 =

    BaseSPIManager.getRPCResult("192.168.11.102:12346", count,

org.frameworkset.remote.Target.BROADCAST_TYPE_MINA);  如果返回值是异常,那么直接抛出该异常。

很简单吧
详细信息参考博客文章:
http://blog.csdn.net/yin_bp/archive/2010/03/20/5398418.aspx
bbossgroups项目下载地址:
https://sourceforge.net/projects/bboss/files/
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics