电信/联通 三户关系模型 - abc123def - 博客园
三户关系
2.1.4.1. 三户模型联通总部营业系统定义了以客户,用户,帐户为主的三户模型
三户的关系如图:
客户、帐户与用户。它将客户的基本信息,客户消费的信息和与运营商某个业务的契约信息分开。
这三者之间的关系可以想象成是一棵树,客户位于树的根部,帐户在中间,用户是第三层叶节点。一个客户拥有多个帐户,一个帐户下可以有多个用户,用户是最细的单位,在经营分析中,目前的统计分析大多都是针对用户进行统计,但是由于术语定义的不严格,在很多场合下,将客户和用户混为一谈,例如经常说的客户数通常是用户数(不是绝对),用户级别其实是客户级别。
2.1.4.2. 用户
用户是系统的基础。
在营业系统中,用户对应的就是业务号码(即手机号码),也就是说一个号码对应一个用户。用户包含于客户,一个客户可能有多个用户,用户和帐户通过帐务关系对应,一个帐户也可能有多个用户。一个用户有一个私人帐户和一个集团帐户。
由于用户有可能被销户,手机号码在冻结一段时间以后重新拿出来使用,因此目前也存在一个手机号码对应多个用户的情况,但是同时有效在使用的,只有一个用户。
一个用户通过唯一的用户标识来确定。
用户信息描述一个用户使用联通业务的业务信息,用户信息里面存放和业务相关的信息,包括手机号码,开户时间,开户地点,所选套餐,用户状态,用户类型,用户级别,用户停机时间,用户销户时间等等和使用联通业务相关的信息,只有使用联通业务,才存在用户信息。
当一个客户入网时,例如选定CDMA业务,一般情况下会为这个客户建立一套三户关系,当然如果一个客户申请一项新业务,例如193长途,如果想用已有的帐户缴费,可以只需建一个新用户,如果它想在另一个帐户缴费,则再建一个新的帐户。在客户信息,我们关注的信息是客户类型、客户级别、性别、年龄、职业等。在帐户中,我们通常关注的是帐户的缴费类型、预存款等,用户入网时可以首先指定他是用现金缴费还是银行代扣等信息,对于银行代扣等类型,还记录银行名称、帐号等。用户信息中,有用户的手机号、服务状态、入网时间、是否有效等契约信息。
关于用户,还有一个子业务信息,或称特服,例如来电显示、移动秘书台、三方通话,这些信息表明该用户除了基本的通话功能外,还有哪些特殊的服务,它们通常和服务属性存储在一块(其实特服本身就是一种服务属性),例如漫游级别、长途级别等。有的系统通过掩码来表明用户订购了哪些特服或是哪些服务属性(如东软、神码的营帐),有的是通过单独的表来维护用户开通了哪些特服(如亚信的营帐)。
2.1.4.3. 客户
客户可分为个人客户,单位客户,集团客户。一个客户可以包含多个用户,客户通过唯一的客户标识来确定。
客户描述一个客户的自然属性,客户可以和用户一一对应,也可以和用户一对多。即使不使用联通业务,也可能存在客户,因为客户是自然存在的。
客户信息包含客户名,地址,邮政编码,性别,年龄,职业,证件号码等等信息,是自然存在的信息。
2.1.4.4. 帐户
帐户是用户缴费的依据,用户的费用信息是与帐户对应的。一个用户可以对应多个帐户,一个帐户也可能由多个用户使用。
在用户进行缴费,充值,消费,销帐的时候,所依据的标识是帐户标识。
cxf学习笔记之传递附件 - ll_feng - ITeye技术网站
1、服务端和客户端的数据对象中,用来存储附件的属性都要用“@XmlMimeType("application/octet-stream")”进行注解,如下:
- @XmlMimeType("application/octet-stream")
- private DataHandler photo;
2、服务端和客户端的web服务配置都要声明mtom-enabled=true
服务端如果在spring中配置,如下:
- <jaxws:endpoint id="register" implementor="cn.ibeans.ws.impl.RegisterWebServiceImpl" address="/ws/register">
- <jaxws:properties>
- <entry key="mtom-enabled" value="true"/>
- </jaxws:properties>
- </jaxws:endpoint>
客户端,如果用代码配置(也可用spring配置,类似服务端),如下:
- Map<String,Object> map = new HashMap<String,Object>();
- map.put("mtom-enabled", true);
- factory = new JaxWsProxyFactoryBean();
- factory.setProperties(map);
3 ways to read files using Java NIO | How to do in JAVA
New I/O, usually called NIO, is a collection of APIs that offer additional capabilities for intensive I/O operations. It was introduced with the Java 1.4 release by Sun Microsystems to complement an existing standard I/O. The extended NIO that offers further new file system APIs, called NIO2, was released with Java SE 7 (“Dolphin”).
NIO related questions are very popular in java interviews now-a-days.
NIO2 provides two major methods of reading a file:
- Using buffer and channel classes
- Using Path and Files classes
In this post, I am showing a couple of ways to read a file from file system. So lets start them by first showing old famous approach first, so that we can see what really changed.
Old famous I/O way
This example shows how we have been reading a text file using old I/O library APIs. It uses a BufferedReader object for reading. Another way can be using InputStream implementation.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
package com.howtodoinjava.test.nio; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class WithoutNIOExample { public static void main(String[] args) { BufferedReader br = null ; String sCurrentLine = null ; try { br = new BufferedReader( new FileReader( "test.txt" )); while ((sCurrentLine = br.readLine()) != null ) { System.out.println(sCurrentLine); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (br != null ) br.close(); } catch (IOException ex) { ex.printStackTrace(); } } } } |
1) Read a small file in buffer of file size
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
package com.howtodoinjava.test.nio; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; public class ReadFileWithFileSizeBuffer { public static void main(String args[]) { try { RandomAccessFile aFile = new RandomAccessFile( "test.txt" , "r" ); FileChannel inChannel = aFile.getChannel(); long fileSize = inChannel.size(); ByteBuffer buffer = ByteBuffer.allocate(( int ) fileSize); inChannel.read(buffer); buffer.rewind(); buffer.flip(); for ( int i = 0 ; i < fileSize; i++) { System.out.print(( char ) buffer.get()); } inChannel.close(); aFile.close(); } catch (IOException exc) { System.out.println(exc); System.exit( 1 ); } } } |
2) Read a large file in chunks with fixed size buffer
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
package com.howtodoinjava.test.nio; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; public class ReadFileWithFixedSizeBuffer { public static void main(String[] args) throws IOException { RandomAccessFile aFile = new RandomAccessFile ( "test.txt" , "r" ); FileChannel inChannel = aFile.getChannel(); ByteBuffer buffer = ByteBuffer.allocate( 1024 ); while (inChannel.read(buffer) > 0 ) { buffer.flip(); for ( int i = 0 ; i < buffer.limit(); i++) { System.out.print(( char ) buffer.get()); } buffer.clear(); // do something with the data and clear/compact it. } inChannel.close(); aFile.close(); } } |
3) Faster file copy with mapped byte buffer
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
package com.howtodoinjava.test.nio; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; public class ReadFileWithMappedByteBuffer { public static void main(String[] args) throws IOException { RandomAccessFile aFile = new RandomAccessFile ( "test.txt" , "r" ); FileChannel inChannel = aFile.getChannel(); MappedByteBuffer buffer = inChannel.map(FileChannel.MapMode.READ_ONLY, 0 , inChannel.size()); buffer.load(); for ( int i = 0 ; i < buffer.limit(); i++) { System.out.print(( char ) buffer.get()); } buffer.clear(); // do something with the data and clear/compact it. inChannel.close(); aFile.close(); } } |
All above techniques will read the content of file and print it to console. You can do whatever you want once you have read it.