提交 1b95dbc9 编写于 作者: 武汉红喜's avatar 武汉红喜

update package name

上级 c73ad059
package com.itlong.whatsmars.mq.rocketmq;
/**
* Created by shenhongxi on 2017/6/21.
*/
public class BrokerStartup {
public static void main(String[] args) {
String classpath = BrokerStartup.class.getResource("/").getPath();
args = new String[] {"-c", classpath + "broker.properties"};
org.apache.rocketmq.broker.BrokerStartup.main(args);
System.out.println("Broker started. name: " + org.apache.rocketmq.broker.BrokerStartup.properties.getProperty("brokerName"));
}
}
package com.itlong.whatsmars.mq.rocketmq;
/**
* Created by shenhongxi on 2017/6/21.
*/
public class NamesrvStartup {
public static void main(String[] args) {
String classpath = BrokerStartup.class.getResource("/").getPath();
args = new String[] {"-c", classpath + "namesrv.properties"};
org.apache.rocketmq.namesrv.NamesrvStartup.main(args);
}
}
package com.itlong.whatsmars.mq.rocketmq.ordermessage;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.MessageQueueSelector;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageQueue;
import org.apache.rocketmq.remoting.common.RemotingHelper;
import java.io.UnsupportedEncodingException;
import java.util.List;
public class Producer {
public static void main(String[] args) throws UnsupportedEncodingException {
try {
DefaultMQProducer producer = new DefaultMQProducer("order_message_producer_group");
producer.setNamesrvAddr("127.0.0.1:9876");
producer.start();
// defaultTopicQueueNums = 4
String[] tags = new String[] {"TagA", "TagB", "TagC", "TagD", "TagE"};
for (int i = 0; i < 100; i++) {
int orderId = i % 10;
Message msg =
new Message("TopicTest", tags[i % tags.length], "KEY" + i,
("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET));
// 需要顺序消费的消息发往同一队列,比如同一订单号相关的几条需要顺序消费的消息发往同一队列
SendResult sendResult = producer.send(msg, new MessageQueueSelector() {
@Override
public MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {
Integer id = (Integer) arg;
int index = id % mqs.size();
return mqs.get(index);
}
}, orderId);
System.out.printf("%s%n", sendResult);
}
producer.shutdown();
} catch (Exception e) {
e.printStackTrace();
}
}
}
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.itlong.whatsmars.mq.rocketmq.quickstart;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.common.RemotingHelper;
/**
* This class demonstrates how to send messages to brokers using provided {@link DefaultMQProducer}.
*/
public class Producer {
public static void main(String[] args) throws MQClientException, InterruptedException {
/*
* Instantiate with a producer group name.
*/
DefaultMQProducer producer = new DefaultMQProducer("quick_start_producer_group");
/*
* Specify name server addresses.
* <p/>
*
* Alternatively, you may specify name server addresses via exporting environmental variable: NAMESRV_ADDR
* <pre>
* {@code
* producer.setNamesrvAddr("name-server1-ip:9876;name-server2-ip:9876");
* }
* </pre>
*/
producer.setNamesrvAddr("127.0.0.1:9876");
/*
* Launch the instance.
*/
producer.start();
for (int i = 0; i < 1000; i++) {
try {
/*
* Create a message instance, specifying topic, tag and message body.
*/
Message msg = new Message("TopicTest" /* Topic */,
"TagA" /* Tag */,
("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET) /* Message body */
);
/*
* Call send message to deliver message to one of brokers.
*/
SendResult sendResult = producer.send(msg);
System.out.printf("%s%n", sendResult);
} catch (Exception e) {
e.printStackTrace();
Thread.sleep(1000);
}
}
/*
* Shut down once the producer instance is not longer in use.
*/
producer.shutdown();
}
}
package com.itlong.whatsmars.mq.zeromq;
import org.zeromq.ZMQ;
public class Publisher {
public static void main(String args[]) {
ZMQ.Context context = ZMQ.context(1); // 创建包含一个I/O线程的context
ZMQ.Socket publisher = context.socket(ZMQ.PUB);
publisher.bind("tcp://*:5555");
while (!Thread.currentThread ().isInterrupted()) {
String message = "toutiao hello";
publisher.send(message.getBytes());
System.out.println("sent : " + message);
}
publisher.close();
context.term();
}
}
\ No newline at end of file
package com.itlong.whatsmars.mq.activemq;
package com.whatsmars.mq.activemq;
import org.apache.activemq.ActiveMQConnectionFactory;
......
package com.whatsmars.mq.activemq;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
/**
* Created by shenhongxi on 2017/9/8.
*/
public class Producer {
public static void main(String[] args) throws Exception {
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616");
Connection connection = factory.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Queue queue = session.createQueue("TEST.QUEUE");
MessageProducer producer = session.createProducer(queue);
producer.setDeliveryMode(DeliveryMode.PERSISTENT);
for (int i= 0; i < 100; i++) {
TextMessage message = session.createTextMessage("hello world! " + i);
producer.send(message);
System.out.println(message);
}
producer.close();
}
}
package com.whatsmars.mq.kafka;
import kafka.javaapi.producer.Producer;
import kafka.producer.KeyedMessage;
import kafka.producer.ProducerConfig;
import java.util.Properties;
public class KafkaProducer {
public static void main(String[] args) {
Properties props = new Properties();
props.put("metadata.broker.list", "127.0.0.1:9092");
props.put("serializer.class", "kafka.serializer.StringEncoder");
props.put("key.serializer.class", "kafka.serializer.StringEncoder");
props.put("request.required.acks","-1");
Producer<String, String> producer = new Producer<String, String>(new ProducerConfig(props));
int messageNo = 100;
final int COUNT = 1000;
while (messageNo < COUNT) {
String key = String.valueOf(messageNo);
String data = "hello kafka message " + key;
producer.send(new KeyedMessage<String, String>("TestTopic", key ,data));
System.out.println(data);
messageNo ++;
}
}
}
\ No newline at end of file
package com.itlong.whatsmars.mq.rabbitmq;
package com.whatsmars.mq.rabbitmq;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
......
package com.itlong.whatsmars.mq.rocketmq;
package com.whatsmars.mq.rocketmq;
/**
* Created by shenhongxi on 2017/6/21.
......
......@@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.itlong.whatsmars.mq.rocketmq.simple;
package com.whatsmars.mq.rocketmq.broadcast;
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
......@@ -23,30 +23,33 @@ import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.common.protocol.heartbeat.MessageModel;
import java.util.List;
public class PushConsumer {
public static void main(String[] args) throws InterruptedException, MQClientException {
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("push_consumer_group");
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("broadcast_consumer_group");
consumer.setNamesrvAddr("127.0.0.1:9876");
consumer.subscribe("TopicTest", "*");
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
//wrong time format 2017_0422_221800
consumer.setConsumeTimestamp("20170422221800");
consumer.registerMessageListener(new MessageListenerConcurrently() {
/**
consumer.setMessageModel(MessageModel.BROADCASTING);
consumer.subscribe("TopicTest", "TagA || TagC || TagD");
consumer.registerMessageListener(new MessageListenerConcurrently() {
*/
@Override
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs,
ConsumeConcurrentlyContext context) {
System.out.printf(Thread.currentThread().getName() + " Receive New Messages: " + msgs + "%n");
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
consumer.start();
System.out.printf("Consumer Started.%n");
System.out.printf("Broadcast Consumer Started.%n");
}
}
......@@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.itlong.whatsmars.mq.rocketmq.quickstart;
package com.whatsmars.mq.rocketmq.quickstart;
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
......
......@@ -15,7 +15,7 @@
* limitations under the License.
*/
package com.itlong.whatsmars.mq.rocketmq.simple;
package com.whatsmars.mq.rocketmq.simple;
import org.apache.rocketmq.common.message.MessageExt;
......
......@@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.itlong.whatsmars.mq.rocketmq.simple;
package com.whatsmars.mq.rocketmq.simple;
import org.apache.rocketmq.client.consumer.DefaultMQPullConsumer;
import org.apache.rocketmq.client.consumer.PullResult;
......
......@@ -15,7 +15,7 @@
* limitations under the License.
*/
package com.itlong.whatsmars.mq.rocketmq.simple;
package com.whatsmars.mq.rocketmq.simple;
import org.apache.rocketmq.client.consumer.*;
import org.apache.rocketmq.client.exception.MQClientException;
......
......@@ -15,7 +15,7 @@
* limitations under the License.
*/
package com.itlong.whatsmars.mq.rocketmq.simple;
package com.whatsmars.mq.rocketmq.simple;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.common.message.MessageQueue;
......
......@@ -14,48 +14,42 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.itlong.whatsmars.mq.rocketmq.simple;
package com.whatsmars.mq.rocketmq.simple;
import org.apache.rocketmq.client.QueryResult;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendCallback;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.remoting.common.RemotingHelper;
import java.io.UnsupportedEncodingException;
public class AsyncProducer {
public static void main(String[] args) throws MQClientException, InterruptedException, UnsupportedEncodingException {
DefaultMQProducer producer = new DefaultMQProducer("async_producer_group");
public class TestProducer {
public static void main(String[] args) throws MQClientException, InterruptedException {
DefaultMQProducer producer = new DefaultMQProducer("simple_producer_group");
producer.setNamesrvAddr("127.0.0.1:9876");
producer.start();
producer.setRetryTimesWhenSendAsyncFailed(0);
for (int i = 0; i < 100; i++) {
for (int i = 0; i < 1; i++)
try {
final int index = i;
Message msg = new Message("TopicTest",
"TagA",
"OrderID188",
"Hello world".getBytes(RemotingHelper.DEFAULT_CHARSET));
producer.send(msg, new SendCallback() {
@Override
public void onSuccess(SendResult sendResult) {
System.out.printf("%-10d OK %s %n", index, sendResult.getMsgId());
}
{
Message msg = new Message("TopicTest",
"TagA",
"key113",
"Hello world".getBytes(RemotingHelper.DEFAULT_CHARSET));
SendResult sendResult = producer.send(msg);
System.out.printf("%s%n", sendResult);
@Override
public void onException(Throwable e) {
System.out.printf("%-10d Exception %s %n", index, e);
e.printStackTrace();
QueryResult queryMessage =
producer.queryMessage("TopicTest", "key113", 10, 0, System.currentTimeMillis());
for (MessageExt m : queryMessage.getMessageList()) {
System.out.printf("%s%n", m);
}
});
}
} catch (Exception e) {
e.printStackTrace();
}
}
producer.shutdown();
}
}
......@@ -14,23 +14,22 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.itlong.whatsmars.mq.rocketmq.transaction;
package com.whatsmars.mq.rocketmq.transaction;
import org.apache.rocketmq.client.producer.LocalTransactionExecuter;
import org.apache.rocketmq.client.producer.LocalTransactionState;
import org.apache.rocketmq.client.producer.TransactionCheckListener;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.common.message.Message;
import java.util.concurrent.atomic.AtomicInteger;
public class TransactionCheckListenerImpl implements TransactionCheckListener {
private AtomicInteger transactionIndex = new AtomicInteger(0);
public class TransactionExecuterImpl implements LocalTransactionExecuter {
private AtomicInteger transactionIndex = new AtomicInteger(1);
@Override
public LocalTransactionState checkLocalTransactionState(MessageExt msg) {
System.out.printf("server checking TrMsg " + msg.toString() + "%n");
public LocalTransactionState executeLocalTransactionBranch(final Message msg, final Object arg) {
int value = transactionIndex.getAndIncrement();
if ((value % 6) == 0) {
if (value == 0) {
throw new RuntimeException("Could not find db");
} else if ((value % 5) == 0) {
return LocalTransactionState.ROLLBACK_MESSAGE;
......
......@@ -14,7 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.itlong.whatsmars.mq.rocketmq.transaction;
package com.whatsmars.mq.rocketmq.transaction;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.TransactionCheckListener;
......@@ -23,8 +23,6 @@ import org.apache.rocketmq.client.producer.TransactionSendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.common.RemotingHelper;
import java.io.UnsupportedEncodingException;
public class TransactionProducer {
public static void main(String[] args) throws MQClientException, InterruptedException {
TransactionCheckListener transactionCheckListener = new TransactionCheckListenerImpl();
......
package com.whatsmars.redis.client.cluster;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.InitializingBean;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;
import java.util.HashSet;
import java.util.Set;
/**
* Created by javahongxi on 2017/6/22.
*/
public class RedisClusterClient implements FactoryBean<JedisCluster>,InitializingBean {
private JedisCluster jedisCluster;
private int maxTotal = 128;
//最大空闲连接数
private int maxIdle = 6;
//最小空闲连接数
private int minIdle = 1;
//如果连接池耗尽,最大阻塞的时间,默认为3秒
private long maxWait = 3000;//单位毫秒
private int timeout = 3000;//connectionTimeout,soTimeout,默认为3秒
private boolean testOnBorrow = true;
private boolean testOnReturn = true;
private String addresses;//ip:port,ip:port
public void setMaxTotal(int maxTotal) {
this.maxTotal = maxTotal;
}
public void setMaxIdle(int maxIdle) {
this.maxIdle = maxIdle;
}
public void setMinIdle(int minIdle) {
this.minIdle = minIdle;
}
public void setMaxWait(long maxWait) {
this.maxWait = maxWait;
}
public void setTimeout(int timeout) {
this.timeout = timeout;
}
public void setTestOnBorrow(boolean testOnBorrow) {
this.testOnBorrow = testOnBorrow;
}
public void setTestOnReturn(boolean testOnReturn) {
this.testOnReturn = testOnReturn;
}
public void setAddresses(String addresses) {
this.addresses = addresses;
}
protected JedisPoolConfig buildConfig() {
JedisPoolConfig config = new JedisPoolConfig();
config.setMinIdle(minIdle);
config.setMaxIdle(maxIdle);
config.setMaxTotal(maxTotal);
config.setTestOnBorrow(testOnBorrow);
config.setTestOnReturn(testOnReturn);
config.setBlockWhenExhausted(true);
config.setMaxWaitMillis(maxWait);
config.setFairness(false);
return config;
}
private Set<HostAndPort> buildHostAndPorts() {
String[] hostPorts = addresses.split(",");
Set<HostAndPort> hostAndPorts = new HashSet<HostAndPort>();
for(String item : hostPorts) {
String[] hostPort = item.split(":");
HostAndPort hostAndPort = new HostAndPort(hostPort[0],Integer.valueOf(hostPort[1]));
hostAndPorts.add(hostAndPort);
}
return hostAndPorts;
}
@Override
public void afterPropertiesSet() throws Exception {
JedisPoolConfig config = buildConfig();
Set<HostAndPort> hostAndPorts = buildHostAndPorts();
jedisCluster = new JedisCluster(hostAndPorts,timeout,config);
}
@Override
public JedisCluster getObject() throws Exception {
return jedisCluster;
}
@Override
public Class<?> getObjectType() {
return JedisCluster.class;
}
@Override
public boolean isSingleton() {
return true;
}
}
package com.itlong.whatsmars.redis.client.readwrite;
package com.whatsmars.redis.client.readwrite;
import org.springframework.beans.factory.InitializingBean;
import redis.clients.jedis.Jedis;
......
package com.itlong.whatsmars.redis.client;
import com.itlong.whatsmars.redis.client.readwrite.ReadWriteRedisClient;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPool;
/**
* Created by javahongxi on 2017/6/23.
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:spring-redis.xml")
public class Demo {
@Autowired
@Qualifier("singletonRedisClient")
private JedisPool singletonRedisClient;
@Autowired
private ReadWriteRedisClient readWriteRedisClient;
@Autowired
@Qualifier("redisClusterClient")
private JedisCluster jedisCluster;
@Test
public void testSingleton() {
Jedis jedis = singletonRedisClient.getResource();
String cacheContent = null;
try {
cacheContent = jedis.get("hello_world");
}finally {
singletonRedisClient.close();
}
// 获取redis数据之后,立即释放连接,然后开始进行业务处理
if(cacheContent == null) {
// DB operation
}
// ..
}
@Test
public void testReadWrite() {
String cacheContent = null;
try {
readWriteRedisClient.set("hello_world", "Hi World!");
cacheContent = readWriteRedisClient.get("hello_world");
System.out.println(cacheContent);
} catch (Exception e) {
//如果异常,你可以决定是否忽略
}
if(cacheContent == null) {
//如果cache中不存在,或者redis异常
}
}
@Test
public void testCluster() {
String cacheContent = null;
try {
cacheContent = jedisCluster.get("hello_world");
} catch (Exception e) {
//如果异常,你可以决定是否忽略
}
if(cacheContent == null) {
//如果cache中不存在,或者redis异常
}
}
}
package com.itlong.whatsmars.rpc.protocol.grpc.client;
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import com.itlong.whatsmars.grpc.service.HelloServiceGrpc;
import com.itlong.whatsmars.grpc.service.HelloRequest;
import com.itlong.whatsmars.grpc.service.HelloResponse;
import java.util.concurrent.TimeUnit;
/**
* Created by shenhongxi on 2017/5/5.
*/
public class HelloWorldClient {
private final ManagedChannel channel;
private final HelloServiceGrpc.HelloServiceBlockingStub blockingStub;
public HelloWorldClient(String host,int port){
channel = ManagedChannelBuilder.forAddress(host, port)
.usePlaintext(true)
.build();
blockingStub = HelloServiceGrpc.newBlockingStub(channel);
}
public void shutdown() throws InterruptedException {
channel.shutdown().awaitTermination(5, TimeUnit.SECONDS);
}
public void greet(String name){
HelloRequest request = HelloRequest.newBuilder().setName(name).build();
HelloResponse response = blockingStub.sayHello(request);
System.out.println(response.getMessage());
}
public static void main(String[] args) throws InterruptedException {
HelloWorldClient client = new HelloWorldClient("127.0.0.1", 50051);
for(int i = 0; i < 5; i++) {
client.greet("world:" + i);
}
client.shutdown();
}
}
package com.itlong.whatsmars.rpc.protocol.grpc.server;
package com.whatsmars.rpc.protocol.grpc.server;
import io.grpc.Server;
import io.grpc.ServerBuilder;
import io.grpc.stub.StreamObserver;
import com.itlong.whatsmars.grpc.service.HelloServiceGrpc;
import com.itlong.whatsmars.grpc.service.HelloRequest;
import com.itlong.whatsmars.grpc.service.HelloResponse;
import com.whatsmars.grpc.service.HelloServiceGrpc;
import com.whatsmars.grpc.service.HelloRequest;
import com.whatsmars.grpc.service.HelloResponse;
import java.io.IOException;
......
package com.itlong.whatsmars.rpc.protocol.http;
package com.whatsmars.rpc.protocol.http;
import com.itlong.whatsmars.grpc.service.HelloResponse;
import com.whatsmars.grpc.service.HelloResponse;
import java.io.InputStream;
import java.io.OutputStream;
......
package com.itlong.whatsmars.rpc.protocol.http;
package com.whatsmars.rpc.protocol.http;
import java.util.HashMap;
import java.util.Map;
......
package com.whatsmars.rpc.protocol.http;
import com.whatsmars.grpc.service.HelloRequest;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.CumulativeProtocolDecoder;
import org.apache.mina.filter.codec.ProtocolDecoderOutput;
import java.util.Arrays;
/**
* Created by shenhongxi on 2017/6/14.
*/
public class HttpRequestDecoder extends CumulativeProtocolDecoder {
@Override
protected boolean doDecode(IoSession ioSession, IoBuffer ioBuffer, ProtocolDecoderOutput out) throws Exception {
int start = ioBuffer.position();
String content = "";
byte[] messages = null;
try {
//content = inBuffer.getString(Charset.forName("UTF-8").newDecoder());
messages = new byte[ioBuffer.limit()];
ioBuffer.get(messages);
content = new String(messages,"UTF-8");
} catch (Exception e) {
ioBuffer.position(start);
return false;
}
int position = content.indexOf("\r\n\r\n");
if (position == -1) {
ioBuffer.position(start);
return false;
}
HttpRequestMessage reqMsg = new HttpRequestMessage();
String headerContent = content.substring(0, position);
int headerLength = position + 4;
String[] headers = headerContent.split("\r\n");
for (String header : headers) {
String[] temps = header.split(": ");
if (temps == null || temps.length <= 1)
continue;
reqMsg.addRequestHeader(temps[0].trim().toLowerCase(), temps[1].trim());
}
int fLPosition = headerContent.indexOf("\r\n");
String url = headerContent.substring(0, fLPosition);
String[] urls = url.split(" ");
if (urls.length < 3) {
reqMsg.setErrorCode(400);
out.write(reqMsg);
return true;
}
if (!"GET".equalsIgnoreCase(urls[0]) && !"POST".equalsIgnoreCase(urls[0])) {
reqMsg.setErrorCode(400);
out.write(reqMsg);
return true;
}
reqMsg.setRequestProtocol(urls[0]);
reqMsg.setRequestUrl(urls[1]);
reqMsg.setVersion(urls[2]);
String bodyLengthStr = reqMsg.getRequestHeader("Content-Length".toLowerCase());
if (bodyLengthStr == null) {
reqMsg.setErrorCode(400);
out.write(reqMsg);
return true;
}
int bodyLength = -1;
try {
bodyLength = Integer.parseInt(bodyLengthStr.trim());
} catch (Exception e) {
reqMsg.setErrorCode(400);
out.write(reqMsg);
return true;
}
String bodyContent = null;
int packageLength = bodyLength + headerLength;
if (content.getBytes("UTF-8").length >= packageLength) {
ioBuffer.position(packageLength);
int l = messages.length;
byte[] bodyBytes = Arrays.copyOfRange(messages, headerLength, packageLength);
String requestName = reqMsg.getRequestHeader("Request-Name".toLowerCase());
if (requestName != null && !requestName.equals("")) {
if (requestName.equals("hello")) {
HelloRequest helloRequest = HelloRequest.parseFrom(bodyBytes);
}
} else {
bodyContent = new String(bodyBytes, "UTF-8");
}
} else {
ioBuffer.position(start);
return false;
}
reqMsg.setMessageBody(bodyContent);
out.write(reqMsg);
return true;
}
}
package com.whatsmars.rpc.protocol.http;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import java.util.Map.Entry;
public class HttpResponseMessage extends HttpMessage
{
private static Logger logger = LoggerFactory.getLogger(HttpResponseMessage.class);
private int statusCode = 200;
private String statusMessage = "OK";
public HttpResponseMessage()
{
this.messageHeader.put("Content-Type", "text/json; charset=UTF-8");
}
public int getStatusCode()
{
return this.statusCode;
}
public void setStatusCode(int statusCode) {
this.statusCode = statusCode;
}
public String getStatusMessage() {
return this.statusMessage;
}
public void setStatusMessage(String statusMessage) {
this.statusMessage = statusMessage;
}
public byte[] getByteBody() throws UnsupportedEncodingException {
if (this.messageBody == null) {
return new byte[0];
}
return this.messageBody.getBytes("UTF-8");
}
public int getContentLength() throws UnsupportedEncodingException {
if (this.messageBody == null) {
return 0;
}
return this.messageBody.getBytes("UTF-8").length;
}
public String toString()
{
StringBuilder sb = new StringBuilder();
sb.append("\r\n\r\n");
sb.append("\r\n");
sb.append("HTTP/1.1").append(" ").append(200).append(" ").append(this.statusMessage).append("\r\n");
Iterator iterator = this.messageHeader.entrySet().iterator();
while (iterator.hasNext()) {
Entry entry = (Entry)iterator.next();
sb.append((String)entry.getKey()).append(": ").append((String)entry.getValue()).append("\r\n");
}
try
{
sb.append("Content-Length").append(": ").append(String.valueOf(getContentLength()));
}
catch (Exception e) {
logger.error("Encoding Error!", e);
}
sb.append("\r\n\r\n");
sb.append(this.messageBody);
sb.append("\r\n\r\n");
return sb.toString();
}
}
syntax = "proto3";
option java_multiple_files = true;
option java_package = "com.itlong.whatsmars.grpc.service";
option java_package = "com.whatsmars.grpc.service";
option java_outer_classname = "HelloWorldProto";
option objc_class_prefix = "HLW";
......
package com.itlong.whatsmars.spring.context;
import com.itlong.whatsmars.spring.model.Mars;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* Created by shenhongxi on 2016/4/7.
*/
public class TestSpring {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Mars mars = (Mars) context.getBean("mars");
System.out.println(mars.getAge());
System.out.println(mars.getCnName());
}
}
package com.whatsmars.spring.aspect;
import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
@Aspect
@Component
public class SystemLogAspect {
private static Logger logger = Logger.getLogger(SystemLog.class);
// Controller层切点
@Pointcut("@annotation(com.qiku.log.annotation.SystemLog)")
public void controllerAspect() {
}
// 操作记录
@After("controllerAspect()")
public void doAfter(JoinPoint joinPoint) {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
// 读取session中的用户
// User user = SessionUtils.getUserFromSession(request);
// if(null == user){
// logger.info("未登录日志不记录");
// return;
// }
try {
Object[] args = getLogMethodDescription(joinPoint);
// *========数据库日志=========*//
// logService.saveLog(user.getId(), user.getAccount(), Integer.valueOf(args[1].toString()),
// IpUtils.getIpAddr(request), args[0].toString(),
// user.getManufacturerId(), reqDescription(request));
} catch (Exception e) {
logger.error(e);
e.printStackTrace();
}
}
// 异常记录
@AfterThrowing(pointcut = "controllerAspect()", throwing = "exception")
public void doException(JoinPoint joinPoint, Exception exception) {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
// 读取session中的用户
// User user = SessionUtils.getUserFromSession(request);
// if(null == user){
// logger.info("未登录日志不记录");
// return;
// }
try {
Object[] args = getLogMethodDescription(joinPoint);
// *========数据库日志=========*//
// logService.saveLog(user.getId(), user.getAccount(), LogType.EXCEPTION_LOG,
// IpUtils.getIpAddr(request), args[0].toString() + "-->" + exception.getMessage(),
// user.getManufacturerId(), reqDescription(request));
} catch (Exception e) {
// 记录本地异常日志
logger.error(e);
e.printStackTrace();
}
}
/**
* 获取注解中对方法的描述信息 用于Controller层注解 切点
*/
@SuppressWarnings("rawtypes")
public static Object[] getLogMethodDescription(JoinPoint joinPoint) throws Exception {
String targetName = joinPoint.getTarget().getClass().getName();
String methodName = joinPoint.getSignature().getName();
Object[] arguments = joinPoint.getArgs();
Class<?> targetClass = Class.forName(targetName);
Method[] methods = targetClass.getMethods();
Object[] result = new Object[2];
for (Method method : methods) {
if (method.getName().equals(methodName)) {
Class[] clazzs = method.getParameterTypes();
if (clazzs.length == arguments.length) {
result[0] = method.getAnnotation(SystemLog.class).description();
result[1] = method.getAnnotation(SystemLog.class).logType();
break;
}
}
}
return result;
}
}
package com.itlong.whatsmars.spring.context.annotation;
package com.whatsmars.spring.context.annotation;
import com.itlong.whatsmars.spring.model.Mars;
import com.whatsmars.spring.model.Mars;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
......
package com.itlong.whatsmars.spring.context.generic;
package com.whatsmars.spring.context.generic;
import com.itlong.whatsmars.spring.model.Mars;
import com.whatsmars.spring.model.Mars;
import org.springframework.beans.factory.support.PropertiesBeanDefinitionReader;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.context.support.GenericApplicationContext;
......
package com.itlong.whatsmars.spring.model;
package com.whatsmars.spring.model;
/**
* Created by shenhongxi on 2016/4/7.
......
......@@ -8,9 +8,9 @@
http://www.springframework.org/schema/context/spring-context-3.2.xsd"
default-autowire="byName">
<context:component-scan base-package="com.itlong.whatsmars.spring.initializing"/>
<context:component-scan base-package="com.whatsmars.spring.initializing"/>
<bean id="mars" class="com.itlong.whatsmars.spring.model.Mars">
<bean id="mars" class="com.whatsmars.spring.model.Mars">
<property name="age" value="45" />
<property name="cnName" value="火星" />
</bean>
......
package com.whatsmars.spring;
import com.whatsmars.spring.model.Mars;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* Created by shenhongxi on 2016/7/5.
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/applicationContext.xml")
public class XxDemo {
@Autowired
private Mars mars;
@Test
public void hi() {
System.out.println(mars.getAge());
}
}
package com.itlong.whatsmars.tomcat.connector;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.Collection;
import java.util.Locale;
/**
* Created by shenhongxi on 16/4/11.
*/
public class HttpResponse implements HttpServletResponse {
OutputStream output;
HttpRequest request;
PrintWriter writer;
public HttpResponse(OutputStream output) {
this.output = output;
}
public void setRequest(HttpRequest request) {
this.request = request;
}
/**
* call this method to send headers and response to the output
*/
public void finishResponse() {
// sendHeaders();
// Flush and close the appropriate output mechanism
if (writer != null) {
writer.flush();
writer.close();
}
}
public void addCookie(Cookie cookie) {
}
public boolean containsHeader(String name) {
return false;
}
public String encodeURL(String url) {
return null;
}
public String encodeRedirectURL(String url) {
return null;
}
public String encodeUrl(String url) {
return null;
}
public String encodeRedirectUrl(String url) {
return null;
}
public void sendError(int sc, String msg) throws IOException {
}
public void sendError(int sc) throws IOException {
}
public void sendRedirect(String location) throws IOException {
}
public void setDateHeader(String name, long date) {
}
public void addDateHeader(String name, long date) {
}
public void setHeader(String name, String value) {
}
public void addHeader(String name, String value) {
}
public void setIntHeader(String name, int value) {
}
public void addIntHeader(String name, int value) {
}
public void setStatus(int sc) {
}
public void setStatus(int sc, String sm) {
}
public int getStatus() {
return 0;
}
public String getHeader(String name) {
return null;
}
public Collection<String> getHeaders(String name) {
return null;
}
public Collection<String> getHeaderNames() {
return null;
}
public String getCharacterEncoding() {
return null;
}
public String getContentType() {
return null;
}
public ServletOutputStream getOutputStream() throws IOException {
return null;
}
public PrintWriter getWriter() throws IOException {
return null;
}
public void setCharacterEncoding(String charset) {
}
public void setContentLength(int len) {
}
@Override
public void setContentLengthLong(long l) {
}
public void setContentType(String type) {
}
public void setBufferSize(int size) {
}
public int getBufferSize() {
return 0;
}
public void flushBuffer() throws IOException {
}
public void resetBuffer() {
}
public boolean isCommitted() {
return false;
}
public void reset() {
}
public void setLocale(Locale loc) {
}
public Locale getLocale() {
return null;
}
}
package com.itlong.whatsmars.tomcat.design.adapter;
/**
* Created by shenhongxi on 16/4/14.
*/
public class Adaptee {
public void specificRequest() {
System.out.println("specific request");
}
}
package com.itlong.whatsmars.tomcat.design.decorator;
/**
* @author javahongxi 具体装饰角色,增加过滤掉HTML标签的功能
*/
public class HtmlFilter extends MessageBoardDecorator {
public HtmlFilter(MessageBoardHandler handler) {
super(handler);
}
public String filter(String content) {
String temp = super.filter(content);
temp += "^^过滤掉HTML标签!^^";
return temp;
}
}
package com.itlong.whatsmars.tomcat.design.decorator;
/**
* @author javahongxi 客户端测试
*/
public class Test {
public static void main(String[] args) {
MessageBoardHandler mb = new MessageBoard();
String content = mb.filter("一定要学好装饰模式!");
System.out.println(content);
mb = new HtmlFilter(new SensitiveFilter(new MessageBoard()));
content = mb.filter("一定要学好装饰模式!");
System.out.println(content);
}
}
package com.itlong.whatsmars.tomcat.embed.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(
name = "MyServlet",
urlPatterns = {"/hello"}
)
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
ServletOutputStream out = resp.getOutputStream();
out.write("hello heroku".getBytes());
out.flush();
out.close();
}
}
package com.itlong.whatsmars.tomcat.servlet;
import java.io.IOException;
/**
* Created by shenhongxi on 2016/4/12.
*/
public class StaticResourceProcessor {
public void process(Request request, Response response) {
try {
response.sendStaticResource();
} catch (IOException e) {
e.printStackTrace();
}
}
}
package com.whatsmars.tomcat.connector;
/**
* Created by shenhongxi on 16/4/11.
*/
public final class Bootstrap {
public static void main(String[] args) {
HttpConnector connector = new HttpConnector();
Container container = new SimpleContainer();
connector.setContainer(container);
connector.setBufferSize(2048);
connector.start();
}
}
package com.whatsmars.tomcat.connector;
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
/**
* Created by shenhongxi on 16/4/11.
*/
public class HttpConnector implements Runnable {
private Container container;
boolean stopped;
private String scheme = "http";
private int bufferSize;
public void run() {
ServerSocket serverSocket = null;
int port = 8080;
try {
serverSocket = new ServerSocket(port, 1, InetAddress.getByName("127.0.0.1"));
} catch (IOException e) {
e.printStackTrace();
System.exit(1);
}
while (!stopped) {
// Accept the next incoming connection from the server socket
Socket socket = null;
try {
socket = serverSocket.accept();
} catch (Exception e) {
continue;
}
// Hand this socket off to an HttpProcessor
HttpProcessor processor = new HttpProcessor(this);
processor.process(socket);
}
}
public void start() {
new Thread(this).start();
}
public String getScheme() {
return scheme;
}
public int getBufferSize() {
return bufferSize;
}
public void setBufferSize(int bufferSize) {
this.bufferSize = bufferSize;
}
public Container getContainer() {
return container;
}
public void setContainer(Container container) {
this.container = container;
}
}
package com.itlong.whatsmars.tomcat.connector;
package com.whatsmars.tomcat.connector;
/**
* Created by shenhongxi on 16/4/13.
......
package com.whatsmars.tomcat.connector;
import com.whatsmars.tomcat.servlet.StaticResourceProcessor;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
/**
* Created by shenhongxi on 16/4/11.
*/
public class HttpProcessor {
private HttpConnector connector;
private HttpRequest request;
private HttpResponse response;
private HttpRequestLine requestLine = new HttpRequestLine();
public HttpProcessor(HttpConnector connector) {
this.connector = connector;
}
public void process(Socket socket) {
SocketInputStream input = null;
OutputStream output = null;
try {
input = new SocketInputStream(socket.getInputStream(), connector.getBufferSize()); // 1.读取套接字的输入流
output = socket.getOutputStream();
// create HttpRequest object and parse
request = new HttpRequest(input);
response = new HttpResponse(output);
response.setRequest(request);
response.setHeader("Server", "Mars Servlet Container");
parseRequest(input, output); // 解析请求行,即HTTP请求的第一行内容
parseHeaders(input); // 解析请求头
if (request.getRequestURI().startsWith("/servlet/")) {
connector.getContainer().invoke((HttpServletRequest) request, (HttpServletResponse) response);
} else {
StaticResourceProcessor processor = new StaticResourceProcessor();
//processor.process(request, response);
}
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
private void parseHeaders(SocketInputStream input) throws IOException, ServletException{
while (true) { // 一行一行解析完header
HttpHeader header = new HttpHeader();
// Read the next header
input.readHeader(header);
if (header.nameEnd == 0) {
if (header.valueEnd == 0) {
return;
} else {
throw new ServletException("httpProcessor parseHeaders colon");
}
}
String name = new String(header.name, 0, header.nameEnd);
String value = new String(header.value, 0, header.valueEnd);
request.addHeader(name, value);
// do something for some headers, ignore others.
if (name.equals("cookie")) {
// ...
// request.addCookie(cookies[i]);
} else if (name.equals("content-length")) {
int n = -1;
try {
n = Integer.parseInt(value);
} catch (Exception e) {
throw new ServletException("httpProcessor.parseHeaders.contentLength");
}
request.setContentLength(n);
} else if (name.equals("content-type")) {
request.setContentType(value);
}
}
}
private void parseRequest(SocketInputStream input, OutputStream output) throws IOException, ServletException {
input.readRequestLine(requestLine);
String method = new String(requestLine.method, 0, requestLine.methodEnd);
String uri = null;
String protocol = new String(requestLine.protocol, 0, requestLine.protocolEnd);
// Validate the incoming request line
if (method.length() < 1) {
throw new ServletException("Missing HTTP request method");
} else if (requestLine.uriEnd < 1) {
throw new ServletException("Missing HTTP request URI");
}
// Parse any query parameters out of the request URI
int question = requestLine.indexOf("?");
if (question >= 0) {
request.setQueryString(new String(requestLine.uri, question + 1,
requestLine.uriEnd - question - 1));
uri = new String(requestLine.uri, 0, question);
} else {
request.setQueryString(null);
uri = new String(requestLine.uri, 0, requestLine.uriEnd);
}
String normalizedUri = normalize(uri);
((HttpRequest) request).setMethod(method);
request.setProtocol(protocol);
if (normalizedUri != null) {
((HttpRequest) request).setRequestURI(normalizedUri);
}
else {
((HttpRequest) request).setRequestURI(uri);
}
if (normalizedUri == null) {
throw new ServletException("Invalid URI: " + uri + "'");
}
}
// Return a context-relative path, beginning with a "/"
protected String normalize(String path) {
if (path == null) return null;
String normalized = path;
// ...
return path;
}
}
package com.whatsmars.tomcat.connector;
/**
* Created by shenhongxi on 16/4/13.
*/
public final class HttpRequestLine {
public static final int INITIAL_METHOD_SIZE = 8;
public static final int INITIAL_URI_SIZE = 64;
public static final int INITIAL_PROTOCOL_SIZE = 8;
public static final int MAX_METHOD_SIZE = 1024;
public static final int MAX_URI_SIZE = 32768;
public static final int MAX_PROTOCOL_SIZE = 1024;
public char[] method;
public int methodEnd;
public char[] uri;
public int uriEnd;
public char[] protocol;
public int protocolEnd;
public HttpRequestLine() {
this(new char[INITIAL_METHOD_SIZE], 0, new char[INITIAL_URI_SIZE], 0,
new char[INITIAL_PROTOCOL_SIZE], 0);
}
public HttpRequestLine(char[] method, int methodEnd,
char[] uri, int uriEnd,
char[] protocol, int protocolEnd) {
this.method = method;
this.methodEnd = methodEnd;
this.uri = uri;
this.uriEnd = uriEnd;
this.protocol = protocol;
this.protocolEnd = protocolEnd;
}
public int indexOf(String str) {
// ...
return -1;
}
/**
* Release all object references, and initialize instance variables, in
* preparation for reuse of this object.
*/
public void recycle() {
methodEnd = 0;
uriEnd = 0;
protocolEnd = 0;
}
}
package com.itlong.whatsmars.tomcat.connector;
package com.whatsmars.tomcat.connector;
import java.io.IOException;
import java.io.InputStream;
......
package com.whatsmars.tomcat.design.adapter;
/**
* Created by shenhongxi on 16/4/14.
*/
public class Adapter implements Target {
Adaptee adaptee;
public void request() {
adaptee.specificRequest();
}
}
package com.whatsmars.tomcat.design.adapter;
/**
* Created by shenhongxi on 16/4/14.
*/
public class Adapter2 extends Adaptee implements Target {
// 对于我们不必要实现的方法可在Adaptee中作空实现
public void request() {
super.specificRequest();
}
}
package com.itlong.whatsmars.tomcat.design.decorator;
package com.whatsmars.tomcat.design.decorator;
/**
* @author javahongxi 用户留言板的具体实现
......
package com.whatsmars.tomcat.design.decorator;
/**
* @author javahongxi 装饰角色
*/
public class MessageBoardDecorator implements MessageBoardHandler {
private MessageBoardHandler handler;
public MessageBoardDecorator(MessageBoardHandler handler) {
super();
this.handler = handler;
}
public String filter(String msg) {
return handler.filter(msg);
}
}
\ No newline at end of file
package com.whatsmars.tomcat.design.decorator;
/**
* @author javahongxi 具体装饰角色,增加过滤掉政治敏感字眼的功能
*/
public class SensitiveFilter extends MessageBoardDecorator {
public SensitiveFilter(MessageBoardHandler handler) {
super(handler);
}
public String filter(String content) {
String temp = super.filter(content);
temp += "^^过滤掉政治敏感的字眼!^^";
return temp;
}
}
\ No newline at end of file
package com.itlong.whatsmars.tomcat.embed;
package com.whatsmars.tomcat.embed;
import java.io.File;
import java.net.URISyntaxException;
......
package com.itlong.whatsmars.tomcat.server;
package com.whatsmars.tomcat.server;
import java.io.File;
import java.io.IOException;
......
package com.itlong.whatsmars.tomcat.server;
package com.whatsmars.tomcat.server;
import java.io.IOException;
import java.io.InputStream;
......
package com.itlong.whatsmars.tomcat.servlet;
package com.whatsmars.tomcat.servlet;
import java.io.IOException;
import java.io.InputStream;
......
package com.whatsmars.tomcat.servlet;
import javax.servlet.*;
import java.io.IOException;
import java.io.PrintWriter;
/**
* Created by shenhongxi on 2016/4/12.
*/
public class PrimitiveServlet implements Servlet {
public void init(ServletConfig config) throws ServletException {
System.out.println("init");
}
public ServletConfig getServletConfig() {
return null;
}
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("from service");
PrintWriter out = res.getWriter();
out.println("Hello. Roses are red.");
out.print("Violets are blue");
}
public String getServletInfo() {
return null;
}
public void destroy() {
System.out.println("destroy");
}
}
package com.whatsmars.tomcat.servlet;
import javax.servlet.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.Locale;
import java.util.Map;
/**
* Created by shenhongxi on 16/3/21.
*/
public class Request implements ServletRequest {
private InputStream input;
private String uri; // 性能考虑,用byte[]
public Request(InputStream input) {
this.input = input;
}
public void parse() {
StringBuffer request = new StringBuffer(2048);
int i;
byte[] buffer = new byte[2048];
try {
i = input.read(buffer);
} catch (IOException e) {
e.printStackTrace();
i = -1;
}
for (int j = 0; j < i; j++) {
request.append((char) buffer[j]);
}
System.out.println(request.toString());
uri = parseUri(request.toString());
}
private String parseUri(String requestStr) {
// GET /index.html HTTP/1.1
// Accept: text/plain; text/html
// ...
int index1 = requestStr.indexOf(' ');
int index2;
if (index1 != -1) {
index2 = requestStr.indexOf(' ', index1 + 1);
if (index2 > index1) {
return requestStr.substring(index1 + 1, index2);
}
}
return null;
}
public String getUri() {
return uri;
}
public Object getAttribute(String name) {
return null;
}
public Enumeration<String> getAttributeNames() {
return null;
}
public String getCharacterEncoding() {
return null;
}
public void setCharacterEncoding(String env) throws UnsupportedEncodingException {
}
public int getContentLength() {
return 0;
}
@Override
public long getContentLengthLong() {
return 0;
}
public String getContentType() {
return null;
}
public ServletInputStream getInputStream() throws IOException {
return null;
}
public String getParameter(String name) {
return null;
}
public Enumeration<String> getParameterNames() {
return null;
}
public String[] getParameterValues(String name) {
return new String[0];
}
public Map<String, String[]> getParameterMap() {
return null;
}
public String getProtocol() {
return null;
}
public String getScheme() {
return null;
}
public String getServerName() {
return null;
}
public int getServerPort() {
return 0;
}
public BufferedReader getReader() throws IOException {
return null;
}
public String getRemoteAddr() {
return null;
}
public String getRemoteHost() {
return null;
}
public void setAttribute(String name, Object o) {
}
public void removeAttribute(String name) {
}
public Locale getLocale() {
return null;
}
public Enumeration<Locale> getLocales() {
return null;
}
public boolean isSecure() {
return false;
}
public RequestDispatcher getRequestDispatcher(String path) {
return null;
}
public String getRealPath(String path) {
return null;
}
public int getRemotePort() {
return 0;
}
public String getLocalName() {
return null;
}
public String getLocalAddr() {
return null;
}
public int getLocalPort() {
return 0;
}
public ServletContext getServletContext() {
return null;
}
public AsyncContext startAsync() throws IllegalStateException {
return null;
}
public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) throws IllegalStateException {
return null;
}
public boolean isAsyncStarted() {
return false;
}
public boolean isAsyncSupported() {
return false;
}
public AsyncContext getAsyncContext() {
return null;
}
public DispatcherType getDispatcherType() {
return null;
}
}
package com.itlong.whatsmars.tomcat.servlet;
package com.whatsmars.tomcat.servlet;
import javax.servlet.*;
import java.io.BufferedReader;
......
package com.itlong.whatsmars.tomcat.server;
package com.whatsmars.tomcat.servlet;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.ServletOutputStream;
import javax.servlet.ServletResponse;
import java.io.*;
import java.util.Locale;
/**
* Created by shenhongxi on 16/3/21.
*/
public class Response {
public class Response implements ServletResponse {
private static final int BUFFER_SIZE = 1024;
......@@ -16,11 +16,13 @@ public class Response {
OutputStream output;
PrintWriter writer;
public void sendStaticResource() throws IOException {
byte[] bytes = new byte[BUFFER_SIZE];
FileInputStream fis = null;
try {
File file = new File(HttpServer.WEB_ROOT, request.getUri());
File file = new File(Constants.WEB_ROOT, request.getUri());
if (file.exists()) {
fis = new FileInputStream(file);
int ch = fis.read(bytes, 0, BUFFER_SIZE);
......@@ -52,4 +54,71 @@ public class Response {
public void setRequest(Request request) {
this.request = request;
}
public String getCharacterEncoding() {
return null;
}
public String getContentType() {
return null;
}
public ServletOutputStream getOutputStream() throws IOException {
return null;
}
public PrintWriter getWriter() throws IOException {
// autoflush is true, println() will flush, but print() will not
writer = new PrintWriter(output, true);
return writer;
}
public void setCharacterEncoding(String charset) {
}
public void setContentLength(int len) {
}
@Override
public void setContentLengthLong(long l) {
}
public void setContentType(String type) {
}
public void setBufferSize(int size) {
}
public int getBufferSize() {
return 0;
}
public void flushBuffer() throws IOException {
}
public void resetBuffer() {
}
public boolean isCommitted() {
return false;
}
public void reset() {
}
public void setLocale(Locale loc) {
}
public Locale getLocale() {
return null;
}
}
package com.itlong.whatsmars.tomcat.servlet;
package com.whatsmars.tomcat.servlet;
import javax.servlet.ServletOutputStream;
import javax.servlet.ServletResponse;
......
package com.whatsmars.tomcat.servlet;
import javax.servlet.Servlet;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;
import java.net.URLStreamHandler;
/**
* Created by shenhongxi on 2016/4/12.
*/
public class ServletProcessor {
public void process(Request request, Response response) {
String uri = request.getUri();
String servletName = uri.substring(uri.lastIndexOf("/") + 1);
URLClassLoader loader = null;
try {
URL[] urls = new URL[1];
URLStreamHandler streamHandler = null;
File classPath = new File(Constants.WEB_ROOT);
String repository = (new URL("file", null, classPath.getCanonicalPath()
+ File.separator)).toString();
urls[0] = new URL(null, repository, streamHandler);
loader = new URLClassLoader(urls);
} catch (IOException E) {
E.printStackTrace();
}
Class myClass = null;
try {
myClass = loader.loadClass(servletName);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Servlet servlet = null;
try {
servlet = (Servlet) myClass.newInstance();
RequestFacade requestFacade = new RequestFacade(request);
ResponseFacade responseFacade = new ResponseFacade(response);
servlet.service((ServletRequest) requestFacade, (ServletResponse) responseFacade);
} catch (Exception e) {
e.printStackTrace();
} catch (Throwable e) {
e.printStackTrace();
}
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册