項目總結:定時給微博用戶的最新微博回覆

    來到新單位才4天,跟原來的國企就是不同,各類開發都要求快速健壯,寫完需求都要跑測試用例,雖然比在國企累多了,可是天天都能學到新東西,反正年輕,不用圖找個輕鬆的工做。java

    剛來就有個小需求,寫個定時任務,天天讀取一個文件,裏面是新浪微博用戶的uid,把這些uid存到數據庫。還有個定時任務是從數據庫中取出uid,根據uid檢查用戶發出的第一條微博內容的mid,給這條微博作回覆。mysql

    需求很明瞭,一條路就順下來,沒什麼很可貴,可是實際操做就趕上不少問題。android

    首先沒有依託的項目,須要本身新建,這樣不少功能的好比數據庫映射層還要從新寫,比較麻煩。新建項目前先了解下功能,首先讀取文件確定沒問題,存到數據庫也不難,先研究獲取用戶mid和給微博評論功能。web

    先看了看微博的api::open.weibo.com。找到對應的api接口spring

    

    由於是到新單位,稍微有點着急,想趕忙弄出來,因爲我本身申請過一個新浪微博開發者帳號,有token,因此這2個須要的功能大概看了看就開始用httpclient寫對應的功能,後來問了下同事才知道有現成的weibo4j的包文件,直接調用裏面對應功能行。並且也不用token,使用cookies就行sql

        Timeline tm = new Timeline();
        JSONObject status = null;
        status = tm.getUserTimelineIdsByUid(uid);
        JSONArray statuses = null;
        statuses = (JSONArray) status.get("statuses");
        mid = statuses.get(0).toString();
數據庫

 

        Comments cm = new Comments();
        cm.client.setCookie(cookie);
apache

    第一天就光跟這個微博的接口較勁了,其實若是早點問問同事,沒準很快就能出來後端

    後面就是寫關於數據庫映射層的相關功能,以前我一直使用ibatis,這邊的項目用的jdbcTemplate,原本爲了項目的統一,我說我也用jdbcTemplate吧,各類問題啊,可能也是因爲我着急的關係,弄了一下午也沒出來,主要問題就是log日誌和我這邊的spring包有衝突,最後仍是用回去ibatis,10幾分鐘就搞定了,固然就是個簡單使用,沒有進行過封裝api

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="xxxx"/>
        <property name="username" value="xxx"/>
        <property name="password" value="xxx"/>
        <property name="initialSize" value="5"/>
        <property name="maxActive" value="10"/>
        <property name="maxIdle" value="10"/>
        <property name="minIdle" value="20"/>
    </bean> 
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <!-- 指定sqlMapConfig總配置文件,訂製的environment在spring容器中不在生效-->
        <!--<property  name="configLocation"  value="classpath:sqlMapConfig.xml"/>-->
        <!--指定實體類映射文件,能夠指定同時指定某一包以及子包下面的全部配置文件,mapperLocations和configLocation有一個便可,當須要爲實體類指定別名時,可指定configLocation屬性,再在mybatis總配置文件中採用mapper引入實體類映射文件 -->
        <property name="mapperLocations" value="classpath*:MybatisMapper/*.xml"/>
    </bean>
    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg index="0" ref="sqlSessionFactory"/>
    </bean>
    <bean id="weiboTaskDao" class="com.wrm.task.dao.impl.WeiboTaskDaoImpl">
        <!--注入SqlSessionTemplate實例 -->
        <property name="sqlSession" ref="sqlSession"/>
        <!--也可直接注入SqlSessionFactory實例,兩者都指定時,SqlSessionFactory失效 -->
        <!-- <property name="sqlSessionFactory" ref="sqlSessionFactory" />
     -->
    </bean>
public class WeiboTaskDaoImpl implements WeiboTaskDao {
    public SqlSessionTemplate sqlSession; 
    
    // 相關接口
    
    public void setSqlSession(SqlSessionTemplate sqlSession) {
        this.sqlSession = sqlSession;
    }
}

用ibatis寫了幾個接口,批量插入,讀取list,更新,每次給用戶發的微博回覆成功後會回寫數據庫標記下

次日就這麼過去了,數據庫映射應該使用我最經常使用的,反正也是新項目,結果非要是用jdbcTemplate,耽誤時間

大概功能已經完事了,後面還有不少收尾的功能,好比加上警報功能,若是出現嚴重錯誤須要發郵件,添加錯誤日誌等信息,而後就是打包運行。。。。

打包運行又是一個比較麻煩的地方,以前一直都是寫的web後端,沒有用過這種java se的項目,打成jar包運行也沒太瞭解,這邊的項目有用ant腳本作發佈的,看了一陣沒太看明白,並且那個項目沒有用spring,配置文件不多,我這邊不行啊,spring 的配置文件和ibatis的sql映射文件都不少啊,試了試ant也沒弄好,一上午又過去了

    這咋整,想了想我這邊的項目使用的maven作管理,maven應該整合了ant功能,上網搜了搜maven打jar包,有點心得

    原文地址http://blog.csdn.net/c_4818/article/details/6700950

這裏使用一個maven插件maven-shade-plugin     指定了main.class後就能打成jar包了,注意:這裏打包後,你在項目中引入的jar包如spring等,會把這些jar包解壓成class文件再統一打到你的項目裏,運行jar的時候就不用再關心外部jar包的問題了

可是這裏我仍是出現了一個很鬱悶的問題,由於weibo4j作過修改,並無傳到私服裏,致使我在項目裏只能這麼調用

    <dependency>
        <groupId>com.loopj.xxx</groupId>
        <artifactId>xxx-async-http</artifactId>
        <version>1.3.2</version>
        <type>jar</type>
        <scope>system</scope>
        <systemPath>${project.basedir}/libs/xxx-async-http-1.3.2.jar</systemPath>
    </dependency>

這麼作的結果就是打包的時候找不到這個jar文件,報錯:

 

[WARNING] Some problems were encountered while building the effective model for **apk:1.0
[WARNING] 'dependencies.dependency.systemPath' for xxx.http:xxx-async-http:jar should not point at files within the project directory, ${project.basedir}/libs/android-async-http-1.3.2.jar will be unresolvable by dependent projects @ line 36, column 2

最主要的就是這個報錯信息

jar should not point at files within the project directory

這個問題能夠看這裏:http://stackoverflow.com/questions/3642023/having-a-3rd-party-jar-included-in-maven-shaded-jar-without-adding-it-to-local-r

給出了很好的答案,大概說下就是使用mvn install:install-file 把引入的外部jar導入到本地maven倉庫中,再使用package就能打到一塊兒了

發佈第三方Jar到本地庫中: 

mvn install:install-file -DgroupId=com -DartifactId=client -Dversion=0.1.0 -Dpackaging=jar -Dfile=d:\client-0.1.0.jar 

 

總算了打成jar包了,該能運行了吧,結果仍是錯誤,一個以前沒有重視的問題,參看別的項目,關於Properties的配置是使用這樣的方式

        String dir = System.getProperty("user.dir");
        System.setProperty("log.root",dir+"/log");
        System.setProperty("conf.path",dir+"/conf");

打成jar包運行的話就很是麻煩不論是spring的配置文件application仍是properties文件都不能打到jar包裏,而是在jar包同級目錄生成conf目錄,都放在了這裏,可是我這邊不行啊,因此還得改,最好是把這些配置文件都在jar文件中訪問

原來這些Properties配置文件就不用String filePath的方式讀取了,都使用URI的方式,這樣就算這些配置打到了jar包裏也能正確訪問

    public static void init() throws IOException, URISyntaxException {
        PropertyConfigurator.configure(ClassLoader.getSystemResource("log4j.properties"));
        properties.load(ClassLoader.getSystemResourceAsStream("config.properties"));
    }

既然都是使用的maven作管理,這些config.properties都是放在resources目錄下的

 

這裏再記錄下resource的用法,就是把一些配置文件打到jar包裏

        <resources>
            <resource>
                <targetPath>conf/</targetPath>
                <filtering>false</filtering>
                <directory>${basedir}/conf</directory>
                <includes>
                    <include>**/*</include>
                </includes>
            </resource>
        </resources>

ibatis的配置剛纔也給看了<property name="mapperLocations" value="classpath*:MybatisMapper/*.xml"/>

而後就能運行了,真是不容易,這是打出來的jar包

 

像什麼net,org都是項目裏引用的jar包,都給你解壓成class了放進來了

相關文章
相關標籤/搜索