0

メソッド loadDatabase() があります。メソッド自体は完璧に機能します。

別のスレッドを作成してメソッド loadDatabase() を呼び出すと、以下に示すエラーが発生します。メインスレッドでは正常に動作します。

何か案は?注:値causecode、eventid、およびdescriptionは、画面に出力したためnullではありません。

エラー

15:59:58,693 INFO  [stdout] (Thread-64) Importing EcentCauseSheet
15:59:58,694 INFO  [stdout] (Thread-64) Cause Code is 0
15:59:58,694 INFO  [stdout] (Thread-64) Event Id  4097
15:59:58,695 INFO  [stdout] (Thread-64) Description is RRC CONN SETUP-SUCCESS
15:59:58,703 ERROR [stderr] (Thread-64) Exception in thread "Thread-64" java.lang.NullPointerException
15:59:58,704 ERROR [stderr] (Thread-64)     at com.testapp.service.EntryConfig.loadDatabase(EntryConfig.java:131)
15:59:58,704 ERROR [stderr] (Thread-64)     at com.testapp.service.EntryConfig.HelloWorld(EntryConfig.java:48)
15:59:58,704 ERROR [stderr] (Thread-64)     at com.testapp.service.EntryConfig.run(EntryConfig.java:39)

クラスの Java コード

@Stateful
@LocalBean
public class EntryConfig extends Thread implements TableDao {

    @Inject
    private EntityManager em;
//.......

スレッドの Java コード

@Override
       public void run()
       {
        HelloWorld();

       }

public void HelloWorld() {

    try {
        loadDatabase();         

    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

loadDatabase() の Java コード

public void loadDatabase()
    {
        InputStream inp = null;
        System.out.println("Eureka Kind of .....");
        try {   
            inp = new FileInputStream("/home/ubuntu/Downloads/test.xls");  

        } catch (Exception ex) {
        } finally {
            try {
                wb = WorkbookFactory.create(inp);
            } catch (InvalidFormatException e) {

                e.printStackTrace();
            } catch (IOException e) {

                e.printStackTrace();
            }

            Sheet eventCauseTableSheet = wb.getSheetAt(1);

            for (int i = 1; i <= eventCauseTableSheet.getLastRowNum(); i++) {
                System.out.println("Importing EcentCauseSheet");

                row = eventCauseTableSheet.getRow(i);                                       
                int causeCode = (int)(row.getCell(0).getNumericCellValue());                                         
                int eventId = (int)(row.getCell(1).getNumericCellValue());                      
                String description = row.getCell(2).toString();

                System.out.println("Cause Code is " + causeCode);
                System.out.println("Event Id  " + eventId);             
                System.out.println("Description is " + description);

                EventCauseTable eventCauseTable = new EventCauseTable(causeCode,eventId,description);               
                em.persist(eventCauseTable);
                System.out.println("Persisted EventCauseSheet row" + (i+1));

            }

//............
4

1 に答える 1

0

ステートフル EJB でスレッドを拡張することは、コンテナによっていつでもパッシベートされる可能性があるため、通常はお勧めできません。クラスタリングと SFSB レプリケーションについても考えることができます。EJB は別のマシンにシリアライズされている可能性があり、スレッドはこれには実際には適用できません (シリアライズ可能ではありません)。

NullPointerException が em.persists(...) でスローされた場合、「em」参照がありません。ほとんどの場合、コンテナーによって管理されていない EntryConfig インスタンスに EntityManager を @Inject しようとしています。コンテナーの外でこのクラスを再利用したい場合は、EntityManager を手動で設定する必要があります (最初の部分は依然として難しいので、おそらくコンポーネント全体を再設計する必要があります)。

于 2013-03-24T19:24:14.230 に答える